llvm-6502/test/Transforms
Adam Nemet d761cc1dfa [LoopStrengthReduce] Don't trim formula that uses a subset of required registers
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 all 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>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207271 91177308-0d34-0410-b5e6-96231b3b80d8
2014-04-25 21:02:21 +00:00
..
ADCE
AddDiscriminators Fix bug 19437 - Only add discriminators for DWARF 4 and above. 2014-04-17 22:33:50 +00:00
ArgumentPromotion
AtomicExpandLoadLinked/ARM Atomics: promote ARM's IR-based atomics pass to CodeGen. 2014-04-17 18:22:47 +00:00
BBVectorize Allow vectorization of bit intrinsics in BB Vectorizer. 2014-04-25 03:33:48 +00:00
BranchFolding
CodeExtractor
CodeGenPrepare
ConstantHoisting [Constant Hoisting] Materialize the constant before the cloned cast instruction. 2014-04-22 18:06:58 +00:00
ConstantMerge
ConstProp
CorrelatedValuePropagation
DeadArgElim
DeadStoreElimination
DebugIR
EarlyCSE
FunctionAttrs
GCOVProfiling
GlobalDCE
GlobalMerge
GlobalOpt
GVN
IndVarSimplify
Inline [inline cold threshold] Command line argument for inline threshold will 2014-04-25 17:34:55 +00:00
InstCombine [InstCombine][x86] Constant fold psll intrinsics. 2014-04-24 00:58:18 +00:00
InstSimplify
Internalize
IPConstantProp
JumpThreading
LCSSA
LICM
LoopDeletion
LoopIdiom
LoopReroll
LoopRotate
LoopSimplify
LoopStrengthReduce [LoopStrengthReduce] Don't trim formula that uses a subset of required registers 2014-04-25 21:02:21 +00:00
LoopUnroll
LoopUnswitch
LoopVectorize [CLNUP] Test commit. Remove newline. 2014-04-24 08:42:58 +00:00
LowerAtomic
LowerExpectIntrinsic
LowerInvoke
LowerSwitch
Mem2Reg
MemCpyOpt
MergeFunc
MetaRenamer
ObjCARC
PhaseOrdering
PruneEH
Reassociate
Reg2Mem
SampleProfile
Scalarizer
ScalarRepl
SCCP
SimplifyCFG
Sink
SLPVectorizer Reapply "SLPVectorizer: Ignore users that are insertelements we can reschedule them" 2014-04-10 13:41:35 +00:00
SROA
StripSymbols
StructurizeCFG
TailCallElim Fix PR7272 in -tailcallelim instead of the inliner 2014-04-21 20:48:47 +00:00
TailDup