Subzero: Use 'override' as appropriate for C++11.

Not necessary for the LLVM 3.5 merge, but nice to have anyway.

BUG= https://code.google.com/p/nativeclient/issues/detail?id=3930
R=jfb@chromium.org, jvoung@chromium.org

Review URL: https://codereview.chromium.org/605123002
diff --git a/src/IceCfgNode.cpp b/src/IceCfgNode.cpp
index 4efec93..011b04d 100644
--- a/src/IceCfgNode.cpp
+++ b/src/IceCfgNode.cpp
@@ -470,11 +470,12 @@
   }
   Str << getAsmName() << ":\n";
   for (PhiList::const_iterator I = Phis.begin(), E = Phis.end(); I != E; ++I) {
-    InstPhi *Inst = *I;
-    if (Inst->isDeleted())
+    InstPhi *Phi = *I;
+    if (Phi->isDeleted())
       continue;
     // Emitting a Phi instruction should cause an error.
-    Inst->emit(Func);
+    Inst *Instr = Phi;
+    Instr->emit(Func);
   }
   for (InstList::const_iterator I = Insts.begin(), E = Insts.end(); I != E;
        ++I) {
diff --git a/src/IceInst.cpp b/src/IceInst.cpp
index 9706ce9..9602935 100644
--- a/src/IceInst.cpp
+++ b/src/IceInst.cpp
@@ -196,7 +196,7 @@
 
 InstAlloca::InstAlloca(Cfg *Func, Operand *ByteCount, uint32_t AlignInBytes,
                        Variable *Dest)
-    : Inst(Func, Inst::Alloca, 1, Dest), AlignInBytes(AlignInBytes) {
+    : InstHighLevel(Func, Inst::Alloca, 1, Dest), AlignInBytes(AlignInBytes) {
   // Verify AlignInBytes is 0 or a power of 2.
   assert(AlignInBytes == 0 || llvm::isPowerOf2_32(AlignInBytes));
   addSource(ByteCount);
@@ -204,7 +204,7 @@
 
 InstArithmetic::InstArithmetic(Cfg *Func, OpKind Op, Variable *Dest,
                                Operand *Source1, Operand *Source2)
-    : Inst(Func, Inst::Arithmetic, 2, Dest), Op(Op) {
+    : InstHighLevel(Func, Inst::Arithmetic, 2, Dest), Op(Op) {
   addSource(Source1);
   addSource(Source2);
 }
@@ -221,7 +221,7 @@
 }
 
 InstAssign::InstAssign(Cfg *Func, Variable *Dest, Operand *Source)
-    : Inst(Func, Inst::Assign, 1, Dest) {
+    : InstHighLevel(Func, Inst::Assign, 1, Dest) {
   addSource(Source);
 }
 
@@ -230,7 +230,7 @@
 // semantics, there is at most one edge from one node to another.
 InstBr::InstBr(Cfg *Func, Operand *Source, CfgNode *TargetTrue,
                CfgNode *TargetFalse)
-    : Inst(Func, Inst::Br, 1, NULL), TargetFalse(TargetFalse),
+    : InstHighLevel(Func, Inst::Br, 1, NULL), TargetFalse(TargetFalse),
       TargetTrue(TargetTrue) {
   if (TargetTrue == TargetFalse) {
     TargetTrue = NULL; // turn into unconditional version
@@ -240,7 +240,8 @@
 }
 
 InstBr::InstBr(Cfg *Func, CfgNode *Target)
-    : Inst(Func, Inst::Br, 0, NULL), TargetFalse(Target), TargetTrue(NULL) {}
+    : InstHighLevel(Func, Inst::Br, 0, NULL), TargetFalse(Target),
+      TargetTrue(NULL) {}
 
 NodeList InstBr::getTerminatorEdges() const {
   NodeList OutEdges;
@@ -251,27 +252,27 @@
 }
 
 InstCast::InstCast(Cfg *Func, OpKind CastKind, Variable *Dest, Operand *Source)
-    : Inst(Func, Inst::Cast, 1, Dest), CastKind(CastKind) {
+    : InstHighLevel(Func, Inst::Cast, 1, Dest), CastKind(CastKind) {
   addSource(Source);
 }
 
 InstExtractElement::InstExtractElement(Cfg *Func, Variable *Dest,
                                        Operand *Source1, Operand *Source2)
-    : Inst(Func, Inst::ExtractElement, 2, Dest) {
+    : InstHighLevel(Func, Inst::ExtractElement, 2, Dest) {
   addSource(Source1);
   addSource(Source2);
 }
 
 InstFcmp::InstFcmp(Cfg *Func, FCond Condition, Variable *Dest, Operand *Source1,
                    Operand *Source2)
-    : Inst(Func, Inst::Fcmp, 2, Dest), Condition(Condition) {
+    : InstHighLevel(Func, Inst::Fcmp, 2, Dest), Condition(Condition) {
   addSource(Source1);
   addSource(Source2);
 }
 
 InstIcmp::InstIcmp(Cfg *Func, ICond Condition, Variable *Dest, Operand *Source1,
                    Operand *Source2)
-    : Inst(Func, Inst::Icmp, 2, Dest), Condition(Condition) {
+    : InstHighLevel(Func, Inst::Icmp, 2, Dest), Condition(Condition) {
   addSource(Source1);
   addSource(Source2);
 }
@@ -279,19 +280,19 @@
 InstInsertElement::InstInsertElement(Cfg *Func, Variable *Dest,
                                      Operand *Source1, Operand *Source2,
                                      Operand *Source3)
-    : Inst(Func, Inst::InsertElement, 3, Dest) {
+    : InstHighLevel(Func, Inst::InsertElement, 3, Dest) {
   addSource(Source1);
   addSource(Source2);
   addSource(Source3);
 }
 
 InstLoad::InstLoad(Cfg *Func, Variable *Dest, Operand *SourceAddr)
-    : Inst(Func, Inst::Load, 1, Dest) {
+    : InstHighLevel(Func, Inst::Load, 1, Dest) {
   addSource(SourceAddr);
 }
 
 InstPhi::InstPhi(Cfg *Func, SizeT MaxSrcs, Variable *Dest)
-    : Inst(Func, Phi, MaxSrcs, Dest) {
+    : InstHighLevel(Func, Phi, MaxSrcs, Dest) {
   Labels = Func->allocateArrayOf<CfgNode *>(MaxSrcs);
 }
 
@@ -350,14 +351,14 @@
 }
 
 InstRet::InstRet(Cfg *Func, Operand *RetValue)
-    : Inst(Func, Ret, RetValue ? 1 : 0, NULL) {
+    : InstHighLevel(Func, Ret, RetValue ? 1 : 0, NULL) {
   if (RetValue)
     addSource(RetValue);
 }
 
 InstSelect::InstSelect(Cfg *Func, Variable *Dest, Operand *Condition,
                        Operand *SourceTrue, Operand *SourceFalse)
-    : Inst(Func, Inst::Select, 3, Dest) {
+    : InstHighLevel(Func, Inst::Select, 3, Dest) {
   assert(typeElementType(Condition->getType()) == IceType_i1);
   addSource(Condition);
   addSource(SourceTrue);
@@ -365,14 +366,14 @@
 }
 
 InstStore::InstStore(Cfg *Func, Operand *Data, Operand *Addr)
-    : Inst(Func, Inst::Store, 2, NULL) {
+    : InstHighLevel(Func, Inst::Store, 2, NULL) {
   addSource(Data);
   addSource(Addr);
 }
 
 InstSwitch::InstSwitch(Cfg *Func, SizeT NumCases, Operand *Source,
                        CfgNode *LabelDefault)
-    : Inst(Func, Inst::Switch, 1, NULL), LabelDefault(LabelDefault),
+    : InstHighLevel(Func, Inst::Switch, 1, NULL), LabelDefault(LabelDefault),
       NumCases(NumCases) {
   addSource(Source);
   Values = Func->allocateArrayOf<uint64_t>(NumCases);
@@ -400,24 +401,25 @@
 }
 
 InstUnreachable::InstUnreachable(Cfg *Func)
-    : Inst(Func, Inst::Unreachable, 0, NULL) {}
+    : InstHighLevel(Func, Inst::Unreachable, 0, NULL) {}
 
 InstFakeDef::InstFakeDef(Cfg *Func, Variable *Dest, Variable *Src)
-    : Inst(Func, Inst::FakeDef, Src ? 1 : 0, Dest) {
+    : InstHighLevel(Func, Inst::FakeDef, Src ? 1 : 0, Dest) {
   assert(Dest);
   if (Src)
     addSource(Src);
 }
 
 InstFakeUse::InstFakeUse(Cfg *Func, Variable *Src)
-    : Inst(Func, Inst::FakeUse, 1, NULL) {
+    : InstHighLevel(Func, Inst::FakeUse, 1, NULL) {
   assert(Src);
   addSource(Src);
 }
 
 InstFakeKill::InstFakeKill(Cfg *Func, const VarList &KilledRegs,
                            const Inst *Linked)
-    : Inst(Func, Inst::FakeKill, KilledRegs.size(), NULL), Linked(Linked) {
+    : InstHighLevel(Func, Inst::FakeKill, KilledRegs.size(), NULL),
+      Linked(Linked) {
   for (VarList::const_iterator I = KilledRegs.begin(), E = KilledRegs.end();
        I != E; ++I) {
     Variable *Var = *I;
@@ -449,12 +451,6 @@
   Str << "\n";
 }
 
-void Inst::emit(const Cfg * /*Func*/) const {
-  llvm_unreachable("emit() called on a non-lowered instruction");
-}
-
-void Inst::emitIAS(const Cfg *Func) const { emit(Func); }
-
 void Inst::dump(const Cfg *Func) const {
   Ostream &Str = Func->getContext()->getStrDump();
   dumpDest(Func);
@@ -754,6 +750,4 @@
   Inst::dump(Func);
 }
 
-void InstTarget::dumpExtras(const Cfg *Func) const { Inst::dumpExtras(Func); }
-
 } // end of namespace Ice
diff --git a/src/IceInst.h b/src/IceInst.h
index 10caa8b..5c50d2f 100644
--- a/src/IceInst.h
+++ b/src/IceInst.h
@@ -30,6 +30,10 @@
 
 namespace Ice {
 
+// Base instruction class for ICE.  Inst has two subclasses:
+// InstHighLevel and InstTarget.  High-level ICE instructions inherit
+// from InstHighLevel, and low-level (target-specific) ICE
+// instructions inherit from InstTarget.
 class Inst {
 public:
   enum InstKind {
@@ -103,8 +107,8 @@
   // result in any native instructions, and a target-specific
   // instruction results in a single native instruction.
   virtual uint32_t getEmitInstCount() const { return 0; }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
+  virtual void emit(const Cfg *Func) const = 0;
+  virtual void emitIAS(const Cfg *Func) const = 0;
   virtual void dump(const Cfg *Func) const;
   virtual void dumpExtras(const Cfg *Func) const;
   void dumpDecorated(const Cfg *Func) const;
@@ -165,10 +169,26 @@
   Inst &operator=(const Inst &) LLVM_DELETED_FUNCTION;
 };
 
+class InstHighLevel : public Inst {
+  InstHighLevel(const InstHighLevel &) LLVM_DELETED_FUNCTION;
+  InstHighLevel &operator=(const InstHighLevel &) LLVM_DELETED_FUNCTION;
+
+protected:
+  InstHighLevel(Cfg *Func, InstKind Kind, SizeT MaxSrcs, Variable *Dest)
+      : Inst(Func, Kind, MaxSrcs, Dest) {}
+  void emit(const Cfg * /*Func*/) const override {
+    llvm_unreachable("emit() called on a non-lowered instruction");
+  }
+  void emitIAS(const Cfg * /*Func*/) const override {
+    llvm_unreachable("emitIAS() called on a non-lowered instruction");
+  }
+  ~InstHighLevel() override {}
+};
+
 // Alloca instruction.  This captures the size in bytes as getSrc(0),
 // and the required alignment in bytes.  The alignment must be either
 // 0 (no alignment required) or a power of 2.
-class InstAlloca : public Inst {
+class InstAlloca : public InstHighLevel {
 public:
   static InstAlloca *create(Cfg *Func, Operand *ByteCount,
                             uint32_t AlignInBytes, Variable *Dest) {
@@ -177,7 +197,7 @@
   }
   uint32_t getAlignInBytes() const { return AlignInBytes; }
   Operand *getSizeInBytes() const { return getSrc(0); }
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Alloca; }
 
 private:
@@ -185,13 +205,13 @@
              Variable *Dest);
   InstAlloca(const InstAlloca &) LLVM_DELETED_FUNCTION;
   InstAlloca &operator=(const InstAlloca &) LLVM_DELETED_FUNCTION;
-  virtual ~InstAlloca() {}
+  ~InstAlloca() override {}
   const uint32_t AlignInBytes;
 };
 
 // Binary arithmetic instruction.  The source operands are captured in
 // getSrc(0) and getSrc(1).
-class InstArithmetic : public Inst {
+class InstArithmetic : public InstHighLevel {
 public:
   enum OpKind {
 #define X(tag, str, commutative) tag,
@@ -208,7 +228,7 @@
   OpKind getOp() const { return Op; }
   static const char *getOpName(OpKind Op);
   bool isCommutative() const;
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) {
     return Inst->getKind() == Arithmetic;
   }
@@ -218,7 +238,7 @@
                  Operand *Source2);
   InstArithmetic(const InstArithmetic &) LLVM_DELETED_FUNCTION;
   InstArithmetic &operator=(const InstArithmetic &) LLVM_DELETED_FUNCTION;
-  virtual ~InstArithmetic() {}
+  ~InstArithmetic() override {}
 
   const OpKind Op;
 };
@@ -229,26 +249,26 @@
 // lowering happens before target lowering, or for representing an
 // Inttoptr instruction, or as an intermediate step for lowering a
 // Load instruction.
-class InstAssign : public Inst {
+class InstAssign : public InstHighLevel {
 public:
   static InstAssign *create(Cfg *Func, Variable *Dest, Operand *Source) {
     return new (Func->allocateInst<InstAssign>())
         InstAssign(Func, Dest, Source);
   }
-  virtual bool isSimpleAssign() const { return true; }
-  virtual void dump(const Cfg *Func) const;
+  bool isSimpleAssign() const override { return true; }
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Assign; }
 
 private:
   InstAssign(Cfg *Func, Variable *Dest, Operand *Source);
   InstAssign(const InstAssign &) LLVM_DELETED_FUNCTION;
   InstAssign &operator=(const InstAssign &) LLVM_DELETED_FUNCTION;
-  virtual ~InstAssign() {}
+  ~InstAssign() override {}
 };
 
 // Branch instruction.  This represents both conditional and
 // unconditional branches.
-class InstBr : public Inst {
+class InstBr : public InstHighLevel {
 public:
   // Create a conditional branch.  If TargetTrue==TargetFalse, it is
   // optimized to an unconditional branch.
@@ -272,8 +292,8 @@
     assert(isUnconditional());
     return getTargetFalse();
   }
-  virtual NodeList getTerminatorEdges() const;
-  virtual void dump(const Cfg *Func) const;
+  NodeList getTerminatorEdges() const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Br; }
 
 private:
@@ -283,7 +303,7 @@
   InstBr(Cfg *Func, CfgNode *Target);
   InstBr(const InstBr &) LLVM_DELETED_FUNCTION;
   InstBr &operator=(const InstBr &) LLVM_DELETED_FUNCTION;
-  virtual ~InstBr() {}
+  ~InstBr() override {}
 
   CfgNode *const TargetFalse; // Doubles as unconditional branch target
   CfgNode *const TargetTrue;  // NULL if unconditional branch
@@ -291,7 +311,7 @@
 
 // Call instruction.  The call target is captured as getSrc(0), and
 // arg I is captured as getSrc(I+1).
-class InstCall : public Inst {
+class InstCall : public InstHighLevel {
 public:
   static InstCall *create(Cfg *Func, SizeT NumArgs, Variable *Dest,
                           Operand *CallTarget, bool HasTailCall) {
@@ -308,19 +328,18 @@
   Operand *getArg(SizeT I) const { return getSrc(I + 1); }
   SizeT getNumArgs() const { return getSrcSize() - 1; }
   bool isTailcall() const { return HasTailCall; }
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Call; }
   Type getReturnType() const;
 
 protected:
   InstCall(Cfg *Func, SizeT NumArgs, Variable *Dest, Operand *CallTarget,
            bool HasTailCall, bool HasSideEff, InstKind Kind)
-      : Inst(Func, Kind, NumArgs + 1, Dest),
-        HasTailCall(HasTailCall) {
+      : InstHighLevel(Func, Kind, NumArgs + 1, Dest), HasTailCall(HasTailCall) {
     HasSideEffects = HasSideEff;
     addSource(CallTarget);
   }
-  virtual ~InstCall() {}
+  ~InstCall() override {}
 
 private:
   bool HasTailCall;
@@ -329,7 +348,7 @@
 };
 
 // Cast instruction (a.k.a. conversion operation).
-class InstCast : public Inst {
+class InstCast : public InstHighLevel {
 public:
   enum OpKind {
 #define X(tag, str) tag,
@@ -344,19 +363,19 @@
         InstCast(Func, CastKind, Dest, Source);
   }
   OpKind getCastKind() const { return CastKind; }
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Cast; }
 
 private:
   InstCast(Cfg *Func, OpKind CastKind, Variable *Dest, Operand *Source);
   InstCast(const InstCast &) LLVM_DELETED_FUNCTION;
   InstCast &operator=(const InstCast &) LLVM_DELETED_FUNCTION;
-  virtual ~InstCast() {}
+  ~InstCast() override {}
   const OpKind CastKind;
 };
 
 // ExtractElement instruction.
-class InstExtractElement : public Inst {
+class InstExtractElement : public InstHighLevel {
 public:
   static InstExtractElement *create(Cfg *Func, Variable *Dest, Operand *Source1,
                                     Operand *Source2) {
@@ -364,7 +383,7 @@
         InstExtractElement(Func, Dest, Source1, Source2);
   }
 
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) {
     return Inst->getKind() == ExtractElement;
   }
@@ -375,12 +394,12 @@
   InstExtractElement(const InstExtractElement &) LLVM_DELETED_FUNCTION;
   InstExtractElement &
   operator=(const InstExtractElement &) LLVM_DELETED_FUNCTION;
-  virtual ~InstExtractElement() {}
+  ~InstExtractElement() override {}
 };
 
 // Floating-point comparison instruction.  The source operands are
 // captured in getSrc(0) and getSrc(1).
-class InstFcmp : public Inst {
+class InstFcmp : public InstHighLevel {
 public:
   enum FCond {
 #define X(tag, str) tag,
@@ -395,7 +414,7 @@
         InstFcmp(Func, Condition, Dest, Source1, Source2);
   }
   FCond getCondition() const { return Condition; }
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Fcmp; }
 
 private:
@@ -403,13 +422,13 @@
            Operand *Source2);
   InstFcmp(const InstFcmp &) LLVM_DELETED_FUNCTION;
   InstFcmp &operator=(const InstFcmp &) LLVM_DELETED_FUNCTION;
-  virtual ~InstFcmp() {}
+  ~InstFcmp() override {}
   const FCond Condition;
 };
 
 // Integer comparison instruction.  The source operands are captured
 // in getSrc(0) and getSrc(1).
-class InstIcmp : public Inst {
+class InstIcmp : public InstHighLevel {
 public:
   enum ICond {
 #define X(tag, str) tag,
@@ -424,7 +443,7 @@
         InstIcmp(Func, Condition, Dest, Source1, Source2);
   }
   ICond getCondition() const { return Condition; }
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Icmp; }
 
 private:
@@ -432,12 +451,12 @@
            Operand *Source2);
   InstIcmp(const InstIcmp &) LLVM_DELETED_FUNCTION;
   InstIcmp &operator=(const InstIcmp &) LLVM_DELETED_FUNCTION;
-  virtual ~InstIcmp() {}
+  ~InstIcmp() override {}
   const ICond Condition;
 };
 
 // InsertElement instruction.
-class InstInsertElement : public Inst {
+class InstInsertElement : public InstHighLevel {
 public:
   static InstInsertElement *create(Cfg *Func, Variable *Dest, Operand *Source1,
                                    Operand *Source2, Operand *Source3) {
@@ -445,7 +464,7 @@
         InstInsertElement(Func, Dest, Source1, Source2, Source3);
   }
 
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) {
     return Inst->getKind() == InsertElement;
   }
@@ -455,7 +474,7 @@
                     Operand *Source2, Operand *Source3);
   InstInsertElement(const InstInsertElement &) LLVM_DELETED_FUNCTION;
   InstInsertElement &operator=(const InstInsertElement &) LLVM_DELETED_FUNCTION;
-  virtual ~InstInsertElement() {}
+  ~InstInsertElement() override {}
 };
 
 // Call to an intrinsic function.  The call target is captured as getSrc(0),
@@ -482,12 +501,12 @@
         Info(Info) {}
   InstIntrinsicCall(const InstIntrinsicCall &) LLVM_DELETED_FUNCTION;
   InstIntrinsicCall &operator=(const InstIntrinsicCall &) LLVM_DELETED_FUNCTION;
-  virtual ~InstIntrinsicCall() {}
+  ~InstIntrinsicCall() override {}
   const Intrinsics::IntrinsicInfo Info;
 };
 
 // Load instruction.  The source address is captured in getSrc(0).
-class InstLoad : public Inst {
+class InstLoad : public InstHighLevel {
 public:
   static InstLoad *create(Cfg *Func, Variable *Dest, Operand *SourceAddr,
                           uint32_t align = 1) {
@@ -497,19 +516,19 @@
         InstLoad(Func, Dest, SourceAddr);
   }
   Operand *getSourceAddress() const { return getSrc(0); }
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Load; }
 
 private:
   InstLoad(Cfg *Func, Variable *Dest, Operand *SourceAddr);
   InstLoad(const InstLoad &) LLVM_DELETED_FUNCTION;
   InstLoad &operator=(const InstLoad &) LLVM_DELETED_FUNCTION;
-  virtual ~InstLoad() {}
+  ~InstLoad() override {}
 };
 
 // Phi instruction.  For incoming edge I, the node is Labels[I] and
 // the Phi source operand is getSrc(I).
-class InstPhi : public Inst {
+class InstPhi : public InstHighLevel {
 public:
   static InstPhi *create(Cfg *Func, SizeT MaxSrcs, Variable *Dest) {
     return new (Func->allocateInst<InstPhi>()) InstPhi(Func, MaxSrcs, Dest);
@@ -519,18 +538,18 @@
   void livenessPhiOperand(llvm::BitVector &Live, CfgNode *Target,
                           Liveness *Liveness);
   Inst *lower(Cfg *Func);
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Phi; }
 
 private:
   InstPhi(Cfg *Func, SizeT MaxSrcs, Variable *Dest);
   InstPhi(const InstPhi &) LLVM_DELETED_FUNCTION;
   InstPhi &operator=(const InstPhi &) LLVM_DELETED_FUNCTION;
-  virtual void destroy(Cfg *Func) {
+  void destroy(Cfg *Func) override {
     Func->deallocateArrayOf<CfgNode *>(Labels);
     Inst::destroy(Func);
   }
-  virtual ~InstPhi() {}
+  ~InstPhi() override {}
 
   // Labels[] duplicates the InEdges[] information in the enclosing
   // CfgNode, but the Phi instruction is created before InEdges[]
@@ -541,7 +560,7 @@
 // Ret instruction.  The return value is captured in getSrc(0), but if
 // there is no return value (void-type function), then
 // getSrcSize()==0 and hasRetValue()==false.
-class InstRet : public Inst {
+class InstRet : public InstHighLevel {
 public:
   static InstRet *create(Cfg *Func, Operand *RetValue = NULL) {
     return new (Func->allocateInst<InstRet>()) InstRet(Func, RetValue);
@@ -551,19 +570,19 @@
     assert(hasRetValue());
     return getSrc(0);
   }
-  virtual NodeList getTerminatorEdges() const { return NodeList(); }
-  virtual void dump(const Cfg *Func) const;
+  NodeList getTerminatorEdges() const override { return NodeList(); }
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Ret; }
 
 private:
   InstRet(Cfg *Func, Operand *RetValue);
   InstRet(const InstRet &) LLVM_DELETED_FUNCTION;
   InstRet &operator=(const InstRet &) LLVM_DELETED_FUNCTION;
-  virtual ~InstRet() {}
+  ~InstRet() override {}
 };
 
 // Select instruction.  The condition, true, and false operands are captured.
-class InstSelect : public Inst {
+class InstSelect : public InstHighLevel {
 public:
   static InstSelect *create(Cfg *Func, Variable *Dest, Operand *Condition,
                             Operand *SourceTrue, Operand *SourceFalse) {
@@ -573,7 +592,7 @@
   Operand *getCondition() const { return getSrc(0); }
   Operand *getTrueOperand() const { return getSrc(1); }
   Operand *getFalseOperand() const { return getSrc(2); }
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Select; }
 
 private:
@@ -581,12 +600,12 @@
              Operand *Source2);
   InstSelect(const InstSelect &) LLVM_DELETED_FUNCTION;
   InstSelect &operator=(const InstSelect &) LLVM_DELETED_FUNCTION;
-  virtual ~InstSelect() {}
+  ~InstSelect() override {}
 };
 
 // Store instruction.  The address operand is captured, along with the
 // data operand to be stored into the address.
-class InstStore : public Inst {
+class InstStore : public InstHighLevel {
 public:
   static InstStore *create(Cfg *Func, Operand *Data, Operand *Addr,
                            uint32_t align = 1) {
@@ -596,19 +615,19 @@
   }
   Operand *getAddr() const { return getSrc(1); }
   Operand *getData() const { return getSrc(0); }
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Store; }
 
 private:
   InstStore(Cfg *Func, Operand *Data, Operand *Addr);
   InstStore(const InstStore &) LLVM_DELETED_FUNCTION;
   InstStore &operator=(const InstStore &) LLVM_DELETED_FUNCTION;
-  virtual ~InstStore() {}
+  ~InstStore() override {}
 };
 
 // Switch instruction.  The single source operand is captured as
 // getSrc(0).
-class InstSwitch : public Inst {
+class InstSwitch : public InstHighLevel {
 public:
   static InstSwitch *create(Cfg *Func, SizeT NumCases, Operand *Source,
                             CfgNode *LabelDefault) {
@@ -627,20 +646,20 @@
     return Labels[I];
   }
   void addBranch(SizeT CaseIndex, uint64_t Value, CfgNode *Label);
-  virtual NodeList getTerminatorEdges() const;
-  virtual void dump(const Cfg *Func) const;
+  NodeList getTerminatorEdges() const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == Switch; }
 
 private:
   InstSwitch(Cfg *Func, SizeT NumCases, Operand *Source, CfgNode *LabelDefault);
   InstSwitch(const InstSwitch &) LLVM_DELETED_FUNCTION;
   InstSwitch &operator=(const InstSwitch &) LLVM_DELETED_FUNCTION;
-  virtual void destroy(Cfg *Func) {
+  void destroy(Cfg *Func) override {
     Func->deallocateArrayOf<uint64_t>(Values);
     Func->deallocateArrayOf<CfgNode *>(Labels);
     Inst::destroy(Func);
   }
-  virtual ~InstSwitch() {}
+  ~InstSwitch() override {}
 
   CfgNode *LabelDefault;
   SizeT NumCases;   // not including the default case
@@ -650,13 +669,13 @@
 
 // Unreachable instruction.  This is a terminator instruction with no
 // operands.
-class InstUnreachable : public Inst {
+class InstUnreachable : public InstHighLevel {
 public:
   static InstUnreachable *create(Cfg *Func) {
     return new (Func->allocateInst<InstUnreachable>()) InstUnreachable(Func);
   }
-  virtual NodeList getTerminatorEdges() const { return NodeList(); }
-  virtual void dump(const Cfg *Func) const;
+  NodeList getTerminatorEdges() const override { return NodeList(); }
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) {
     return Inst->getKind() == Unreachable;
   }
@@ -665,7 +684,7 @@
   InstUnreachable(Cfg *Func);
   InstUnreachable(const InstUnreachable &) LLVM_DELETED_FUNCTION;
   InstUnreachable &operator=(const InstUnreachable &) LLVM_DELETED_FUNCTION;
-  virtual ~InstUnreachable() {}
+  ~InstUnreachable() override {}
 };
 
 // FakeDef instruction.  This creates a fake definition of a variable,
@@ -680,20 +699,21 @@
 // dest.  Otherwise, the original instruction could be dead-code
 // eliminated if its dest operand is unused, and therefore the FakeDef
 // dest wouldn't be properly initialized.
-class InstFakeDef : public Inst {
+class InstFakeDef : public InstHighLevel {
 public:
   static InstFakeDef *create(Cfg *Func, Variable *Dest, Variable *Src = NULL) {
     return new (Func->allocateInst<InstFakeDef>()) InstFakeDef(Func, Dest, Src);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override { emit(Func); }
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == FakeDef; }
 
 private:
   InstFakeDef(Cfg *Func, Variable *Dest, Variable *Src);
   InstFakeDef(const InstFakeDef &) LLVM_DELETED_FUNCTION;
   InstFakeDef &operator=(const InstFakeDef &) LLVM_DELETED_FUNCTION;
-  virtual ~InstFakeDef() {}
+  ~InstFakeDef() override {}
 };
 
 // FakeUse instruction.  This creates a fake use of a variable, to
@@ -701,20 +721,21 @@
 // dead-code eliminated.  This is useful in a variety of lowering
 // situations.  The FakeUse instruction has no dest, so it can itself
 // never be dead-code eliminated.
-class InstFakeUse : public Inst {
+class InstFakeUse : public InstHighLevel {
 public:
   static InstFakeUse *create(Cfg *Func, Variable *Src) {
     return new (Func->allocateInst<InstFakeUse>()) InstFakeUse(Func, Src);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override { emit(Func); }
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == FakeUse; }
 
 private:
   InstFakeUse(Cfg *Func, Variable *Src);
   InstFakeUse(const InstFakeUse &) LLVM_DELETED_FUNCTION;
   InstFakeUse &operator=(const InstFakeUse &) LLVM_DELETED_FUNCTION;
-  virtual ~InstFakeUse() {}
+  ~InstFakeUse() override {}
 };
 
 // FakeKill instruction.  This "kills" a set of variables by adding a
@@ -726,7 +747,7 @@
 // The FakeKill instruction also holds a pointer to the instruction
 // that kills the set of variables, so that if that linked instruction
 // gets dead-code eliminated, the FakeKill instruction will as well.
-class InstFakeKill : public Inst {
+class InstFakeKill : public InstHighLevel {
 public:
   static InstFakeKill *create(Cfg *Func, const VarList &KilledRegs,
                               const Inst *Linked) {
@@ -734,15 +755,16 @@
         InstFakeKill(Func, KilledRegs, Linked);
   }
   const Inst *getLinked() const { return Linked; }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override { emit(Func); }
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() == FakeKill; }
 
 private:
   InstFakeKill(Cfg *Func, const VarList &KilledRegs, const Inst *Linked);
   InstFakeKill(const InstFakeKill &) LLVM_DELETED_FUNCTION;
   InstFakeKill &operator=(const InstFakeKill &) LLVM_DELETED_FUNCTION;
-  virtual ~InstFakeKill() {}
+  ~InstFakeKill() override {}
 
   // This instruction is ignored if Linked->isDeleted() is true.
   const Inst *Linked;
@@ -751,11 +773,12 @@
 // The Target instruction is the base class for all target-specific
 // instructions.
 class InstTarget : public Inst {
+  InstTarget(const InstTarget &) LLVM_DELETED_FUNCTION;
+  InstTarget &operator=(const InstTarget &) LLVM_DELETED_FUNCTION;
+
 public:
-  virtual uint32_t getEmitInstCount() const { return 1; }
-  virtual void emit(const Cfg *Func) const = 0;
-  virtual void dump(const Cfg *Func) const;
-  virtual void dumpExtras(const Cfg *Func) const;
+  uint32_t getEmitInstCount() const override { return 1; }
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return Inst->getKind() >= Target; }
 
 protected:
@@ -763,9 +786,8 @@
       : Inst(Func, Kind, MaxSrcs, Dest) {
     assert(Kind >= Target);
   }
-  InstTarget(const InstTarget &) LLVM_DELETED_FUNCTION;
-  InstTarget &operator=(const InstTarget &) LLVM_DELETED_FUNCTION;
-  virtual ~InstTarget() {}
+  void emitIAS(const Cfg *Func) const override { emit(Func); }
+  ~InstTarget() override {}
 };
 
 } // end of namespace Ice
diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h
index f7447c3..5d25dee 100644
--- a/src/IceInstX8632.h
+++ b/src/IceInstX8632.h
@@ -36,16 +36,15 @@
     kMem,
     kSplit
   };
-  virtual void emit(const Cfg *Func) const = 0;
   using Operand::dump;
-  virtual void dump(const Cfg *, Ostream &Str) const {
+  void dump(const Cfg *, Ostream &Str) const override {
     Str << "<OperandX8632>";
   }
 
 protected:
   OperandX8632(OperandKindX8632 Kind, Type Ty)
       : Operand(static_cast<OperandKind>(Kind), Ty) {}
-  virtual ~OperandX8632() {}
+  ~OperandX8632() override {}
 
 private:
   OperandX8632(const OperandX8632 &) LLVM_DELETED_FUNCTION;
@@ -77,9 +76,9 @@
   uint16_t getShift() const { return Shift; }
   SegmentRegisters getSegmentRegister() const { return SegmentReg; }
   x86::Address toAsmAddress(Assembler *Asm) const;
-  virtual void emit(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
   using OperandX8632::dump;
-  virtual void dump(const Cfg *Func, Ostream &Str) const;
+  void dump(const Cfg *Func, Ostream &Str) const override;
 
   static bool classof(const Operand *Operand) {
     return Operand->getKind() == static_cast<OperandKind>(kMem);
@@ -90,7 +89,7 @@
                   Variable *Index, uint16_t Shift, SegmentRegisters SegmentReg);
   OperandX8632Mem(const OperandX8632Mem &) LLVM_DELETED_FUNCTION;
   OperandX8632Mem &operator=(const OperandX8632Mem &) LLVM_DELETED_FUNCTION;
-  virtual ~OperandX8632Mem() {}
+  ~OperandX8632Mem() override {}
   Variable *Base;
   Constant *Offset;
   Variable *Index;
@@ -113,9 +112,9 @@
   static VariableSplit *create(Cfg *Func, Variable *Var, Portion Part) {
     return new (Func->allocate<VariableSplit>()) VariableSplit(Func, Var, Part);
   }
-  virtual void emit(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
   using OperandX8632::dump;
-  virtual void dump(const Cfg *Func, Ostream &Str) const;
+  void dump(const Cfg *Func, Ostream &Str) const override;
 
   static bool classof(const Operand *Operand) {
     return Operand->getKind() == static_cast<OperandKind>(kSplit);
@@ -131,7 +130,7 @@
   }
   VariableSplit(const VariableSplit &) LLVM_DELETED_FUNCTION;
   VariableSplit &operator=(const VariableSplit &) LLVM_DELETED_FUNCTION;
-  virtual ~VariableSplit() { Func->deallocateArrayOf<Variable *>(Vars); }
+  ~VariableSplit() override { Func->deallocateArrayOf<Variable *>(Vars); }
   Cfg *Func; // Held only for the destructor.
   Variable *Var;
   Portion Part;
@@ -253,13 +252,12 @@
   };
 
   static const char *getWidthString(Type Ty);
-  virtual void emit(const Cfg *Func) const = 0;
-  virtual void dump(const Cfg *Func) const;
+  void dump(const Cfg *Func) const override;
 
 protected:
   InstX8632(Cfg *Func, InstKindX8632 Kind, SizeT Maxsrcs, Variable *Dest)
       : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {}
-  virtual ~InstX8632() {}
+  ~InstX8632() override {}
   static bool isClassof(const Inst *Inst, InstKindX8632 MyKind) {
     return Inst->getKind() == static_cast<InstKind>(MyKind);
   }
@@ -311,16 +309,16 @@
   static InstX8632Label *create(Cfg *Func, TargetX8632 *Target) {
     return new (Func->allocate<InstX8632Label>()) InstX8632Label(Func, Target);
   }
-  virtual uint32_t getEmitInstCount() const { return 0; }
+  uint32_t getEmitInstCount() const override { return 0; }
   IceString getName(const Cfg *Func) const;
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
 
 private:
   InstX8632Label(Cfg *Func, TargetX8632 *Target);
   InstX8632Label(const InstX8632Label &) LLVM_DELETED_FUNCTION;
   InstX8632Label &operator=(const InstX8632Label &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Label() {}
+  ~InstX8632Label() override {}
   SizeT Number; // used only for unique label string generation
 };
 
@@ -363,7 +361,7 @@
   const CfgNode *getTargetTrue() const { return TargetTrue; }
   const CfgNode *getTargetFalse() const { return TargetFalse; }
   bool optimizeBranch(const CfgNode *NextNode);
-  virtual uint32_t getEmitInstCount() const {
+  uint32_t getEmitInstCount() const override {
     uint32_t Sum = 0;
     if (Label)
       ++Sum;
@@ -373,8 +371,8 @@
       ++Sum;
     return Sum;
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Br); }
 
 private:
@@ -382,7 +380,7 @@
               const InstX8632Label *Label, CondX86::BrCond Condition);
   InstX8632Br(const InstX8632Br &) LLVM_DELETED_FUNCTION;
   InstX8632Br &operator=(const InstX8632Br &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Br() {}
+  ~InstX8632Br() override {}
   CondX86::BrCond Condition;
   const CfgNode *TargetTrue;
   const CfgNode *TargetFalse;
@@ -397,9 +395,9 @@
     return new (Func->allocate<InstX8632AdjustStack>())
         InstX8632AdjustStack(Func, Amount, Esp);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Adjuststack); }
 
 private:
@@ -418,15 +416,15 @@
         InstX8632Call(Func, Dest, CallTarget);
   }
   Operand *getCallTarget() const { return getSrc(0); }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Call); }
 
 private:
   InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget);
   InstX8632Call(const InstX8632Call &) LLVM_DELETED_FUNCTION;
   InstX8632Call &operator=(const InstX8632Call &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Call() {}
+  ~InstX8632Call() override {}
 };
 
 // Emit a one-operand (GPR) instruction.
@@ -441,20 +439,20 @@
     return new (Func->allocate<InstX8632InplaceopGPR>())
         InstX8632InplaceopGPR(Func, SrcDest);
   }
-  virtual void emit(const Cfg *Func) const {
+  void emit(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrEmit();
     assert(getSrcSize() == 1);
     Str << "\t" << Opcode << "\t";
     getSrc(0)->emit(Func);
     Str << "\n";
   }
-  virtual void emitIAS(const Cfg *Func) const {
+  void emitIAS(const Cfg *Func) const override {
     assert(getSrcSize() == 1);
     const Variable *Var = getDest();
     Type Ty = Var->getType();
     emitIASVarTyGPR(Func, Ty, Var, Emitter);
   }
-  virtual void dump(const Cfg *Func) const {
+  void dump(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrDump();
     dumpDest(Func);
     Str << " = " << Opcode << "." << getDest()->getType() << " ";
@@ -470,7 +468,7 @@
   InstX8632InplaceopGPR(const InstX8632InplaceopGPR &) LLVM_DELETED_FUNCTION;
   InstX8632InplaceopGPR &
   operator=(const InstX8632InplaceopGPR &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632InplaceopGPR() {}
+  ~InstX8632InplaceopGPR() override {}
   static const char *Opcode;
   static const x86::AssemblerX86::GPREmitterOneOp Emitter;
 };
@@ -489,7 +487,7 @@
     return new (Func->allocate<InstX8632UnaryopGPR>())
         InstX8632UnaryopGPR(Func, Dest, Src);
   }
-  virtual void emit(const Cfg *Func) const {
+  void emit(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrEmit();
     assert(getSrcSize() == 1);
     Str << "\t" << Opcode << "\t";
@@ -498,14 +496,14 @@
     getSrc(0)->emit(Func);
     Str << "\n";
   }
-  virtual void emitIAS(const Cfg *Func) const {
+  void emitIAS(const Cfg *Func) const override {
     assert(getSrcSize() == 1);
     const Variable *Var = getDest();
     Type Ty = Var->getType();
     const Operand *Src = getSrc(0);
     emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter);
   }
-  virtual void dump(const Cfg *Func) const {
+  void dump(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrDump();
     dumpDest(Func);
     Str << " = " << Opcode << "." << getDest()->getType() << " ";
@@ -521,7 +519,7 @@
   InstX8632UnaryopGPR(const InstX8632UnaryopGPR &) LLVM_DELETED_FUNCTION;
   InstX8632UnaryopGPR &
   operator=(const InstX8632UnaryopGPR &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632UnaryopGPR() {}
+  ~InstX8632UnaryopGPR() override {}
   static const char *Opcode;
   static const x86::AssemblerX86::GPREmitterRegOp Emitter;
 };
@@ -537,7 +535,7 @@
     return new (Func->allocate<InstX8632UnaryopXmm>())
         InstX8632UnaryopXmm(Func, Dest, Src);
   }
-  virtual void emit(const Cfg *Func) const {
+  void emit(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrEmit();
     assert(getSrcSize() == 1);
     Str << "\t" << Opcode << "\t";
@@ -546,12 +544,12 @@
     getSrc(0)->emit(Func);
     Str << "\n";
   }
-  virtual void emitIAS(const Cfg *Func) const {
+  void emitIAS(const Cfg *Func) const override {
     Type Ty = getDest()->getType();
     assert(getSrcSize() == 1);
     emitIASVarOperandTyXMM(Func, Ty, getDest(), getSrc(0), Emitter);
   }
-  virtual void dump(const Cfg *Func) const {
+  void dump(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrDump();
     dumpDest(Func);
     Str << " = " << Opcode << "." << getDest()->getType() << " ";
@@ -567,7 +565,7 @@
   InstX8632UnaryopXmm(const InstX8632UnaryopXmm &) LLVM_DELETED_FUNCTION;
   InstX8632UnaryopXmm &
   operator=(const InstX8632UnaryopXmm &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632UnaryopXmm() {}
+  ~InstX8632UnaryopXmm() override {}
   static const char *Opcode;
   static const x86::AssemblerX86::XmmEmitterTwoOps Emitter;
 };
@@ -585,10 +583,10 @@
     return new (Func->allocate<InstX8632Binop>())
         InstX8632Binop(Func, Dest, Source);
   }
-  virtual void emit(const Cfg *Func) const {
+  void emit(const Cfg *Func) const override {
     emitTwoAddress(Opcode, this, Func, ShiftHack);
   }
-  virtual void dump(const Cfg *Func) const {
+  void dump(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrDump();
     dumpDest(Func);
     Str << " = " << Opcode << "." << getDest()->getType() << " ";
@@ -604,7 +602,7 @@
   }
   InstX8632Binop(const InstX8632Binop &) LLVM_DELETED_FUNCTION;
   InstX8632Binop &operator=(const InstX8632Binop &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Binop() {}
+  ~InstX8632Binop() override {}
   static const char *Opcode;
 };
 
@@ -616,18 +614,18 @@
     return new (Func->allocate<InstX8632BinopXmm>())
         InstX8632BinopXmm(Func, Dest, Source);
   }
-  virtual void emit(const Cfg *Func) const {
+  void emit(const Cfg *Func) const override {
     const bool ShiftHack = false;
     emitTwoAddress(Opcode, this, Func, ShiftHack);
   }
-  virtual void emitIAS(const Cfg *Func) const {
+  void emitIAS(const Cfg *Func) const override {
     Type Ty = getDest()->getType();
     if (NeedsElementType)
       Ty = typeElementType(Ty);
     assert(getSrcSize() == 2);
     emitIASVarOperandTyXMM(Func, Ty, getDest(), getSrc(1), Emitter);
   }
-  virtual void dump(const Cfg *Func) const {
+  void dump(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrDump();
     dumpDest(Func);
     Str << " = " << Opcode << "." << getDest()->getType() << " ";
@@ -643,7 +641,7 @@
   }
   InstX8632BinopXmm(const InstX8632BinopXmm &) LLVM_DELETED_FUNCTION;
   InstX8632BinopXmm &operator=(const InstX8632BinopXmm &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632BinopXmm() {}
+  ~InstX8632BinopXmm() override {}
   static const char *Opcode;
   static const x86::AssemblerX86::XmmEmitterTwoOps Emitter;
 };
@@ -656,7 +654,7 @@
     return new (Func->allocate<InstX8632Ternop>())
         InstX8632Ternop(Func, Dest, Source1, Source2);
   }
-  virtual void emit(const Cfg *Func) const {
+  void emit(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrEmit();
     assert(getSrcSize() == 3);
     Str << "\t" << Opcode << "\t";
@@ -667,7 +665,7 @@
     getSrc(2)->emit(Func);
     Str << "\n";
   }
-  virtual void dump(const Cfg *Func) const {
+  void dump(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrDump();
     dumpDest(Func);
     Str << " = " << Opcode << "." << getDest()->getType() << " ";
@@ -684,7 +682,7 @@
   }
   InstX8632Ternop(const InstX8632Ternop &) LLVM_DELETED_FUNCTION;
   InstX8632Ternop &operator=(const InstX8632Ternop &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Ternop() {}
+  ~InstX8632Ternop() override {}
   static const char *Opcode;
 };
 
@@ -697,7 +695,7 @@
     return new (Func->allocate<InstX8632ThreeAddressop>())
         InstX8632ThreeAddressop(Func, Dest, Source0, Source1);
   }
-  virtual void emit(const Cfg *Func) const {
+  void emit(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrEmit();
     assert(getSrcSize() == 2);
     Str << "\t" << Opcode << "\t";
@@ -708,7 +706,7 @@
     getSrc(1)->emit(Func);
     Str << "\n";
   }
-  virtual void dump(const Cfg *Func) const {
+  void dump(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrDump();
     dumpDest(Func);
     Str << " = " << Opcode << "." << getDest()->getType() << " ";
@@ -727,7 +725,7 @@
       LLVM_DELETED_FUNCTION;
   InstX8632ThreeAddressop &
   operator=(const InstX8632ThreeAddressop &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632ThreeAddressop() {}
+  ~InstX8632ThreeAddressop() override {}
   static const char *Opcode;
 };
 
@@ -741,12 +739,12 @@
     return new (Func->allocate<InstX8632Movlike>())
         InstX8632Movlike(Func, Dest, Source);
   }
-  virtual bool isRedundantAssign() const {
+  bool isRedundantAssign() const override {
     return checkForRedundantAssign(getDest(), getSrc(0));
   }
-  virtual bool isSimpleAssign() const { return true; }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const {
+  bool isSimpleAssign() const override { return true; }
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override {
     Ostream &Str = Func->getContext()->getStrDump();
     Str << Opcode << "." << getDest()->getType() << " ";
     dumpDest(Func);
@@ -762,7 +760,7 @@
   }
   InstX8632Movlike(const InstX8632Movlike &) LLVM_DELETED_FUNCTION;
   InstX8632Movlike &operator=(const InstX8632Movlike &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Movlike() {}
+  ~InstX8632Movlike() override {}
 
   static const char *Opcode;
 };
@@ -844,7 +842,7 @@
     // with optimizations.
     HasSideEffects = Locked;
   }
-  virtual ~InstX8632Lockable() {}
+  ~InstX8632Lockable() override {}
 
 private:
   InstX8632Lockable(const InstX8632Lockable &) LLVM_DELETED_FUNCTION;
@@ -859,15 +857,15 @@
     return new (Func->allocate<InstX8632Mul>())
         InstX8632Mul(Func, Dest, Source1, Source2);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Mul); }
 
 private:
   InstX8632Mul(Cfg *Func, Variable *Dest, Variable *Source1, Operand *Source2);
   InstX8632Mul(const InstX8632Mul &) LLVM_DELETED_FUNCTION;
   InstX8632Mul &operator=(const InstX8632Mul &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Mul() {}
+  ~InstX8632Mul() override {}
 };
 
 // Shld instruction - shift across a pair of operands.  TODO: Verify
@@ -879,8 +877,8 @@
     return new (Func->allocate<InstX8632Shld>())
         InstX8632Shld(Func, Dest, Source1, Source2);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Shld); }
 
 private:
@@ -888,7 +886,7 @@
                 Variable *Source2);
   InstX8632Shld(const InstX8632Shld &) LLVM_DELETED_FUNCTION;
   InstX8632Shld &operator=(const InstX8632Shld &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Shld() {}
+  ~InstX8632Shld() override {}
 };
 
 // Shrd instruction - shift across a pair of operands.  TODO: Verify
@@ -900,8 +898,8 @@
     return new (Func->allocate<InstX8632Shrd>())
         InstX8632Shrd(Func, Dest, Source1, Source2);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Shrd); }
 
 private:
@@ -909,7 +907,7 @@
                 Variable *Source2);
   InstX8632Shrd(const InstX8632Shrd &) LLVM_DELETED_FUNCTION;
   InstX8632Shrd &operator=(const InstX8632Shrd &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Shrd() {}
+  ~InstX8632Shrd() override {}
 };
 
 // Conditional move instruction.
@@ -920,9 +918,9 @@
     return new (Func->allocate<InstX8632Cmov>())
         InstX8632Cmov(Func, Dest, Source, Cond);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Cmov); }
 
 private:
@@ -930,7 +928,7 @@
                 CondX86::BrCond Cond);
   InstX8632Cmov(const InstX8632Cmov &) LLVM_DELETED_FUNCTION;
   InstX8632Cmov &operator=(const InstX8632Cmov &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Cmov() {}
+  ~InstX8632Cmov() override {}
 
   CondX86::BrCond Condition;
 };
@@ -944,9 +942,9 @@
     return new (Func->allocate<InstX8632Cmpps>())
         InstX8632Cmpps(Func, Dest, Source, Condition);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Cmpps); }
 
 private:
@@ -954,7 +952,7 @@
                  CondX86::CmppsCond Cond);
   InstX8632Cmpps(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION;
   InstX8632Cmpps &operator=(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Cmpps() {}
+  ~InstX8632Cmpps() override {}
 
   CondX86::CmppsCond Condition;
 };
@@ -971,9 +969,9 @@
     return new (Func->allocate<InstX8632Cmpxchg>())
         InstX8632Cmpxchg(Func, DestOrAddr, Eax, Desired, Locked);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Cmpxchg); }
 
 private:
@@ -981,7 +979,7 @@
                    Variable *Desired, bool Locked);
   InstX8632Cmpxchg(const InstX8632Cmpxchg &) LLVM_DELETED_FUNCTION;
   InstX8632Cmpxchg &operator=(const InstX8632Cmpxchg &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Cmpxchg() {}
+  ~InstX8632Cmpxchg() override {}
 };
 
 // Cmpxchg8b instruction - cmpxchg8b <m64> will compare if <m64>
@@ -998,9 +996,9 @@
     return new (Func->allocate<InstX8632Cmpxchg8b>())
         InstX8632Cmpxchg8b(Func, Dest, Edx, Eax, Ecx, Ebx, Locked);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Cmpxchg8b); }
 
 private:
@@ -1009,7 +1007,7 @@
   InstX8632Cmpxchg8b(const InstX8632Cmpxchg8b &) LLVM_DELETED_FUNCTION;
   InstX8632Cmpxchg8b &
   operator=(const InstX8632Cmpxchg8b &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Cmpxchg8b() {}
+  ~InstX8632Cmpxchg8b() override {}
 };
 
 // Cvt instruction - wrapper for cvtsX2sY where X and Y are in {s,d,i}
@@ -1023,8 +1021,8 @@
     return new (Func->allocate<InstX8632Cvt>())
         InstX8632Cvt(Func, Dest, Source, Trunc);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Cvt); }
 
 private:
@@ -1032,7 +1030,7 @@
   InstX8632Cvt(Cfg *Func, Variable *Dest, Operand *Source, bool Trunc);
   InstX8632Cvt(const InstX8632Cvt &) LLVM_DELETED_FUNCTION;
   InstX8632Cvt &operator=(const InstX8632Cvt &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Cvt() {}
+  ~InstX8632Cvt() override {}
 };
 
 // cmp - Integer compare instruction.
@@ -1042,15 +1040,15 @@
     return new (Func->allocate<InstX8632Icmp>())
         InstX8632Icmp(Func, Src1, Src2);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Icmp); }
 
 private:
   InstX8632Icmp(Cfg *Func, Operand *Src1, Operand *Src2);
   InstX8632Icmp(const InstX8632Icmp &) LLVM_DELETED_FUNCTION;
   InstX8632Icmp &operator=(const InstX8632Icmp &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Icmp() {}
+  ~InstX8632Icmp() override {}
 };
 
 // ucomiss/ucomisd - floating-point compare instruction.
@@ -1060,16 +1058,16 @@
     return new (Func->allocate<InstX8632Ucomiss>())
         InstX8632Ucomiss(Func, Src1, Src2);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Ucomiss); }
 
 private:
   InstX8632Ucomiss(Cfg *Func, Operand *Src1, Operand *Src2);
   InstX8632Ucomiss(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION;
   InstX8632Ucomiss &operator=(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Ucomiss() {}
+  ~InstX8632Ucomiss() override {}
 };
 
 // UD2 instruction.
@@ -1078,15 +1076,15 @@
   static InstX8632UD2 *create(Cfg *Func) {
     return new (Func->allocate<InstX8632UD2>()) InstX8632UD2(Func);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, UD2); }
 
 private:
   InstX8632UD2(Cfg *Func);
   InstX8632UD2(const InstX8632UD2 &) LLVM_DELETED_FUNCTION;
   InstX8632UD2 &operator=(const InstX8632UD2 &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632UD2() {}
+  ~InstX8632UD2() override {}
 };
 
 // Test instruction.
@@ -1096,15 +1094,15 @@
     return new (Func->allocate<InstX8632Test>())
         InstX8632Test(Func, Source1, Source2);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Test); }
 
 private:
   InstX8632Test(Cfg *Func, Operand *Source1, Operand *Source2);
   InstX8632Test(const InstX8632Test &) LLVM_DELETED_FUNCTION;
   InstX8632Test &operator=(const InstX8632Test &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Test() {}
+  ~InstX8632Test() override {}
 };
 
 // Mfence instruction.
@@ -1113,15 +1111,15 @@
   static InstX8632Mfence *create(Cfg *Func) {
     return new (Func->allocate<InstX8632Mfence>()) InstX8632Mfence(Func);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Mfence); }
 
 private:
   InstX8632Mfence(Cfg *Func);
   InstX8632Mfence(const InstX8632Mfence &) LLVM_DELETED_FUNCTION;
   InstX8632Mfence &operator=(const InstX8632Mfence &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Mfence() {}
+  ~InstX8632Mfence() override {}
 };
 
 // This is essentially a "mov" instruction with an OperandX8632Mem
@@ -1133,15 +1131,15 @@
     return new (Func->allocate<InstX8632Store>())
         InstX8632Store(Func, Value, Mem);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Store); }
 
 private:
   InstX8632Store(Cfg *Func, Operand *Value, OperandX8632 *Mem);
   InstX8632Store(const InstX8632Store &) LLVM_DELETED_FUNCTION;
   InstX8632Store &operator=(const InstX8632Store &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Store() {}
+  ~InstX8632Store() override {}
 };
 
 class InstX8632StoreP : public InstX8632 {
@@ -1150,15 +1148,15 @@
     return new (Func->allocate<InstX8632StoreP>())
         InstX8632StoreP(Func, Value, Mem);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, StoreP); }
 
 private:
   InstX8632StoreP(Cfg *Func, Operand *Value, OperandX8632 *Mem);
   InstX8632StoreP(const InstX8632StoreP &) LLVM_DELETED_FUNCTION;
   InstX8632StoreP &operator=(const InstX8632StoreP &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632StoreP() {}
+  ~InstX8632StoreP() override {}
 };
 
 // This is essentially a "movq" instruction with an OperandX8632Mem
@@ -1170,15 +1168,15 @@
     return new (Func->allocate<InstX8632StoreQ>())
         InstX8632StoreQ(Func, Value, Mem);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, StoreQ); }
 
 private:
   InstX8632StoreQ(Cfg *Func, Operand *Value, OperandX8632 *Mem);
   InstX8632StoreQ(const InstX8632StoreQ &) LLVM_DELETED_FUNCTION;
   InstX8632StoreQ &operator=(const InstX8632StoreQ &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632StoreQ() {}
+  ~InstX8632StoreQ() override {}
 };
 
 // Movsx - copy from a narrower integer type to a wider integer
