llvm-project/llvm/test/Transforms
Philip Reames 5937368d4f [LICM] Remove unneccessary safety check to increase sinking effectiveness
This one requires a bit of explaination.  It's not every day you simply delete code to implement an optimization.  :)

The transform in question is sinking an instruction from a loop to the uses in loop exiting blocks.  We know (from LCSSA) that all of the uses outside the loop must be phi nodes, and after predecessor splitting, we know all phi users must have a single operand.  Since the use must be strictly dominated by the def, we know from the definition of dominance/ssa that the exit block must execute along a (non-strict) subset of paths which reach the def.  As a result, duplicating a potentially faulting instruction can not *introduce* a fault that didn't previously exist in the program.  

The full story is that this patch builds on "rL338671: [LICM] Factor out fault legality from canHoistOrSinkInst [NFC]" which pulled this logic out of a common helper routine.  As best I can tell, this check was originally added to the helper function for hoisting legality, later an incorrect fastpath for loads/calls was added, and then the bug was fixed by duplicating the fault safety check in the hoist path.  This left the redundant check in the common code to pessimize sinking for no reason.  I split it out in an NFC, and am not removing the unneccessary check.  I wanted there to be something easy to revert in case I missed something.

Reviewed by: Anna Thomas (in person)

llvm-svn: 338794
2018-08-03 00:21:56 +00:00
..
ADCE [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
AddDiscriminators [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
AggressiveInstCombine [AggressiveInstCombine] avoid crashing on unsimplified code (PR37446) 2018-05-14 13:43:32 +00:00
AlignmentFromAssumptions [AlignmentFromAssumptions] Set source and dest alignments of memory intrinsiscs separately 2018-02-22 18:55:59 +00:00
ArgumentPromotion [ArgumentPromotion] don't break musttail invariant PR36543 2018-03-02 00:59:27 +00:00
AtomicExpand
BDCE [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
BlockExtractor BlockExtractor: Don’t delete functions directly 2018-03-12 22:28:18 +00:00
BranchFolding
CallSiteSplitting [CallSiteSplit] Make sure we remove nonnull if the parameter turns out to be a constant. 2018-04-23 20:09:08 +00:00
CalledValuePropagation
CodeExtractor [CodeExtractor] Allow extracting blocks with exception handling 2018-05-11 22:49:49 +00:00
CodeGenPrepare Make llvm.objectsize more conservative with null 2018-07-09 22:21:16 +00:00
ConstProp [ConstProp] Fix calls-math-finite.ll on FreeBSD 2018-07-26 06:24:11 +00:00
ConstantHoisting [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
ConstantMerge
Coroutines [Coroutines] PR34897: Fix incorrect elisions 2018-05-11 03:12:28 +00:00
CorrelatedValuePropagation llvm: Add support for "-fno-delete-null-pointer-checks" 2018-07-09 22:27:23 +00:00
CrossDSOCFI
DCE [DCE] Salvage debug info from dead insts 2018-02-15 22:26:18 +00:00
DeadArgElim [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
DeadStoreElimination Implement strip.invariant.group 2018-07-02 04:49:30 +00:00
DivRemPairs
EarlyCSE [EarlyCSE] Propagate conditions of AND and OR instructions 2018-06-14 13:02:13 +00:00
EliminateAvailableExternally
EntryExitInstrumenter [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
ExpandMemCmp/X86
Float2Int
ForcedFunctionAttrs
FunctionAttrs llvm: Add support for "-fno-delete-null-pointer-checks" 2018-07-09 22:27:23 +00:00
FunctionImport Restore "[ThinLTO] Ensure we always select the same function copy to import" 2018-07-16 15:30:27 +00:00
GCOVProfiling [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
GVN [MemDep] Use PhiValuesAnalysis to improve alias analysis results 2018-07-31 14:19:29 +00:00
GVNHoist [MemorySSAUpdater] Update Phi operands after trivial Phi elimination 2018-07-23 10:56:30 +00:00
GVNSink
GlobalDCE
GlobalMerge [GlobalMerge] Allow merging globals with explicit section markings. 2018-08-02 23:54:16 +00:00
GlobalOpt [GlobalOpt] Test array indices inside structs for out-of-bounds accesses 2018-07-28 08:20:10 +00:00
GlobalSplit
GuardWidening [LoopGuardWidening] Make PostDomTree optional 2018-04-27 23:15:56 +00:00
IPConstantProp Revert r337904: [IPSCCP] Use PredicateInfo to propagate facts from cmp instructions. 2018-07-25 19:44:19 +00:00
IRCE [IRCE] Fix miscompile with range checks against negative values 2018-05-19 13:06:37 +00:00
IndVarSimplify [SimplifyIndVar] Canonicalize comparisons to unsigned while eliminating truncs 2018-07-27 09:43:39 +00:00
IndirectBrExpand
InferAddressSpaces [AMDGPU] Switch to the new addr space mapping by default 2018-02-02 16:07:16 +00:00
InferFunctionAttrs [SimplifyLibcalls] Replace locked IO with unlocked IO 2018-05-16 11:39:52 +00:00
Inline Revert "Enrich inline messages", tests fail 2018-08-01 08:02:40 +00:00
InstCombine [InstCombine] [NFC] Tests for select with binop fold 2018-08-02 14:59:23 +00:00
InstMerge [MergedLoadStoreMotion] Fix a debug invariant bug in mergeStores 2018-05-09 06:52:12 +00:00
InstNamer
InstSimplify [InstSimplify] move minnum/maxnum with undef fold from instcombine 2018-08-02 14:33:40 +00:00
InterleavedAccess
Internalize
JumpThreading [JumpThreading] Don't try to rewrite a use if it's already valid. 2018-06-26 22:19:48 +00:00
LCSSA [DebugInfo][LCSSA] Preserve debug location in lcssa phis 2018-07-31 14:54:52 +00:00
LICM [LICM] Remove unneccessary safety check to increase sinking effectiveness 2018-08-03 00:21:56 +00:00
LoadStoreVectorizer [LSV] Look through selects for consecutive addresses 2018-07-25 21:33:00 +00:00
LoopDataPrefetch [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
LoopDeletion
LoopDistribute [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
LoopIdiom [LoopIdiomRecognize] Don't convert a do while loop to ctlz. 2018-07-11 22:35:28 +00:00
LoopInstSimplify [LoopInstSimplify] Re-implement the core logic of loop-instsimplify to 2018-05-29 20:15:38 +00:00
LoopInterchange NFC - Various typo fixes in tests 2018-07-04 13:28:39 +00:00
LoopLoadElim
LoopPredication [LoopPredication] Add profitability check based on BPI 2018-03-22 16:03:59 +00:00
LoopReroll [LoopReroll] Rewrite induction variable rewriting. 2018-06-22 22:58:55 +00:00
LoopRotate [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
LoopSimplify [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
LoopSimplifyCFG Generalize MergeBlockIntoPredecessor. Replace uses of MergeBasicBlockIntoOnlyPred. 2018-06-20 22:01:04 +00:00
LoopStrengthReduce SCEVExpander::expandAddRecExprLiterally(): check before casting as Instruction 2018-06-29 07:44:20 +00:00
LoopUnroll LoopUnroll: Allow analyzing intrinsic call costs 2018-06-26 18:51:17 +00:00
LoopUnrollAndJam [UnrollAndJam] New Unroll and Jam pass 2018-07-01 12:47:30 +00:00
LoopUnswitch [LoopUnswitch] Fix SCEV invalidation in unswitching 2018-05-23 10:09:53 +00:00
LoopVectorize Revert "[LV][DebugInfo] Set DL to the middle block Icmp instruction" 2018-07-27 08:22:54 +00:00
LoopVersioning Re-apply "[SCEV] Strengthen StrengthenNoWrapFlags (reapply r334428)." 2018-07-13 23:58:46 +00:00
LoopVersioningLICM
LowerAtomic
LowerExpectIntrinsic
LowerGuardIntrinsic
LowerInvoke
LowerSwitch
LowerTypeTests [LowerTypeTests] Limit when icall jumptable entries are emitted 2018-07-13 19:57:39 +00:00
Mem2Reg Improve ConvertDebugDeclareToDebugValue 2018-06-26 06:17:00 +00:00
MemCpyOpt [MemCpyOpt] Skip optimizing basic blocks not reachable from entry 2018-04-23 19:55:04 +00:00
MergeFunc [MergeFunctions] Fix merging of small weak functions 2018-05-15 11:31:07 +00:00
MergeICmps [MergeICmps] Don't crash when memcmp is not available 2018-05-19 12:51:59 +00:00
MetaRenamer
NameAnonGlobals
NaryReassociate [NaryReassociate] Detect deleted instr with WeakVH 2018-05-24 06:09:02 +00:00
NewGVN [InstSimplify] tests for D48828: fold extraction from std::pair 2018-07-27 07:21:02 +00:00
ObjCARC [ObjCARC] Prevent code motion into a catchswitch 2018-05-16 04:52:18 +00:00
PGOProfile [InstrProf] Use comdats on COFF for available_externally functions 2018-07-26 22:59:17 +00:00
PartiallyInlineLibCalls
PhaseOrdering [PhaseOrdering] remove stale comments; NFC 2018-05-09 23:10:46 +00:00
PlaceSafepoints
PreISelIntrinsicLowering
PruneEH [PM][FunctionAttrs] add NoUnwind attribute inference to PostOrderFunctionAttrs pass 2018-03-23 21:46:16 +00:00
Reassociate [Constants] add identity constants for fadd/fmul 2018-07-03 17:12:59 +00:00
Reg2Mem
RewriteStatepointsForGC NFC - Various typo fixes in tests 2018-07-04 13:28:39 +00:00
SCCP [BasicAA] Use PhiValuesAnalysis if available when handling phi alias 2018-07-30 11:52:08 +00:00
SLPVectorizer [SLP] Fix PR38339: Instruction does not dominate all uses! 2018-07-31 14:02:43 +00:00
SROA [SROA] Preserve DebugLoc when rewriting alloca partitions 2018-06-28 18:58:30 +00:00
SafeStack [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
SampleProfile [SampleFDO] Add a new compact binary format for sample profile. 2018-06-11 22:40:43 +00:00
Scalarizer [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
SeparateConstOffsetFromGEP [Split GEP] handle trunc() in separate-const-offset-from-gep pass. 2018-05-11 21:13:19 +00:00
SimpleLoopUnswitch [PM/Unswitch] Fix a collection of closely related issues with trivial 2018-07-10 08:36:05 +00:00
SimplifyCFG [InstCombine] Fold Select with binary op 2018-07-30 20:38:53 +00:00
Sink
SpeculateAroundPHIs
SpeculativeExecution
StraightLineStrengthReduce
StripDeadPrototypes
StripSymbols
StructurizeCFG StructurizeCFG: Adjust the loop depth for a subregion to order the nodes correctly 2018-05-23 18:34:48 +00:00
SyntheticCountsPropagation
TailCallElim [DebugInfo] Add DILabel metadata and intrinsic llvm.dbg.label. 2018-05-09 02:40:45 +00:00
ThinLTOBitcodeWriter [ThinLTOBitcodeWriter] Emit summaries for regular LTO modules 2018-06-01 15:20:47 +00:00
Util [PredicateInfo] Use custom mangling to support ssa_copy with unnamed types. 2018-07-24 14:49:52 +00:00
WholeProgramDevirt Runtime flag to control branch funnel threshold 2018-04-06 21:32:36 +00:00