diff options
author | Evan Cheng <evan.cheng@apple.com> | 2010-07-21 06:09:07 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2010-07-21 06:09:07 +0000 |
commit | 4f6b4674be5473319ac5e70c76fd5cb964da2128 (patch) | |
tree | 2a4769ab9aebbba6d3ce186fab75dca6ff3bd593 /include | |
parent | 80a16b05691832708636ea52c4e1ae8524a7d0d3 (diff) | |
download | llvm-4f6b4674be5473319ac5e70c76fd5cb964da2128.tar.gz llvm-4f6b4674be5473319ac5e70c76fd5cb964da2128.tar.bz2 llvm-4f6b4674be5473319ac5e70c76fd5cb964da2128.tar.xz |
Teach bottom up pre-ra scheduler to track register pressure. Work in progress.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108991 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Target/TargetLowering.h | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index 926efc4eb7..285c4be5bf 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -174,12 +174,18 @@ public: /// For example, on i386 the rep register class for i8, i16, and i32 are GR32; /// while the rep register class is GR64 on x86_64. virtual const TargetRegisterClass *getRepRegClassFor(EVT VT) const { - assert(VT.isSimple() && "getRegClassFor called on illegal type!"); + assert(VT.isSimple() && "getRepRegClassFor called on illegal type!"); const TargetRegisterClass *RC = RepRegClassForVT[VT.getSimpleVT().SimpleTy]; - assert(RC && "This value type is not natively supported!"); return RC; } + /// getRepRegClassCostFor - Return the cost of the 'representative' register + /// class for the specified value type. + virtual uint8_t getRepRegClassCostFor(EVT VT) const { + assert(VT.isSimple() && "getRepRegClassCostFor called on illegal type!"); + return RepRegClassCostForVT[VT.getSimpleVT().SimpleTy]; + } + /// isTypeLegal - Return true if the target has native support for the /// specified value type. This means that it has a register that directly /// holds it without promotions or expansions. @@ -994,9 +1000,9 @@ protected: } /// findRepresentativeClass - Return the largest legal super-reg register class - /// of the specified register class. - virtual const TargetRegisterClass * - findRepresentativeClass(const TargetRegisterClass *RC) const; + /// of the register class for the specified type and its associated "cost". + virtual std::pair<const TargetRegisterClass*, uint8_t> + findRepresentativeClass(EVT VT) const; /// computeRegisterProperties - Once all of the register classes are added, /// this allows us to compute derived properties we expose. @@ -1581,10 +1587,17 @@ private: /// RepRegClassForVT - This indicates the "representative" register class to /// use for each ValueType the target supports natively. This information is - /// used by the scheduler to track register pressure. e.g. On x86, i8, i16, + /// used by the scheduler to track register pressure. By default, the + /// representative register class is the largest legal super-reg register + /// class of the register class of the specified type. e.g. On x86, i8, i16, /// and i32's representative class would be GR32. const TargetRegisterClass *RepRegClassForVT[MVT::LAST_VALUETYPE]; + /// RepRegClassCostForVT - This indicates the "cost" of the "representative" + /// register class for each ValueType. The cost is used by the scheduler to + /// approximate register pressure. + uint8_t RepRegClassCostForVT[MVT::LAST_VALUETYPE]; + /// Synthesizable indicates whether it is OK for the compiler to create new /// operations using this type. All Legal types are Synthesizable except /// MMX types on X86. Non-Legal types are not Synthesizable. |