@@ -1189,15 +1187,15 @@
     return new (Func->allocate<InstX8632Movsx>())
         InstX8632Movsx(Func, Dest, Source);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Movsx); }
 
 private:
   InstX8632Movsx(Cfg *Func, Variable *Dest, Operand *Source);
   InstX8632Movsx(const InstX8632Movsx &) LLVM_DELETED_FUNCTION;
   InstX8632Movsx &operator=(const InstX8632Movsx &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Movsx() {}
+  ~InstX8632Movsx() override {}
 };
 
 // Movzx - copy from a narrower integer type to a wider integer
@@ -1208,15 +1206,15 @@
     return new (Func->allocate<InstX8632Movzx>())
         InstX8632Movzx(Func, Dest, Source);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Movzx); }
 
 private:
   InstX8632Movzx(Cfg *Func, Variable *Dest, Operand *Source);
   InstX8632Movzx(const InstX8632Movzx &) LLVM_DELETED_FUNCTION;
   InstX8632Movzx &operator=(const InstX8632Movzx &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Movzx() {}
+  ~InstX8632Movzx() override {}
 };
 
 // Nop instructions of varying length
@@ -1228,16 +1226,16 @@
   static InstX8632Nop *create(Cfg *Func, NopVariant Variant) {
     return new (Func->allocate<InstX8632Nop>()) InstX8632Nop(Func, Variant);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Nop); }
 
 private:
   InstX8632Nop(Cfg *Func, SizeT Length);
   InstX8632Nop(const InstX8632Nop &) LLVM_DELETED_FUNCTION;
   InstX8632Nop &operator=(const InstX8632Nop &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Nop() {}
+  ~InstX8632Nop() override {}
 
   NopVariant Variant;
 };
