llvm-project/llvm/test/Transforms
Daniel Berlin 03f6938edc Fix PR 24415 (at least), by making our post-dominator tree behavior sane.
Summary:
Currently, our post-dom tree tries to ignore and remove the effects of
infinite loops.  It fails miserably at this, because it tries to do it
ahead of time, and thus can only detect self-loops, and any other type
of infinite loop, it pretends doesn't exist at all.

This can, in a bunch of cases, lead to wrong answers and a completely
empty post-dom tree.

Wrong answer:

```
declare void foo()
define internal void @f() {
entry:
  br i1 undef, label %bb35, label %bb3.i

bb3.i:
  call void @foo()
  br label %bb3.i

bb35.loopexit3:
  br label %bb35

bb35:
  ret void
}
```
We get:
```
Inorder PostDominator Tree:
  [1]  <<exit node>> {0,7}
    [2] %bb35 {1,6}
      [3] %bb35.loopexit3 {2,3}
      [3] %entry {4,5}
```

This is a trivial modification of the testcase for PR 6047
Note that we pretend bb3.i doesn't exist.
We also pretend that bb35 post-dominates entry.

While it's true that it does not exit in a theoretical sense, it's not
really helpful to try to ignore the effect and pretend that bb35
post-dominates entry.  Worse, we pretend the infinite loop does
nothing (it's usually considered a side-effect), and doesn't even
exist, even when it calls a function.  Sadly, this makes it impossible
to use when you are trying to move code safely.  All compilers also
create virtual or real single exit nodes (including us), and connect
infinite loops there (which this patch does).  In fact, others have
worked around our behavior here, to the point of building their own
post-dom trees:
https://zneak.github.io/fcd/2016/02/17/structuring.html and pointing
out the region infrastructure is near-useless for them with postdom in
this state :(

Completely empty post-dom tree:
```
define void @spam() #0 {
bb:
  br label %bb1

bb1:                                              ; preds = %bb1, %bb
  br label %bb1

bb2:                                              ; No predecessors!
  ret void
}
```
Printing analysis 'Post-Dominator Tree Construction' for function 'foo':
=============================--------------------------------
Inorder PostDominator Tree:
  [1]  <<exit node>> {0,1}

:(

(note that even if you ignore the effects of infinite loops, bb2
should be present as an exit node that post-dominates nothing).

This patch changes post-dom to properly handle infinite loops and does
root finding during calculation to prevent empty tress in such cases.

We match gcc's (and the canonical theoretical) behavior for infinite
loops (find the backedge, connect it to the exit block).

Testcases coming as soon as i finish running this on a ton of random graphs :)

Reviewers: chandlerc, davide

Subscribers: bryant, llvm-commits

Differential Revision: https://reviews.llvm.org/D29705

llvm-svn: 296535
2017-02-28 22:57:50 +00:00
..
ADCE [ADCE] Add code to remove dead branches 2016-12-13 16:42:18 +00:00
AddDiscriminators Encode duplication factor from loop vectorization and loop unrolling to discriminator. 2017-02-10 21:09:07 +00:00
AlignmentFromAssumptions
ArgumentPromotion Verifier: Disallow a line number without a file in DISubprogram 2017-02-17 23:57:42 +00:00
AtomicExpand
BBVectorize Introduce -unroll-partial-threshold to separate PartialThreshold from Threshold in loop unorller. 2017-01-17 23:39:33 +00:00
BDCE [BDCE] Skip metadata while replacing uses. 2016-12-07 21:47:32 +00:00
BranchFolding
CodeExtractor
CodeGenPrepare [CGP] Split some critical edges coming out of indirect branches 2017-02-28 00:11:34 +00:00
ConstProp opt: Rename -default-data-layout flag to -data-layout and make it always override the layout. 2017-02-17 17:36:52 +00:00
ConstantHoisting
ConstantMerge
Coroutines [coroutines] Spill the result of the invoke instruction correctly 2017-01-25 02:25:54 +00:00
CorrelatedValuePropagation Revert r282872 "CVP. Turn marking adds as no wrap on by default" 2017-02-23 22:29:00 +00:00
CountingFunctionInserter Add a counter-function insertion pass 2016-09-01 09:42:39 +00:00
CrossDSOCFI
DCE llvm/test/Transforms/DCE/calls-errno.ll: Suppress checking @pow(+0,-1). 2016-11-04 18:50:45 +00:00
DeadArgElim DeadArgElim: Don't mark swifterror arguments as unused 2016-09-21 15:29:08 +00:00
DeadStoreElimination
EarlyCSE [EarlyCSE] Don't DSE across readnone functions that may throw 2017-01-17 20:15:47 +00:00
EliminateAvailableExternally
Float2Int
ForcedFunctionAttrs
FunctionAttrs [FunctionAttrs] try to extend nonnull-ness of arguments from a callsite back to its parent function 2017-02-13 23:10:51 +00:00
FunctionImport [ModuleSummaryAnalysis] Don't crash when referencing unnamed globals. 2017-02-22 18:53:38 +00:00
GCOVProfiling [IR] Remove the DIExpression field from DIGlobalVariable. 2016-12-20 02:09:43 +00:00
GVN opt: Rename -default-data-layout flag to -data-layout and make it always override the layout. 2017-02-17 17:36:52 +00:00
GVNHoist Fix my GVNHoist test case from r294317 2017-02-07 17:35:53 +00:00
GlobalDCE [PH] Replace uses of AssertingVH from members of analysis results with 2017-01-24 12:55:57 +00:00
GlobalMerge Renumber testcase metadata nodes after r290153. 2016-12-22 00:45:21 +00:00
GlobalOpt Verifier: Disallow a line number without a file in DISubprogram 2017-02-17 23:57:42 +00:00
GlobalSplit [GlobalSplit] Port to the new pass manager. 2016-11-21 00:28:23 +00:00
GuardWidening
IPConstantProp [IPCP] Don't propagate return value for naked functions. 2017-02-04 19:44:14 +00:00
IRCE [IRCE] Add a missing invariant check 2017-02-07 23:59:07 +00:00
IndVarSimplify [ValueTracking] Don't do an unchecked shift in ComputeNumSignBits 2017-02-25 20:30:45 +00:00
InferAddressSpaces Bug 31948: Fix assertion when bitcasting constantexpr pointers 2017-02-17 00:32:19 +00:00
InferFunctionAttrs [InferAttributes] Don't access parameters that don't exist. 2016-09-20 23:10:31 +00:00
Inline Strip debug info when inlining into a nodebug function. 2017-02-28 16:58:13 +00:00
InstCombine AMDGPU: Basic folds for fmed3 intrinsic 2017-02-27 23:08:49 +00:00
InstMerge Remove the load hoisting code of MLSM, it is completely subsumed by GVNHoist 2017-01-24 19:55:36 +00:00
InstSimplify [InstSimplify] add nsw/nuw (xor X, signbit), signbit --> X 2017-02-18 21:59:09 +00:00
InterleavedAccess [ARM] Don't lower f16 interleaved accesses. 2017-02-11 01:53:00 +00:00
Internalize
JumpThreading [JumpThreading] Re-enable JumpThreading for guards 2017-02-17 04:21:14 +00:00
LCSSA
LICM Correct a typo, s/hosting/hoisting/ 2017-02-14 16:41:10 +00:00
LoadCombine [LoadCombine] Change test to not use instcombine. 2017-02-10 00:44:08 +00:00
LoadStoreVectorizer LoadStoreVectorizer: Split even sized illegal chains properly 2017-02-23 03:58:53 +00:00
LoopDataPrefetch [PM] Port LoopDataPrefetch AArch64 tests to new pass manager 2016-08-22 12:59:58 +00:00
LoopDeletion [PM] Teach LoopDeletion to correctly update the LPM when loops are 2017-01-18 02:41:26 +00:00
LoopDistribute Move test of lazy BFI with ORE to a generic directory 2017-01-13 00:16:23 +00:00
LoopIdiom Fix some broken CHECK lines. 2017-01-22 20:28:56 +00:00
LoopInterchange [LoopInterchange] Track all dependencies, not just anti dependencies. 2016-09-21 19:16:47 +00:00
LoopLoadElim [PM] Port LoopLoadElimination to the new pass manager and wire it into 2017-01-27 01:32:26 +00:00
LoopPredication Loop predication expand both sides of the widened condition 2017-02-27 15:44:49 +00:00
LoopReroll [LoopReroll] Make root-finding more aggressive. 2016-11-21 22:35:34 +00:00
LoopRotate Revert @llvm.assume with operator bundles (r289755-r289757) 2016-12-19 08:22:17 +00:00
LoopSimplify [BasicBlockUtils] Use getFirstNonPHIOrDbg to set debugloc for instructions created in SplitBlockPredecessors 2017-02-14 21:10:40 +00:00
LoopSimplifyCFG
LoopStrengthReduce [LSR] Canonicalize formula and put recursive Reg related with current loop in ScaledReg. 2017-02-22 21:47:08 +00:00
LoopUnroll [LoopUnroll] Enable PGO-based loop peeling by default. 2017-02-22 00:27:34 +00:00
LoopUnswitch Fix a bug when unswitching on partial LIV for SwitchInst 2017-02-27 18:00:13 +00:00
LoopVectorize [AVX-512] Fix the execution domain for AVX-512 integer broadcasts. 2017-02-26 06:45:51 +00:00
LoopVersioning [LDist] Match behavior between invoking via optimization pipeline or opt -loop-distribute 2016-12-21 04:07:40 +00:00
LoopVersioningLICM [Loop Vectorizer] Fixed memory confilict checks. 2016-08-28 08:53:53 +00:00
LowerAtomic
LowerExpectIntrinsic [Profile] handle select instruction in 'expect' lowering 2016-09-02 22:03:40 +00:00
LowerGuardIntrinsic
LowerInvoke
LowerSwitch
LowerTypeTests IR: Type ID summary extensions for WPD; thread summary into WPD pass. 2017-02-13 19:26:18 +00:00
Mem2Reg
MemCpyOpt [MemCpyOpt] Don't sink LoadInst below possible clobber. 2016-12-27 17:58:12 +00:00
MergeFunc MergeFunctions: Preserve debug info in thunks, under option -mergefunc-preserve-debug-info 2017-01-21 02:02:56 +00:00
MetaRenamer
NameAnonGlobals [ThinLTO] Ensure anonymous globals renamed even at -O0 2016-09-17 20:40:16 +00:00
NaryReassociate Revert @llvm.assume with operator bundles (r289755-r289757) 2016-12-19 08:22:17 +00:00
NewGVN PredicateInfo: Support switch statements 2017-02-22 22:20:58 +00:00
ObjCARC [ObjCARC] Traverse chain downwards to replace uses of argument passed to 2016-09-13 23:43:11 +00:00
PGOProfile [PGO] Directory name stripping in global identifier for static functions 2017-02-25 00:00:36 +00:00
PartiallyInlineLibCalls Add positive test for sqrt "partial inlining". NFC. 2017-01-04 21:24:56 +00:00
PhaseOrdering
PlaceSafepoints
PreISelIntrinsicLowering
PruneEH [PruneEH] Be correct in the face IPO 2016-10-03 19:35:30 +00:00
Reassociate [Reassociate] Add negated value of negative constant to the Duplicates list. 2017-02-23 18:49:03 +00:00
Reg2Mem
RewriteStatepointsForGC [RS4GC] Strengthen coverage: add more tests 2016-10-07 20:34:00 +00:00
SCCP opt: Rename -default-data-layout flag to -data-layout and make it always override the layout. 2017-02-17 17:36:52 +00:00
SLPVectorizer [SLP] Load sorting should not try to sort things that aren't loads. 2017-02-27 23:18:11 +00:00
SROA [DIExpression] Introduce a dedicated DW_OP_LLVM_fragment operation 2016-12-05 18:04:47 +00:00
SafeStack [Fuchsia] Use thread-pointer ABI slots for stack-protector and safe-stack 2017-02-24 03:10:10 +00:00
SampleProfile Add function importing info from samplepgo profile to the module summary. 2017-02-28 18:09:44 +00:00
Scalarizer
SeparateConstOffsetFromGEP
SimplifyCFG opt: Rename -default-data-layout flag to -data-layout and make it always override the layout. 2017-02-17 17:36:52 +00:00
Sink
SpeculativeExecution SpeculativeExecution: Allow speculating more inst types 2016-10-28 20:00:33 +00:00
StraightLineStrengthReduce
StripDeadPrototypes
StripSymbols Renumber testcase metadata nodes after r290153. 2016-12-22 00:45:21 +00:00
StructurizeCFG Fix PR 24415 (at least), by making our post-dominator tree behavior sane. 2017-02-28 22:57:50 +00:00
TailCallElim Avoid tail recursion elimination across calls with operand bundles 2016-11-07 21:01:49 +00:00
ThinLTOBitcodeWriter ThinLTOBitcodeWriter: Write available_externally copies of VCP eligible functions to merged module. 2017-02-14 03:42:38 +00:00
Util PredicateInfo: Support switch statements 2017-02-22 22:20:58 +00:00
WholeProgramDevirt WholeProgramDevirt: For VCP use a 32-bit ConstantInt for the byte offset. 2017-02-17 19:43:45 +00:00