| Index: src/IceOperand.h
|
| diff --git a/src/IceOperand.h b/src/IceOperand.h
|
| index 36aafe23249f3a198b52b3e903fb4f3f36b151da..7e7c4f02add3b73cec81a159063ec28b48b01961 100644
|
| --- a/src/IceOperand.h
|
| +++ b/src/IceOperand.h
|
| @@ -349,6 +349,14 @@ public:
|
| bool isMultiblockLife() const { return (DefNode == NULL); }
|
| void setUse(const Inst *Inst, const CfgNode *Node);
|
|
|
| + // Multidef means a variable is non-SSA and has multiple defining
|
| + // instructions. Currently this classification is limited to SSA
|
| + // lowering temporaries where the definitions are in different basic
|
| + // blocks, and it is not maintained during target lowering when the
|
| + // same temporary may be updated in consecutive instructions.
|
| + bool getIsMultidef() const { return IsMultidef; }
|
| + void setIsMultidef() { IsMultidef = true; }
|
| +
|
| bool getIsArg() const { return IsArgument; }
|
| void setIsArg(Cfg *Func, bool IsArg = true);
|
|
|
| @@ -419,9 +427,10 @@ public:
|
| private:
|
| Variable(Type Ty, const CfgNode *Node, SizeT Index, const IceString &Name)
|
| : Operand(kVariable, Ty), Number(Index), Name(Name), DefInst(NULL),
|
| - DefNode(Node), IsArgument(false), StackOffset(0), RegNum(NoRegister),
|
| - RegNumTmp(NoRegister), Weight(1), RegisterPreference(NULL),
|
| - AllowRegisterOverlap(false), LoVar(NULL), HiVar(NULL) {
|
| + DefNode(Node), IsMultidef(false), IsArgument(false), StackOffset(0),
|
| + RegNum(NoRegister), RegNumTmp(NoRegister), Weight(1),
|
| + RegisterPreference(NULL), AllowRegisterOverlap(false), LoVar(NULL),
|
| + HiVar(NULL) {
|
| Vars = VarsReal;
|
| Vars[0] = this;
|
| NumVars = 1;
|
| @@ -443,6 +452,7 @@ private:
|
| // Cfg. This saves space in the Variable, and removes the fragility
|
| // of incrementally computing and maintaining the information.
|
| const CfgNode *DefNode;
|
| + bool IsMultidef;
|
| bool IsArgument;
|
| // StackOffset is the canonical location on stack (only if
|
| // RegNum<0 || IsArgument).
|
|
|