@@ -1248,15 +1246,15 @@
   static InstX8632Fld *create(Cfg *Func, Operand *Src) {
     return new (Func->allocate<InstX8632Fld>()) InstX8632Fld(Func, Src);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Fld); }
 
 private:
   InstX8632Fld(Cfg *Func, Operand *Src);
   InstX8632Fld(const InstX8632Fld &) LLVM_DELETED_FUNCTION;
   InstX8632Fld &operator=(const InstX8632Fld &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Fld() {}
+  ~InstX8632Fld() override {}
 };
 
 // Fstp - store x87 st(0) into memory and pop st(0).
@@ -1265,15 +1263,15 @@
   static InstX8632Fstp *create(Cfg *Func, Variable *Dest) {
     return new (Func->allocate<InstX8632Fstp>()) InstX8632Fstp(Func, Dest);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Fstp); }
 
 private:
   InstX8632Fstp(Cfg *Func, Variable *Dest);
   InstX8632Fstp(const InstX8632Fstp &) LLVM_DELETED_FUNCTION;
   InstX8632Fstp &operator=(const InstX8632Fstp &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Fstp() {}
+  ~InstX8632Fstp() override {}
 };
 
 class InstX8632Pop : public InstX8632 {
@@ -1281,16 +1279,16 @@
   static InstX8632Pop *create(Cfg *Func, Variable *Dest) {
     return new (Func->allocate<InstX8632Pop>()) InstX8632Pop(Func, Dest);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Pop); }
 
 private:
   InstX8632Pop(Cfg *Func, Variable *Dest);
   InstX8632Pop(const InstX8632Pop &) LLVM_DELETED_FUNCTION;
   InstX8632Pop &operator=(const InstX8632Pop &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Pop() {}
+  ~InstX8632Pop() override {}
 };
 
 class InstX8632Push : public InstX8632 {
@@ -1300,8 +1298,8 @@
     return new (Func->allocate<InstX8632Push>())
         InstX8632Push(Func, Source, SuppressStackAdjustment);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Push); }
 
 private:
