| OLD | NEW | 
|---|
| 1 //===- subzero/src/IceOperand.h - High-level operands -----------*- C++ -*-===// | 1 //===- subzero/src/IceOperand.h - High-level operands -----------*- C++ -*-===// | 
| 2 // | 2 // | 
| 3 //                        The Subzero Code Generator | 3 //                        The Subzero Code Generator | 
| 4 // | 4 // | 
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source | 
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. | 
| 7 // | 7 // | 
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// | 
| 9 // | 9 // | 
| 10 // This file declares the Operand class and its target-independent | 10 // This file declares the Operand class and its target-independent | 
| 11 // subclasses.  The main classes are Variable, which represents an | 11 // subclasses.  The main classes are Variable, which represents an | 
| 12 // LLVM variable that is either register- or stack-allocated, and the | 12 // LLVM variable that is either register- or stack-allocated, and the | 
| 13 // Constant hierarchy, which represents integer, floating-point, | 13 // Constant hierarchy, which represents integer, floating-point, | 
| 14 // and/or symbolic constants. | 14 // and/or symbolic constants. | 
| 15 // | 15 // | 
| 16 //===----------------------------------------------------------------------===// | 16 //===----------------------------------------------------------------------===// | 
| 17 | 17 | 
| 18 #ifndef SUBZERO_SRC_ICEOPERAND_H | 18 #ifndef SUBZERO_SRC_ICEOPERAND_H | 
| 19 #define SUBZERO_SRC_ICEOPERAND_H | 19 #define SUBZERO_SRC_ICEOPERAND_H | 
| 20 | 20 | 
| 21 #include "IceDefs.h" | 21 #include "IceDefs.h" | 
| 22 #include "IceTypes.h" | 22 #include "IceTypes.h" | 
| 23 | 23 | 
| 24 namespace Ice { | 24 namespace Ice { | 
| 25 | 25 | 
| 26 class Operand { | 26 class Operand { | 
| 27 public: | 27 public: | 
|  | 28   static const size_t MaxTargetKinds = 10; | 
| 28   enum OperandKind { | 29   enum OperandKind { | 
| 29     kConst_Base, | 30     kConst_Base, | 
| 30     kConstInteger32, | 31     kConstInteger32, | 
| 31     kConstInteger64, | 32     kConstInteger64, | 
| 32     kConstFloat, | 33     kConstFloat, | 
| 33     kConstDouble, | 34     kConstDouble, | 
| 34     kConstRelocatable, | 35     kConstRelocatable, | 
| 35     kConstUndef, | 36     kConstUndef, | 
| 36     kConst_Num, | 37     kConst_Target, // leave space for target-specific constant kinds | 
|  | 38     kConst_Num = kConst_Target + MaxTargetKinds, | 
| 37     kVariable, | 39     kVariable, | 
|  | 40     kVariable_Target, // leave space for target-specific variable kinds | 
|  | 41     kVariable_Num = kVariable_Target + MaxTargetKinds, | 
| 38     // Target-specific operand classes use kTarget as the starting | 42     // Target-specific operand classes use kTarget as the starting | 
| 39     // point for their Kind enum space. | 43     // point for their Kind enum space. | 
| 40     kTarget | 44     kTarget | 
| 41   }; | 45   }; | 
| 42   OperandKind getKind() const { return Kind; } | 46   OperandKind getKind() const { return Kind; } | 
| 43   Type getType() const { return Ty; } | 47   Type getType() const { return Ty; } | 
| 44 | 48 | 
| 45   // Every Operand keeps an array of the Variables referenced in | 49   // Every Operand keeps an array of the Variables referenced in | 
| 46   // the operand.  This is so that the liveness operations can get | 50   // the operand.  This is so that the liveness operations can get | 
| 47   // quick access to the variables of interest, without having to dig | 51   // quick access to the variables of interest, without having to dig | 
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 332   RangeType Range; | 336   RangeType Range; | 
| 333   RegWeight Weight; | 337   RegWeight Weight; | 
| 334 }; | 338 }; | 
| 335 | 339 | 
| 336 Ostream &operator<<(Ostream &Str, const LiveRange &L); | 340 Ostream &operator<<(Ostream &Str, const LiveRange &L); | 
| 337 | 341 | 
| 338 // Variable represents an operand that is register-allocated or | 342 // Variable represents an operand that is register-allocated or | 
| 339 // stack-allocated.  If it is register-allocated, it will ultimately | 343 // stack-allocated.  If it is register-allocated, it will ultimately | 
| 340 // have a non-negative RegNum field. | 344 // have a non-negative RegNum field. | 
| 341 class Variable : public Operand { | 345 class Variable : public Operand { | 
|  | 346   Variable(const Variable &) LLVM_DELETED_FUNCTION; | 
|  | 347   Variable &operator=(const Variable &) LLVM_DELETED_FUNCTION; | 
|  | 348 | 
| 342 public: | 349 public: | 
| 343   static Variable *create(Cfg *Func, Type Ty, const CfgNode *Node, SizeT Index, | 350   static Variable *create(Cfg *Func, Type Ty, const CfgNode *Node, SizeT Index, | 
| 344                           const IceString &Name) { | 351                           const IceString &Name) { | 
| 345     return new (Func->allocate<Variable>()) Variable(Ty, Node, Index, Name); | 352     return new (Func->allocate<Variable>()) | 
|  | 353         Variable(kVariable, Ty, Node, Index, Name); | 
| 346   } | 354   } | 
| 347 | 355 | 
| 348   SizeT getIndex() const { return Number; } | 356   SizeT getIndex() const { return Number; } | 
| 349   IceString getName() const; | 357   IceString getName() const; | 
| 350   void setName(IceString &NewName) { | 358   void setName(IceString &NewName) { | 
| 351     // Make sure that the name can only be set once. | 359     // Make sure that the name can only be set once. | 
| 352     assert(Name.empty()); | 360     assert(Name.empty()); | 
| 353     Name = NewName; | 361     Name = NewName; | 
| 354   } | 362   } | 
| 355 | 363 | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 424   // emission.  Note that only basic information is copied, in | 432   // emission.  Note that only basic information is copied, in | 
| 425   // particular not DefInst, IsArgument, Weight, RegisterPreference, | 433   // particular not DefInst, IsArgument, Weight, RegisterPreference, | 
| 426   // AllowRegisterOverlap, LoVar, HiVar, VarsReal. | 434   // AllowRegisterOverlap, LoVar, HiVar, VarsReal. | 
| 427   Variable asType(Type Ty); | 435   Variable asType(Type Ty); | 
| 428 | 436 | 
| 429   virtual void emit(const Cfg *Func) const; | 437   virtual void emit(const Cfg *Func) const; | 
| 430   using Operand::dump; | 438   using Operand::dump; | 
| 431   virtual void dump(const Cfg *Func, Ostream &Str) const; | 439   virtual void dump(const Cfg *Func, Ostream &Str) const; | 
| 432 | 440 | 
| 433   static bool classof(const Operand *Operand) { | 441   static bool classof(const Operand *Operand) { | 
| 434     return Operand->getKind() == kVariable; | 442     OperandKind Kind = Operand->getKind(); | 
|  | 443     return Kind >= kVariable && Kind <= kVariable_Num; | 
| 435   } | 444   } | 
| 436 | 445 | 
| 437   // The destructor is public because of the asType() method. | 446   // The destructor is public because of the asType() method. | 
| 438   virtual ~Variable() {} | 447   virtual ~Variable() {} | 
| 439 | 448 | 
| 440 private: | 449 protected: | 
| 441   Variable(Type Ty, const CfgNode *Node, SizeT Index, const IceString &Name) | 450   Variable(OperandKind K, Type Ty, const CfgNode *Node, SizeT Index, | 
| 442       : Operand(kVariable, Ty), Number(Index), Name(Name), DefInst(NULL), | 451            const IceString &Name) | 
| 443         DefNode(Node), IsMultidef(false), IsArgument(false), StackOffset(0), | 452       : Operand(K, Ty), Number(Index), Name(Name), DefInst(NULL), DefNode(Node), | 
|  | 453         IsMultidef(false), IsArgument(false), StackOffset(0), | 
| 444         RegNum(NoRegister), RegNumTmp(NoRegister), Weight(1), | 454         RegNum(NoRegister), RegNumTmp(NoRegister), Weight(1), | 
| 445         RegisterPreference(NULL), AllowRegisterOverlap(false), LoVar(NULL), | 455         RegisterPreference(NULL), AllowRegisterOverlap(false), LoVar(NULL), | 
| 446         HiVar(NULL) { | 456         HiVar(NULL) { | 
| 447     Vars = VarsReal; | 457     Vars = VarsReal; | 
| 448     Vars[0] = this; | 458     Vars[0] = this; | 
| 449     NumVars = 1; | 459     NumVars = 1; | 
| 450   } | 460   } | 
| 451   Variable(const Variable &) LLVM_DELETED_FUNCTION; |  | 
| 452   Variable &operator=(const Variable &) LLVM_DELETED_FUNCTION; |  | 
| 453   // Number is unique across all variables, and is used as a | 461   // Number is unique across all variables, and is used as a | 
| 454   // (bit)vector index for liveness analysis. | 462   // (bit)vector index for liveness analysis. | 
| 455   const SizeT Number; | 463   const SizeT Number; | 
| 456   // Name is optional. | 464   // Name is optional. | 
| 457   IceString Name; | 465   IceString Name; | 
| 458   // DefInst is the instruction that produces this variable as its | 466   // DefInst is the instruction that produces this variable as its | 
| 459   // dest. | 467   // dest. | 
| 460   Inst *DefInst; | 468   Inst *DefInst; | 
| 461   // DefNode is the node where this variable was produced, and is | 469   // DefNode is the node where this variable was produced, and is | 
| 462   // reset to NULL if it is used outside that node.  This is used for | 470   // reset to NULL if it is used outside that node.  This is used for | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 497   Variable *LoVar; | 505   Variable *LoVar; | 
| 498   Variable *HiVar; | 506   Variable *HiVar; | 
| 499   // VarsReal (and Operand::Vars) are set up such that Vars[0] == | 507   // VarsReal (and Operand::Vars) are set up such that Vars[0] == | 
| 500   // this. | 508   // this. | 
| 501   Variable *VarsReal[1]; | 509   Variable *VarsReal[1]; | 
| 502 }; | 510 }; | 
| 503 | 511 | 
| 504 } // end of namespace Ice | 512 } // end of namespace Ice | 
| 505 | 513 | 
| 506 #endif // SUBZERO_SRC_ICEOPERAND_H | 514 #endif // SUBZERO_SRC_ICEOPERAND_H | 
| OLD | NEW | 
|---|