[PATCH] D86836: Support a list of CostPerUse values
Christudasan Devadasan via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 27 03:46:56 PST 2021
cdevadas added inline comments.
================
Comment at: llvm/include/llvm/CodeGen/TargetRegisterInfo.h:215
+ const bool
+ *InAllocatableClass; // Register belongs to an allocatable regclass.
};
----------------
qcolombet wrote:
> cdevadas wrote:
> > qcolombet wrote:
> > > The allocatable part cannot change, can it?
> > > I.e., why is this an array?
> > I have changed the way tablegen integrates these values to TargetRegisterInfo. It was an array of struct earlier and now a pointer to a table for the benefit of supporting the list of register costs. I thought it could be ok to change InAllocatableClass because it is part of TargetRegisterInfoDesc class. Otherwise, one of these members should be moved out of the class.
> >
> I don't really see the point here.
> I initially thought it was to save space by sharing the boolean array with all instances of TargetRegisterInfoDesc, but we actually trade a bool with a pointer.
>
> I don't understand the argument about having to move the members out of the class.
>
> Why can't we stick with the bool is here again?
Earlier, the `CostPerUse` and `InAllocatableClass` were tablegened with exactly numRegs entries each.
We could accommodate them in a single table and use the register itself to index into this table to retrieve the members during RA.
With this patch, the tablegened `CostPerUse` will have numCosts*numRegs entries wherein the `InAllocatableClass` field will remain unchanged (exactly numRegs entries).
The mismatch in their entries is the first reason I have generated the tables differently by creating two separate tables and a TargetRegisterInfoDesc instance that holds these tables.
Furthermore, an appropriate cost model will be extracted out dynamically using the `getRegisterCostTableIndex` and `getRegisterCosts` APIs so that we can still use the register to index into this dynamic table.
We should examine the `XXXRegisterInfo.inc` file generated with and without this patch to fully understand the new tables and the reason why I have changed the `InAllocatableClass` to a pointer.
If you look at the test I included in this patch, llvm/test/TableGen/RegisterInfoEmitter-regcost-list.td
There are 6 registers defined (s0 - s3 and d0 - d1) in the .td file and with the additional `NoRegister` there will be total 7 registers in the generated file.
I have included 2 cost models that resulted in 14 entries in the CostPerUseTable.
static const uint8_t `CostPerUseTable[]` = { 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 2, 3, };
For cost model 0: During RA, the ArrayRef RegCosts will get {0, 0, 0, 1, 1, 1, 1}
For cost model 1: During RA, the ArrayRef RegCosts will get {0, 0, 0, 0, 1, 2, 3}
The InAllocatableClassTable will have 7 entries irrespective of the cost model.
static const bool `InAllocatableClassTable[]` = { false, true, true, true, true, true, true, };
Finally, the TargetRegisterInfoDesc instance to be used by the RA.
static const TargetRegisterInfoDesc `MyTargetRegInfoDesc` = { // Extra Descriptors
CostPerUseTable, 2, InAllocatableClassTable};
Assume if there is only one cost model (cost model 0) in the input file and with the upstream compiler today, the tablegened register info will look like the following:
static const TargetRegisterInfoDesc `MyTargetRegInfoDesc[]` = { // Extra Descriptors
{ 0, false },
{ 0, true },
{ 0, true },
{ 1, true },
{ 1, true },
{ 1, true },
{ 1, true },
};
The array `MyTargetRegInfoDesc[]` generated with the upstream compiler would now become an object `MyTargetRegInfoDesc` that points to the individual tables.
================
Comment at: llvm/include/llvm/CodeGen/TargetRegisterInfo.h:339
+ return 0;
+ }
+
----------------
qcolombet wrote:
> qcolombet wrote:
> > This should be protected, no user should care about that.
> This was not addressed, was it?
Sorry, I missed it. Will move it under Protected.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D86836/new/
https://reviews.llvm.org/D86836
More information about the llvm-commits
mailing list