@@ -1309,7 +1307,7 @@
   InstX8632Push(const InstX8632Push &) LLVM_DELETED_FUNCTION;
   InstX8632Push &operator=(const InstX8632Push &) LLVM_DELETED_FUNCTION;
   bool SuppressStackAdjustment;
-  virtual ~InstX8632Push() {}
+  ~InstX8632Push() override {}
 };
 
 // Ret instruction.  Currently only supports the "ret" version that
@@ -1321,16 +1319,16 @@
   static InstX8632Ret *create(Cfg *Func, Variable *Source = NULL) {
     return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); }
 
 private:
   InstX8632Ret(Cfg *Func, Variable *Source);
   InstX8632Ret(const InstX8632Ret &) LLVM_DELETED_FUNCTION;
   InstX8632Ret &operator=(const InstX8632Ret &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Ret() {}
+  ~InstX8632Ret() override {}
 };
 
 // Exchanging Add instruction.  Exchanges the first operand (destination
@@ -1347,16 +1345,16 @@
     return new (Func->allocate<InstX8632Xadd>())
         InstX8632Xadd(Func, Dest, Source, Locked);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Xadd); }
 
 private:
   InstX8632Xadd(Cfg *Func, Operand *Dest, Variable *Source, bool Locked);
   InstX8632Xadd(const InstX8632Xadd &) LLVM_DELETED_FUNCTION;
   InstX8632Xadd &operator=(const InstX8632Xadd &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Xadd() {}
+  ~InstX8632Xadd() override {}
 };
 
 // Exchange instruction.  Exchanges the first operand (destination
