llvm-project/llvm/test/Transforms/SimplifyCFG
Gerolf Hoflehner 2432bd0ddd [SimplifyCFG] Fix for "endless" loop after dead code removal (Alternative to
D16251)

Summary:
This is a simpler fix to the problem than the dominator approach in
http://reviews.llvm.org/D16251. It adds only values into the gather() while loop
that have been seen before.

The actual endless loop is in the constant compare gather() routine in
Utils/SimplifyCFG.cpp. The same value ret.0.off0.i is pushed back into the
queue:
%.ret.0.off0.i = or i1 %.ret.0.off0.i, %cmp10.i

Here is what happens at the IR level:

for.cond.i:                                       ; preds = %if.end6.i,
%if.end.i54
%ix.0.i = phi i32 [ 0, %if.end.i54 ], [ %inc.i55, %if.end6.i ]
%ret.0.off0.i = phi i1 [false, %if.end.i54], [%.ret.0.off0.i, %if.end6.i] <<<
%cmp2.i = icmp ult i32 %ix.0.i, %11
br i1 %cmp2.i, label %for.body.i, label %LBJ_TmpSimpleNeedExt.exit

if.end6.i:                                        ; preds = %for.body.i
%cmp10.i = icmp ugt i32 %conv.i, %add9.i
%.ret.0.off0.i = or i1 %ret.0.off0.i, %cmp10.i <<<

When if.end.i54 gets eliminated which removes the definition of ret.0.off0.i.
The result is the expression %.ret.0.off0.i = or i1 %.ret.0.off0.i, %cmp10.i
(Note the first ‘or’ operand is now %.ret.0.off0.i, and *NOT* %ret.0.off0.i).
And
now there is use of .ret.0.off0.i before a definition which triggers the
“endless” loop in gather():

