[PATCH][LoopStrengthReduce] Don't trim a formula that uses a subset of required registers

Andrew Trick atrick at apple.com
Fri Apr 25 13:39:11 PDT 2014

On Apr 18, 2014, at 1:13 PM, Adam Nemet <anemet at apple.com> wrote:

> Ping
> On Apr 10, 2014, at 9:12 PM, Adam Nemet <anemet at apple.com> wrote:
>> Consider this use from the new testcase:
>> LSR Use: Kind=ICmpZero, Offsets={0}, widest fixup type: i32
>>   reg({1000,+,-1}<nw><%for.body>)
>>   -3003 + reg({3,+,3}<nw><%for.body>)
>>   -1001 + reg({1,+,1}<nuw><nsw><%for.body>)
>>   -1000 + reg({0,+,1}<nw><%for.body>)
>>   -3000 + reg({0,+,3}<nuw><%for.body>)
>>   reg({-1000,+,1}<nw><%for.body>)
>>   reg({-3000,+,3}<nsw><%for.body>)
>> This is the last use we consider for a solution in SolveRecurse, so CurRegs is
>> a large set.  (CurRegs is the set of registers that are needed by the
>> previously visited uses in the in-progress solution.)
>> ReqRegs is {
>> {3,+,3}<nw><%for.body>,
>> {1,+,1}<nuw><nsw><%for.body>
>> }
>> This is the intersection of the regs used by any of the formulas for the
>> current use and CurRegs.
>> Now, the code requires a formula to contain *all* these regs (the comment is
>> simply wrong), otherwise the formula is immediately disqualified.  Obviously,
>> no formula for this use contains two regs so they will each get disqualified.
>> The fix modifies the check to allow the formula in this case.  The idea is
>> that neither of these formulae is introducing any new registers which is the
>> point of this early pruning as far as I understand.
>> In terms of set arithmetic, we now allow formulas whose used regs are a subset
>> of the required regs not just the other way around.
>> There are few more loops in the test-suite that are now successfully LSRed.  I
>> have benchmarked those and found very minimal change.
>> Fixes <rdar://problem/13965777>


This fix looks great to me! Please go ahead and commit.


More information about the llvm-commits mailing list