@@ -1371,16 +1369,16 @@
     return new (Func->allocate<InstX8632Xchg>())
         InstX8632Xchg(Func, Dest, Source);
   }
-  virtual void emit(const Cfg *Func) const;
-  virtual void emitIAS(const Cfg *Func) const;
-  virtual void dump(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
+  void emitIAS(const Cfg *Func) const override;
+  void dump(const Cfg *Func) const override;
   static bool classof(const Inst *Inst) { return isClassof(Inst, Xchg); }
 
 private:
   InstX8632Xchg(Cfg *Func, Operand *Dest, Variable *Source);
   InstX8632Xchg(const InstX8632Xchg &) LLVM_DELETED_FUNCTION;
   InstX8632Xchg &operator=(const InstX8632Xchg &) LLVM_DELETED_FUNCTION;
-  virtual ~InstX8632Xchg() {}
+  ~InstX8632Xchg() override {}
 };
 
 // Declare partial template specializations of emit() methods that
diff --git a/src/IceOperand.h b/src/IceOperand.h
index f233bec..c0f699f 100644
--- a/src/IceOperand.h
+++ b/src/IceOperand.h
@@ -102,9 +102,9 @@
 public:
   uint32_t getPoolEntryID() const { return PoolEntryID; }
   using Operand::dump;
