| Index: src/IceOperand.h
|
| diff --git a/src/IceOperand.h b/src/IceOperand.h
|
| index 0addc883b41ed860d8c1c683b5bf956bc05cec40..8ad78a59c3576a2475be93e01d2d7d46333f2d08 100644
|
| --- a/src/IceOperand.h
|
| +++ b/src/IceOperand.h
|
| @@ -428,6 +428,23 @@ private:
|
|
|
| Ostream &operator<<(Ostream &Str, const LiveRange &L);
|
|
|
| +/// RegClass indicates the physical register class that a Variable may be
|
| +/// register-allocated from. By default, a variable's register class is
|
| +/// directly associated with its type. However, the target lowering may define
|
| +/// additional target-specific register classes by extending the set of enum
|
| +/// values.
|
| +enum RegClass : uint8_t {
|
| +// Define RC_void, RC_i1, RC_i8, etc.
|
| +#define X(tag, sizeLog2, align, elts, elty, str) RC_##tag = IceType_##tag,
|
| + ICETYPE_TABLE
|
| +#undef X
|
| + RC_Target,
|
| + // Leave plenty of space for target-specific values.
|
| + RC_Max = std::numeric_limits<uint8_t>::max()
|
| +};
|
| +static_assert(RC_Target == static_cast<RegClass>(IceType_NUM),
|
| + "Expected RC_Target and IceType_NUM to be the same");
|
| +
|
| /// Variable represents an operand that is register-allocated or
|
| /// stack-allocated. If it is register-allocated, it will ultimately have a
|
| /// non-negative RegNum field.
|
| @@ -493,6 +510,9 @@ public:
|
| return RegRequirement == RR_MustNotHaveRegister;
|
| }
|
|
|
| + void setRegClass(uint8_t RC) { RegisterClass = static_cast<RegClass>(RC); }
|
| + RegClass getRegClass() const { return RegisterClass; }
|
| +
|
| LiveRange &getLiveRange() { return Live; }
|
| const LiveRange &getLiveRange() const { return Live; }
|
| void setLiveRange(const LiveRange &Range) { Live = Range; }
|
| @@ -537,7 +557,8 @@ public:
|
|
|
| protected:
|
| Variable(OperandKind K, Type Ty, SizeT Index)
|
| - : Operand(K, Ty), Number(Index) {
|
| + : Operand(K, Ty), Number(Index),
|
| + RegisterClass(static_cast<RegClass>(Ty)) {
|
| Vars = VarsReal;
|
| Vars[0] = this;
|
| NumVars = 1;
|
| @@ -553,6 +574,7 @@ protected:
|
| /// pointer and other physical registers specifically referenced by name.
|
| bool IgnoreLiveness = false;
|
| RegRequirement RegRequirement = RR_MayHaveRegister;
|
| + RegClass RegisterClass;
|
| /// RegNum is the allocated register, or NoRegister if it isn't
|
| /// register-allocated.
|
| int32_t RegNum = NoRegister;
|
|
|