| Index: src/IceInst.h
|
| diff --git a/src/IceInst.h b/src/IceInst.h
|
| index c3aa7c30ad84ea33ff5a38b182b39bc50c86ae37..c34e6c98ab166337adf1ae67b9ed1149743cac94 100644
|
| --- a/src/IceInst.h
|
| +++ b/src/IceInst.h
|
| @@ -35,6 +35,9 @@ namespace Ice {
|
| // from InstHighLevel, and low-level (target-specific) ICE
|
| // instructions inherit from InstTarget.
|
| class Inst {
|
| + Inst(const Inst &) = delete;
|
| + Inst &operator=(const Inst &) = delete;
|
| +
|
| public:
|
| enum InstKind {
|
| // Arbitrary (alphabetical) order, except put Unreachable first.
|
| @@ -169,10 +172,6 @@ protected:
|
| // tracked this way.
|
| typedef uint32_t LREndedBits; // only first 32 src operands tracked, sorry
|
| LREndedBits LiveRangesEnded;
|
| -
|
| -private:
|
| - Inst(const Inst &) = delete;
|
| - Inst &operator=(const Inst &) = delete;
|
| };
|
|
|
| class InstHighLevel : public Inst {
|
| @@ -195,6 +194,9 @@ protected:
|
| // and the required alignment in bytes. The alignment must be either
|
| // 0 (no alignment required) or a power of 2.
|
| class InstAlloca : public InstHighLevel {
|
| + InstAlloca(const InstAlloca &) = delete;
|
| + InstAlloca &operator=(const InstAlloca &) = delete;
|
| +
|
| public:
|
| static InstAlloca *create(Cfg *Func, Operand *ByteCount,
|
| uint32_t AlignInBytes, Variable *Dest) {
|
| @@ -209,8 +211,6 @@ public:
|
| private:
|
| InstAlloca(Cfg *Func, Operand *ByteCount, uint32_t AlignInBytes,
|
| Variable *Dest);
|
| - InstAlloca(const InstAlloca &) = delete;
|
| - InstAlloca &operator=(const InstAlloca &) = delete;
|
| ~InstAlloca() override {}
|
| const uint32_t AlignInBytes;
|
| };
|
| @@ -218,6 +218,9 @@ private:
|
| // Binary arithmetic instruction. The source operands are captured in
|
| // getSrc(0) and getSrc(1).
|
| class InstArithmetic : public InstHighLevel {
|
| + InstArithmetic(const InstArithmetic &) = delete;
|
| + InstArithmetic &operator=(const InstArithmetic &) = delete;
|
| +
|
| public:
|
| enum OpKind {
|
| #define X(tag, str, commutative) tag,
|
| @@ -242,8 +245,6 @@ public:
|
| private:
|
| InstArithmetic(Cfg *Func, OpKind Op, Variable *Dest, Operand *Source1,
|
| Operand *Source2);
|
| - InstArithmetic(const InstArithmetic &) = delete;
|
| - InstArithmetic &operator=(const InstArithmetic &) = delete;
|
| ~InstArithmetic() override {}
|
|
|
| const OpKind Op;
|
| @@ -256,6 +257,9 @@ private:
|
| // Inttoptr instruction, or as an intermediate step for lowering a
|
| // Load instruction.
|
| class InstAssign : public InstHighLevel {
|
| + InstAssign(const InstAssign &) = delete;
|
| + InstAssign &operator=(const InstAssign &) = delete;
|
| +
|
| public:
|
| static InstAssign *create(Cfg *Func, Variable *Dest, Operand *Source) {
|
| return new (Func->allocateInst<InstAssign>())
|
| @@ -267,14 +271,15 @@ public:
|
|
|
| private:
|
| InstAssign(Cfg *Func, Variable *Dest, Operand *Source);
|
| - InstAssign(const InstAssign &) = delete;
|
| - InstAssign &operator=(const InstAssign &) = delete;
|
| ~InstAssign() override {}
|
| };
|
|
|
| // Branch instruction. This represents both conditional and
|
| // unconditional branches.
|
| class InstBr : public InstHighLevel {
|
| + InstBr(const InstBr &) = delete;
|
| + InstBr &operator=(const InstBr &) = delete;
|
| +
|
| public:
|
| // Create a conditional branch. If TargetTrue==TargetFalse, it is
|
| // optimized to an unconditional branch.
|
| @@ -307,8 +312,6 @@ private:
|
| InstBr(Cfg *Func, Operand *Source, CfgNode *TargetTrue, CfgNode *TargetFalse);
|
| // Unconditional branch
|
| InstBr(Cfg *Func, CfgNode *Target);
|
| - InstBr(const InstBr &) = delete;
|
| - InstBr &operator=(const InstBr &) = delete;
|
| ~InstBr() override {}
|
|
|
| CfgNode *const TargetFalse; // Doubles as unconditional branch target
|
| @@ -318,6 +321,9 @@ private:
|
| // Call instruction. The call target is captured as getSrc(0), and
|
| // arg I is captured as getSrc(I+1).
|
| class InstCall : public InstHighLevel {
|
| + InstCall(const InstCall &) = delete;
|
| + InstCall &operator=(const InstCall &) = delete;
|
| +
|
| public:
|
| static InstCall *create(Cfg *Func, SizeT NumArgs, Variable *Dest,
|
| Operand *CallTarget, bool HasTailCall) {
|
| @@ -349,12 +355,13 @@ protected:
|
|
|
| private:
|
| bool HasTailCall;
|
| - InstCall(const InstCall &) = delete;
|
| - InstCall &operator=(const InstCall &) = delete;
|
| };
|
|
|
| // Cast instruction (a.k.a. conversion operation).
|
| class InstCast : public InstHighLevel {
|
| + InstCast(const InstCast &) = delete;
|
| + InstCast &operator=(const InstCast &) = delete;
|
| +
|
| public:
|
| enum OpKind {
|
| #define X(tag, str) tag,
|
| @@ -374,14 +381,15 @@ public:
|
|
|
| private:
|
| InstCast(Cfg *Func, OpKind CastKind, Variable *Dest, Operand *Source);
|
| - InstCast(const InstCast &) = delete;
|
| - InstCast &operator=(const InstCast &) = delete;
|
| ~InstCast() override {}
|
| const OpKind CastKind;
|
| };
|
|
|
| // ExtractElement instruction.
|
| class InstExtractElement : public InstHighLevel {
|
| + InstExtractElement(const InstExtractElement &) = delete;
|
| + InstExtractElement &operator=(const InstExtractElement &) = delete;
|
| +
|
| public:
|
| static InstExtractElement *create(Cfg *Func, Variable *Dest, Operand *Source1,
|
| Operand *Source2) {
|
| @@ -397,14 +405,15 @@ public:
|
| private:
|
| InstExtractElement(Cfg *Func, Variable *Dest, Operand *Source1,
|
| Operand *Source2);
|
| - InstExtractElement(const InstExtractElement &) = delete;
|
| - InstExtractElement &operator=(const InstExtractElement &) = delete;
|
| ~InstExtractElement() override {}
|
| };
|
|
|
| // Floating-point comparison instruction. The source operands are
|
| // captured in getSrc(0) and getSrc(1).
|
| class InstFcmp : public InstHighLevel {
|
| + InstFcmp(const InstFcmp &) = delete;
|
| + InstFcmp &operator=(const InstFcmp &) = delete;
|
| +
|
| public:
|
| enum FCond {
|
| #define X(tag, str) tag,
|
| @@ -425,8 +434,6 @@ public:
|
| private:
|
| InstFcmp(Cfg *Func, FCond Condition, Variable *Dest, Operand *Source1,
|
| Operand *Source2);
|
| - InstFcmp(const InstFcmp &) = delete;
|
| - InstFcmp &operator=(const InstFcmp &) = delete;
|
| ~InstFcmp() override {}
|
| const FCond Condition;
|
| };
|
| @@ -434,6 +441,9 @@ private:
|
| // Integer comparison instruction. The source operands are captured
|
| // in getSrc(0) and getSrc(1).
|
| class InstIcmp : public InstHighLevel {
|
| + InstIcmp(const InstIcmp &) = delete;
|
| + InstIcmp &operator=(const InstIcmp &) = delete;
|
| +
|
| public:
|
| enum ICond {
|
| #define X(tag, str) tag,
|
| @@ -454,14 +464,15 @@ public:
|
| private:
|
| InstIcmp(Cfg *Func, ICond Condition, Variable *Dest, Operand *Source1,
|
| Operand *Source2);
|
| - InstIcmp(const InstIcmp &) = delete;
|
| - InstIcmp &operator=(const InstIcmp &) = delete;
|
| ~InstIcmp() override {}
|
| const ICond Condition;
|
| };
|
|
|
| // InsertElement instruction.
|
| class InstInsertElement : public InstHighLevel {
|
| + InstInsertElement(const InstInsertElement &) = delete;
|
| + InstInsertElement &operator=(const InstInsertElement &) = delete;
|
| +
|
| public:
|
| static InstInsertElement *create(Cfg *Func, Variable *Dest, Operand *Source1,
|
| Operand *Source2, Operand *Source3) {
|
| @@ -477,14 +488,15 @@ public:
|
| private:
|
| InstInsertElement(Cfg *Func, Variable *Dest, Operand *Source1,
|
| Operand *Source2, Operand *Source3);
|
| - InstInsertElement(const InstInsertElement &) = delete;
|
| - InstInsertElement &operator=(const InstInsertElement &) = delete;
|
| ~InstInsertElement() override {}
|
| };
|
|
|
| // Call to an intrinsic function. The call target is captured as getSrc(0),
|
| // and arg I is captured as getSrc(I+1).
|
| class InstIntrinsicCall : public InstCall {
|
| + InstIntrinsicCall(const InstIntrinsicCall &) = delete;
|
| + InstIntrinsicCall &operator=(const InstIntrinsicCall &) = delete;
|
| +
|
| public:
|
| static InstIntrinsicCall *create(Cfg *Func, SizeT NumArgs, Variable *Dest,
|
| Operand *CallTarget,
|
| @@ -504,14 +516,15 @@ private:
|
| : InstCall(Func, NumArgs, Dest, CallTarget, false, Info.HasSideEffects,
|
| Inst::IntrinsicCall),
|
| Info(Info) {}
|
| - InstIntrinsicCall(const InstIntrinsicCall &) = delete;
|
| - InstIntrinsicCall &operator=(const InstIntrinsicCall &) = delete;
|
| ~InstIntrinsicCall() override {}
|
| const Intrinsics::IntrinsicInfo Info;
|
| };
|
|
|
| // Load instruction. The source address is captured in getSrc(0).
|
| class InstLoad : public InstHighLevel {
|
| + InstLoad(const InstLoad &) = delete;
|
| + InstLoad &operator=(const InstLoad &) = delete;
|
| +
|
| public:
|
| static InstLoad *create(Cfg *Func, Variable *Dest, Operand *SourceAddr,
|
| uint32_t Align = 1) {
|
| @@ -526,14 +539,15 @@ public:
|
|
|
| private:
|
| InstLoad(Cfg *Func, Variable *Dest, Operand *SourceAddr);
|
| - InstLoad(const InstLoad &) = delete;
|
| - InstLoad &operator=(const InstLoad &) = delete;
|
| ~InstLoad() override {}
|
| };
|
|
|
| // Phi instruction. For incoming edge I, the node is Labels[I] and
|
| // the Phi source operand is getSrc(I).
|
| class InstPhi : public InstHighLevel {
|
| + InstPhi(const InstPhi &) = delete;
|
| + InstPhi &operator=(const InstPhi &) = delete;
|
| +
|
| public:
|
| static InstPhi *create(Cfg *Func, SizeT MaxSrcs, Variable *Dest) {
|
| return new (Func->allocateInst<InstPhi>()) InstPhi(Func, MaxSrcs, Dest);
|
| @@ -548,8 +562,6 @@ public:
|
|
|
| private:
|
| InstPhi(Cfg *Func, SizeT MaxSrcs, Variable *Dest);
|
| - InstPhi(const InstPhi &) = delete;
|
| - InstPhi &operator=(const InstPhi &) = delete;
|
| void destroy(Cfg *Func) override {
|
| Func->deallocateArrayOf<CfgNode *>(Labels);
|
| Inst::destroy(Func);
|
| @@ -566,6 +578,9 @@ private:
|
| // there is no return value (void-type function), then
|
| // getSrcSize()==0 and hasRetValue()==false.
|
| class InstRet : public InstHighLevel {
|
| + InstRet(const InstRet &) = delete;
|
| + InstRet &operator=(const InstRet &) = delete;
|
| +
|
| public:
|
| static InstRet *create(Cfg *Func, Operand *RetValue = NULL) {
|
| return new (Func->allocateInst<InstRet>()) InstRet(Func, RetValue);
|
| @@ -581,13 +596,14 @@ public:
|
|
|
| private:
|
| InstRet(Cfg *Func, Operand *RetValue);
|
| - InstRet(const InstRet &) = delete;
|
| - InstRet &operator=(const InstRet &) = delete;
|
| ~InstRet() override {}
|
| };
|
|
|
| // Select instruction. The condition, true, and false operands are captured.
|
| class InstSelect : public InstHighLevel {
|
| + InstSelect(const InstSelect &) = delete;
|
| + InstSelect &operator=(const InstSelect &) = delete;
|
| +
|
| public:
|
| static InstSelect *create(Cfg *Func, Variable *Dest, Operand *Condition,
|
| Operand *SourceTrue, Operand *SourceFalse) {
|
| @@ -603,14 +619,15 @@ public:
|
| private:
|
| InstSelect(Cfg *Func, Variable *Dest, Operand *Condition, Operand *Source1,
|
| Operand *Source2);
|
| - InstSelect(const InstSelect &) = delete;
|
| - InstSelect &operator=(const InstSelect &) = delete;
|
| ~InstSelect() override {}
|
| };
|
|
|
| // Store instruction. The address operand is captured, along with the
|
| // data operand to be stored into the address.
|
| class InstStore : public InstHighLevel {
|
| + InstStore(const InstStore &) = delete;
|
| + InstStore &operator=(const InstStore &) = delete;
|
| +
|
| public:
|
| static InstStore *create(Cfg *Func, Operand *Data, Operand *Addr,
|
| uint32_t align = 1) {
|
| @@ -625,14 +642,15 @@ public:
|
|
|
| private:
|
| InstStore(Cfg *Func, Operand *Data, Operand *Addr);
|
| - InstStore(const InstStore &) = delete;
|
| - InstStore &operator=(const InstStore &) = delete;
|
| ~InstStore() override {}
|
| };
|
|
|
| // Switch instruction. The single source operand is captured as
|
| // getSrc(0).
|
| class InstSwitch : public InstHighLevel {
|
| + InstSwitch(const InstSwitch &) = delete;
|
| + InstSwitch &operator=(const InstSwitch &) = delete;
|
| +
|
| public:
|
| static InstSwitch *create(Cfg *Func, SizeT NumCases, Operand *Source,
|
| CfgNode *LabelDefault) {
|
| @@ -657,8 +675,6 @@ public:
|
|
|
| private:
|
| InstSwitch(Cfg *Func, SizeT NumCases, Operand *Source, CfgNode *LabelDefault);
|
| - InstSwitch(const InstSwitch &) = delete;
|
| - InstSwitch &operator=(const InstSwitch &) = delete;
|
| void destroy(Cfg *Func) override {
|
| Func->deallocateArrayOf<uint64_t>(Values);
|
| Func->deallocateArrayOf<CfgNode *>(Labels);
|
| @@ -675,6 +691,9 @@ private:
|
| // Unreachable instruction. This is a terminator instruction with no
|
| // operands.
|
| class InstUnreachable : public InstHighLevel {
|
| + InstUnreachable(const InstUnreachable &) = delete;
|
| + InstUnreachable &operator=(const InstUnreachable &) = delete;
|
| +
|
| public:
|
| static InstUnreachable *create(Cfg *Func) {
|
| return new (Func->allocateInst<InstUnreachable>()) InstUnreachable(Func);
|
| @@ -687,8 +706,6 @@ public:
|
|
|
| private:
|
| InstUnreachable(Cfg *Func);
|
| - InstUnreachable(const InstUnreachable &) = delete;
|
| - InstUnreachable &operator=(const InstUnreachable &) = delete;
|
| ~InstUnreachable() override {}
|
| };
|
|
|
| @@ -705,6 +722,9 @@ private:
|
| // eliminated if its dest operand is unused, and therefore the FakeDef
|
| // dest wouldn't be properly initialized.
|
| class InstFakeDef : public InstHighLevel {
|
| + InstFakeDef(const InstFakeDef &) = delete;
|
| + InstFakeDef &operator=(const InstFakeDef &) = delete;
|
| +
|
| public:
|
| static InstFakeDef *create(Cfg *Func, Variable *Dest, Variable *Src = NULL) {
|
| return new (Func->allocateInst<InstFakeDef>()) InstFakeDef(Func, Dest, Src);
|
| @@ -716,8 +736,6 @@ public:
|
|
|
| private:
|
| InstFakeDef(Cfg *Func, Variable *Dest, Variable *Src);
|
| - InstFakeDef(const InstFakeDef &) = delete;
|
| - InstFakeDef &operator=(const InstFakeDef &) = delete;
|
| ~InstFakeDef() override {}
|
| };
|
|
|
| @@ -727,6 +745,9 @@ private:
|
| // situations. The FakeUse instruction has no dest, so it can itself
|
| // never be dead-code eliminated.
|
| class InstFakeUse : public InstHighLevel {
|
| + InstFakeUse(const InstFakeUse &) = delete;
|
| + InstFakeUse &operator=(const InstFakeUse &) = delete;
|
| +
|
| public:
|
| static InstFakeUse *create(Cfg *Func, Variable *Src) {
|
| return new (Func->allocateInst<InstFakeUse>()) InstFakeUse(Func, Src);
|
| @@ -738,8 +759,6 @@ public:
|
|
|
| private:
|
| InstFakeUse(Cfg *Func, Variable *Src);
|
| - InstFakeUse(const InstFakeUse &) = delete;
|
| - InstFakeUse &operator=(const InstFakeUse &) = delete;
|
| ~InstFakeUse() override {}
|
| };
|
|
|
| @@ -753,6 +772,9 @@ private:
|
| // 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 InstHighLevel {
|
| + InstFakeKill(const InstFakeKill &) = delete;
|
| + InstFakeKill &operator=(const InstFakeKill &) = delete;
|
| +
|
| public:
|
| static InstFakeKill *create(Cfg *Func, const VarList &KilledRegs,
|
| const Inst *Linked) {
|
| @@ -767,8 +789,6 @@ public:
|
|
|
| private:
|
| InstFakeKill(Cfg *Func, const VarList &KilledRegs, const Inst *Linked);
|
| - InstFakeKill(const InstFakeKill &) = delete;
|
| - InstFakeKill &operator=(const InstFakeKill &) = delete;
|
| ~InstFakeKill() override {}
|
|
|
| // This instruction is ignored if Linked->isDeleted() is true.
|
|
|