-  virtual void emit(const Cfg *Func) const { emit(Func->getContext()); }
+  void emit(const Cfg *Func) const override { emit(Func->getContext()); }
   virtual void emit(GlobalContext *Ctx) const = 0;
-  virtual void dump(const Cfg *Func, Ostream &Str) const = 0;
+  void dump(const Cfg *Func, Ostream &Str) const = 0;
 
   static bool classof(const Operand *Operand) {
     OperandKind Kind = Operand->getKind();
@@ -117,7 +117,7 @@
     Vars = NULL;
     NumVars = 0;
   }
-  virtual ~Constant() {}
+  ~Constant() override {}
   // PoolEntryID is an integer that uniquely identifies the constant
   // within its constant pool.  It is used for building the constant
   // pool in the object code and for referencing its entries.
@@ -141,9 +141,9 @@
   using Constant::emit;
   // The target needs to implement this for each ConstantPrimitive
   // specialization.
-  virtual void emit(GlobalContext *Ctx) const;
+  void emit(GlobalContext *Ctx) const override;
   using Constant::dump;
-  virtual void dump(const Cfg *, Ostream &Str) const { Str << getValue(); }
+  void dump(const Cfg *, Ostream &Str) const override { Str << getValue(); }
 
   static bool classof(const Operand *Operand) {
     return Operand->getKind() == K;
@@ -154,7 +154,7 @@
       : Constant(K, Ty, PoolEntryID), Value(Value) {}
   ConstantPrimitive(const ConstantPrimitive &) LLVM_DELETED_FUNCTION;
   ConstantPrimitive &operator=(const ConstantPrimitive &) LLVM_DELETED_FUNCTION;
-  virtual ~ConstantPrimitive() {}
+  ~ConstantPrimitive() override {}
   const T Value;
 };
 