while(!DFT.empty()) {

    V = DFT.pop_back_val();   // V is .ret.0.off0.i

    if (Instruction *I = dyn_cast<Instruction>(V)) {
      // If it is a || (or && depending on isEQ), process the operands.
      if (I->getOpcode() == (isEQ ? Instruction::Or : Instruction::And)) {
        DFT.push_back(I->getOperand(1));  // This is now .ret.0.off0.i also
        DFT.push_back(I->getOperand(0));

        continue; // “endless loop” for .ret.0.off0.i
      }

Reviewers: reames, ahatanak

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D16839

llvm-svn: 259730
2016-02-03 23:54:25 +00:00
..
AArch64 [AArch64] add overrides for isCheapToSpeculateCttz() and isCheapToSpeculateCtlz() 2015-11-10 18:11:37 +00:00
AMDGPU AMDGPU: Fix some places missed in rename 2015-06-19 17:39:03 +00:00
ARM [ARM] add overrides for isCheapToSpeculateCttz() and isCheapToSpeculateCtlz() 2015-11-10 19:24:31 +00:00
Mips [MIPS] add overrides for isCheapToSpeculateCttz() and isCheapToSpeculateCtlz() 2015-11-11 17:24:56 +00:00
PowerPC [CodeGenPrepare] Removed duplicate logic. SimplifyCFG already knows how to speculate calls to cttz/ctlz. 2015-02-13 14:15:48 +00:00
SPARC
X86 [SimplifyCFG] limit recursion depth when speculating instructions (PR26308) 2016-01-27 19:22:45 +00:00
2002-05-21-PHIElimination.ll
2002-09-24-PHIAssertion.ll
2003-03-07-DominateProblem.ll
2003-08-05-InvokeCrash.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
2003-08-17-BranchFold.ll
2003-08-17-BranchFoldOrdering.ll
2003-08-17-FoldSwitch-dbg.ll [opaque pointer type] Add textual IR support for explicit type parameter to gep operator 2015-03-13 18:20:45 +00:00
2003-08-17-FoldSwitch.ll
2004-12-10-SimplifyCFGCrash.ll
2005-06-16-PHICrash.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
2005-08-01-PHIUpdateFail.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
2005-10-02-InvokeSimplify.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
2005-12-03-IncorrectPHIFold.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
2006-02-17-InfiniteUnroll.ll
2006-06-12-InfLoop.ll
2006-08-03-Crash.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
2006-10-19-UncondDiv.ll
2006-12-08-Ptr-ICmp-Branch.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
2007-11-22-InvokeNoUnwind.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
2007-12-21-Crash.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
2008-01-02-hoist-fp-add.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
2008-05-16-PHIBlockMerge.ll
2008-07-13-InfLoopMiscompile.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
2008-09-08-MultiplePred.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
2008-09-17-SpeculativeHoist.ll
2008-10-03-SpeculativelyExecuteBeforePHI.ll
2008-12-06-SingleEntryPhi.ll
2008-12-16-DCECond.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
2009-01-18-PHIPropCrash.ll
2009-01-19-UnconditionalTrappingConstantExpr.ll
2009-05-12-externweak.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
2010-03-30-InvokeCrash.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
2011-03-08-UnreachableUse.ll
2011-09-05-TrivialLPad.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
BrUnwind.ll
CoveredLookupTable.ll
DeadSetCC.ll
EmptyBlockMerge.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
EqualPHIEdgeBlockMerge.ll
ForwardSwitchConditionToPHI.ll
HoistCode.ll
InfLoop.ll [SimplifyCFG] Fix for "endless" loop after dead code removal (Alternative to 2016-02-03 23:54:25 +00:00
MagicPointer.ll [opaque pointer type] Add textual IR support for explicit type parameter to gep operator 2015-03-13 18:20:45 +00:00
PHINode.ll
PR9946.ll
PR16069.ll
PR17073.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
PR25267.ll [SimplifyCFG] Don't use-after-free an SSA value 2015-10-21 18:22:24 +00:00
PhiBlockMerge.ll [SimplifyCFG] Swap to using TargetTransformInfo for cost 2015-02-11 12:15:41 +00:00
PhiBlockMerge2.ll
PhiEliminate.ll
PhiEliminate2.ll
PhiEliminate3.ll
PhiNoEliminate.ll
SpeculativeExec.ll Revert "Revert "Strip metadata when speculatively hoisting instructions (r252604)" 2015-11-18 14:50:18 +00:00
UncondBranchToReturn.ll
UnreachableEliminate.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
assume.ll
attr-noduplicate.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
basictest.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
branch-cond-merge.ll
branch-cond-prop.ll
branch-fold-dbg.ll DI: Reverse direction of subprogram -> function edge. 2015-11-05 22:03:56 +00:00
branch-fold-test.ll
branch-fold-threshold.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
branch-fold.ll
branch-phi-thread.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
bug-25299.ll [SimplifyCFG] Extend SimplifyResume to handle phi of trivial landing pad. 2016-01-10 05:48:01 +00:00
clamp.ll [SimplifyCFG] Add test for r229099 2015-02-13 11:08:40 +00:00
common-dest-folding.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
dbginfo.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
dce-cond-after-folding-terminator.ll
duplicate-landingpad.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
duplicate-phis.ll
empty-catchpad.ll [WinEH] Simplify unreachable catchpads 2016-01-05 02:37:41 +00:00
empty-cleanuppad.ll [IR] Remove terminatepad 2015-12-14 18:34:23 +00:00
extract-cost.ll
hoist-common-code.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
hoist-dbgvalue.ll DI: Reverse direction of subprogram -> function edge. 2015-11-05 22:03:56 +00:00
hoist-with-range.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
implied-cond.ll [SimplifyCFG] Constant fold a branch implied by it's incoming edge 2015-10-29 03:11:49 +00:00
indirectbr.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
invoke.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
invoke_unwind.ll [SimplifyCFG] Extend SimplifyResume to handle phi of trivial landing pad. 2016-01-10 05:48:01 +00:00
iterative-simplify.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
lifetime.ll
merge-cond-stores-2.ll Tweak unnamed label syntax in textual IR for easier matching in tests. 2016-01-27 21:53:08 +00:00
merge-cond-stores.ll Revert "Don't create unnecessary PHIs" 2015-12-14 22:36:57 +00:00
multiple-phis.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
no_speculative_loads_with_asan.ll [asan] Disabling speculative loads under asan. Patch by Mike Aizatsky 2015-10-14 00:21:05 +00:00
no_speculative_loads_with_tsan.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
noreturn-call.ll
phi-undef-loadstore.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
preserve-branchweights-partial.ll IR: Make metadata typeless in assembly 2014-12-15 19:07:53 +00:00
preserve-branchweights-switch-create.ll IR: Make metadata typeless in assembly 2014-12-15 19:07:53 +00:00
preserve-branchweights.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
preserve-load-metadata-2.ll Preserve load alignment and dereferenceable metadata during some transformations 2015-11-02 17:53:51 +00:00
preserve-load-metadata-3.ll Preserve load alignment and dereferenceable metadata during some transformations 2015-11-02 17:53:51 +00:00
preserve-load-metadata.ll Preserve load alignment and dereferenceable metadata during some transformations 2015-11-02 17:53:51 +00:00
preserve-make-implicit-on-switch-to-br.ll [ConstantFoldTerminator] Preserve make.implicit metadata when converting SwitchInst to BranchInst 2015-08-07 19:30:12 +00:00
return-merge.ll
seh-nounwind.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
select-gep.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
sink-common-code.ll [SimplifyCFG] Revise common code sinking 2014-12-23 08:26:55 +00:00
speculate-math.ll Revert "Revert "[SimplifyCFG] allow speculation of exactly one expensive instruction (PR24818)"" 2016-01-27 02:59:41 +00:00
speculate-store.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
speculate-vector-ops.ll
speculate-with-offset.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
statepoint-invoke-unwind.ll [gc.statepoint] Change gc.statepoint intrinsic's return type to token type instead of i32 type 2015-12-26 07:54:32 +00:00
switch-dead-default.ll [SimplifyCFG] Use known bits to eliminate dead switch defaults 2015-09-10 17:44:47 +00:00
switch-masked-bits.ll
switch-on-const-select.ll
switch-range-to-icmp.ll SimplifyCFG: don't remove unreachable default switch destinations 2015-01-26 19:52:32 +00:00
switch-simplify-crash.ll
switch-to-br.ll Add some tests for SimplifyCFG's ConstantFoldTerminator(). NFC. 2014-12-04 22:19:25 +00:00
switch-to-icmp.ll
switch-to-select-multiple-edge-per-block-phi.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
switch-to-select-two-case.ll SimplifyCFG: don't remove unreachable default switch destinations 2015-01-26 19:52:32 +00:00
switch_create.ll [SimplifyCFG] Don't mistake icmp of and for a tree of comparisons 2016-01-27 02:43:28 +00:00
switch_switch_fold.ll
switch_thread.ll
trap-debugloc.ll DI: Reverse direction of subprogram -> function edge. 2015-11-05 22:03:56 +00:00
trapping-load-unreachable.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
two-entry-phi-return.ll
unreachable-blocks.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
volatile-phioper.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
wineh-unreachable.ll [SimplifyCFG] Further improve our ability to remove redundant catchpads 2016-01-05 07:42:17 +00:00