@@ -213,8 +213,8 @@
   bool getSuppressMangling() const { return SuppressMangling; }
   using Constant::emit;
   using Constant::dump;
-  virtual void emit(GlobalContext *Ctx) const;
-  virtual void dump(const Cfg *Func, Ostream &Str) const;
+  void emit(GlobalContext *Ctx) const override;
+  void dump(const Cfg *Func, Ostream &Str) const override;
 
   static bool classof(const Operand *Operand) {
     OperandKind Kind = Operand->getKind();
@@ -229,7 +229,7 @@
   ConstantRelocatable(const ConstantRelocatable &) LLVM_DELETED_FUNCTION;
   ConstantRelocatable &
   operator=(const ConstantRelocatable &) LLVM_DELETED_FUNCTION;
-  virtual ~ConstantRelocatable() {}
+  ~ConstantRelocatable() override {}
   const int64_t Offset; // fixed offset to add
   const IceString Name; // optional for debug/dump
   bool SuppressMangling;
@@ -248,8 +248,8 @@
   using Constant::emit;
   using Constant::dump;
   // The target needs to implement this.
-  virtual void emit(GlobalContext *Ctx) const;
-  virtual void dump(const Cfg *, Ostream &Str) const { Str << "undef"; }
+  void emit(GlobalContext *Ctx) const override;
+  void dump(const Cfg *, Ostream &Str) const override { Str << "undef"; }
 
   static bool classof(const Operand *Operand) {
     return Operand->getKind() == kConstUndef;
@@ -260,7 +260,7 @@
       : Constant(kConstUndef, Ty, PoolEntryID) {}
   ConstantUndef(const ConstantUndef &) LLVM_DELETED_FUNCTION;
   ConstantUndef &operator=(const ConstantUndef &) LLVM_DELETED_FUNCTION;
-  virtual ~ConstantUndef() {}
+  ~ConstantUndef() override {}
 };
 
 // RegWeight is a wrapper for a uint32_t weight value, with a
@@ -415,9 +415,9 @@
   // VarsReal.
   Variable asType(Type Ty);
 
-  virtual void emit(const Cfg *Func) const;
+  void emit(const Cfg *Func) const override;
   using Operand::dump;
-  virtual void dump(const Cfg *Func, Ostream &Str) const;
+  void dump(const Cfg *Func, Ostream &Str) const override;
 
   static bool classof(const Operand *Operand) {
     OperandKind Kind = Operand->getKind();
@@ -425,7 +425,7 @@
   }
 
   // The destructor is public because of the asType() method.
-  virtual ~Variable() {}
+  ~Variable() override {}
 
 protected:
   Variable(OperandKind K, Type Ty, SizeT Index, const IceString &Name)
diff --git a/src/IceTargetLoweringX8632.h b/src/IceTargetLoweringX8632.h
index 6fe41cd..1533ae3 100644
--- a/src/IceTargetLoweringX8632.h
+++ b/src/IceTargetLoweringX8632.h
@@ -28,36 +28,36 @@
 public:
   static TargetX8632 *create(Cfg *Func) { return new TargetX8632(Func); }
 
-  virtual void translateOm1();
-  virtual void translateO2();
-  virtual bool doBranchOpt(Inst *I, const CfgNode *NextNode);
+  void translateOm1() override;
+  void translateO2() override;
+  bool doBranchOpt(Inst *I, const CfgNode *NextNode) override;
 
-  virtual Variable *getPhysicalRegister(SizeT RegNum);
-  virtual IceString getRegName(SizeT RegNum, Type Ty) const;
-  virtual llvm::SmallBitVector getRegisterSet(RegSetMask Include,
-                                              RegSetMask Exclude) const;
-  virtual const llvm::SmallBitVector &getRegisterSetForType(Type Ty) const {
+  Variable *getPhysicalRegister(SizeT RegNum) override;
+  IceString getRegName(SizeT RegNum, Type Ty) const override;
+  llvm::SmallBitVector getRegisterSet(RegSetMask Include,
+                                      RegSetMask Exclude) const override;
+  const llvm::SmallBitVector &getRegisterSetForType(Type Ty) const override {
     return TypeToRegisterSet[Ty];
   }
-  virtual bool hasFramePointer() const { return IsEbpBasedFrame; }
-  virtual SizeT getFrameOrStackReg() const {
+  bool hasFramePointer() const override { return IsEbpBasedFrame; }
+  SizeT getFrameOrStackReg() const override {
     return IsEbpBasedFrame ? RegX8632::Reg_ebp : RegX8632::Reg_esp;
   }
-  virtual size_t typeWidthInBytesOnStack(Type Ty) const {
+  size_t typeWidthInBytesOnStack(Type Ty) const override {
     // Round up to the next multiple of 4 bytes.  In particular, i1,
     // i8, and i16 are rounded up to 4 bytes.
     return (typeWidthInBytes(Ty) + 3) & ~3;
   }
-  virtual SizeT getBundleAlignLog2Bytes() const { return 5; }
-  virtual llvm::ArrayRef<uint8_t> getNonExecBundlePadding() const {
+  SizeT getBundleAlignLog2Bytes() const override { return 5; }
+  llvm::ArrayRef<uint8_t> getNonExecBundlePadding() const override {
     static const uint8_t Padding[] = { 0xF4 };
     return llvm::ArrayRef<uint8_t>(Padding, 1);
   }
-  virtual void emitVariable(const Variable *Var) const;
-  virtual void lowerArguments();
-  virtual void addProlog(CfgNode *Node);
-  virtual void addEpilog(CfgNode *Node);
-  virtual void emitConstants() const;
+  void emitVariable(const Variable *Var) const override;
+  void lowerArguments() override;
+  void addProlog(CfgNode *Node) override;
+  void addEpilog(CfgNode *Node) override;
+  void emitConstants() const override;
   SizeT makeNextLabelNumber() { return NextLabelNumber++; }
   // Ensure that a 64-bit Variable has been split into 2 32-bit
   // Variables, creating them if necessary.  This is needed for all
@@ -82,29 +82,29 @@
 protected:
   TargetX8632(Cfg *Func);
 
-  virtual void postLower();
+  void postLower() override;
 
-  virtual void lowerAlloca(const InstAlloca *Inst);
-  virtual void lowerArithmetic(const InstArithmetic *Inst);
-  virtual void lowerAssign(const InstAssign *Inst);
-  virtual void lowerBr(const InstBr *Inst);
-  virtual void lowerCall(const InstCall *Inst);
-  virtual void lowerCast(const InstCast *Inst);
-  virtual void lowerExtractElement(const InstExtractElement *Inst);
-  virtual void lowerFcmp(const InstFcmp *Inst);
-  virtual void lowerIcmp(const InstIcmp *Inst);
-  virtual void lowerIntrinsicCall(const InstIntrinsicCall *Inst);
-  virtual void lowerInsertElement(const InstInsertElement *Inst);
-  virtual void lowerLoad(const InstLoad *Inst);
-  virtual void lowerPhi(const InstPhi *Inst);
-  virtual void lowerRet(const InstRet *Inst);
-  virtual void lowerSelect(const InstSelect *Inst);
-  virtual void lowerStore(const InstStore *Inst);
-  virtual void lowerSwitch(const InstSwitch *Inst);
-  virtual void lowerUnreachable(const InstUnreachable *Inst);
-  virtual void doAddressOptLoad();
-  virtual void doAddressOptStore();
-  virtual void randomlyInsertNop(float Probability);
+  void lowerAlloca(const InstAlloca *Inst) override;
+  void lowerArithmetic(const InstArithmetic *Inst) override;
+  void lowerAssign(const InstAssign *Inst) override;
+  void lowerBr(const InstBr *Inst) override;
+  void lowerCall(const InstCall *Inst) override;
+  void lowerCast(const InstCast *Inst) override;
+  void lowerExtractElement(const InstExtractElement *Inst) override;
+  void lowerFcmp(const InstFcmp *Inst) override;
+  void lowerIcmp(const InstIcmp *Inst) override;
+  void lowerIntrinsicCall(const InstIntrinsicCall *Inst) override;
+  void lowerInsertElement(const InstInsertElement *Inst) override;
+  void lowerLoad(const InstLoad *Inst) override;
+  void lowerPhi(const InstPhi *Inst) override;
+  void lowerRet(const InstRet *Inst) override;
+  void lowerSelect(const InstSelect *Inst) override;
+  void lowerStore(const InstStore *Inst) override;
+  void lowerSwitch(const InstSwitch *Inst) override;
+  void lowerUnreachable(const InstUnreachable *Inst) override;
+  void doAddressOptLoad() override;
+  void doAddressOptStore() override;
+  void randomlyInsertNop(float Probability) override;
 
   // Naive lowering of cmpxchg.
   void lowerAtomicCmpxchg(Variable *DestPrev, Operand *Ptr, Operand *Expected,
@@ -477,7 +477,7 @@
 private:
   TargetX8632(const TargetX8632 &) LLVM_DELETED_FUNCTION;
   TargetX8632 &operator=(const TargetX8632 &) LLVM_DELETED_FUNCTION;
-  virtual ~TargetX8632() {}
+  ~TargetX8632() override {}
   template <typename T> void emitConstantPool() const;
 };
 
@@ -486,9 +486,9 @@
   static TargetGlobalInitLowering *create(GlobalContext *Ctx) {
     return new TargetGlobalInitX8632(Ctx);
   }
-  virtual void lower(const IceString &Name, SizeT Align, bool IsInternal,
-                     bool IsConst, bool IsZeroInitializer, SizeT Size,
-                     const char *Data, bool DisableTranslation);
+  void lower(const IceString &Name, SizeT Align, bool IsInternal, bool IsConst,
+             bool IsZeroInitializer, SizeT Size, const char *Data,
+             bool DisableTranslation) override;
 
 protected:
   TargetGlobalInitX8632(GlobalContext *Ctx);
@@ -497,7 +497,7 @@
   TargetGlobalInitX8632(const TargetGlobalInitX8632 &) LLVM_DELETED_FUNCTION;
   TargetGlobalInitX8632 &
   operator=(const TargetGlobalInitX8632 &) LLVM_DELETED_FUNCTION;
-  virtual ~TargetGlobalInitX8632() {}
+  ~TargetGlobalInitX8632() override {}
 };
 
 template <> void ConstantInteger32::emit(GlobalContext *Ctx) const;