llvm/test/Transforms/SimplifyCFG
Arnold Schwaighofer 8228ffe72d SimplifyCFG: If convert single conditional stores
This resurrects r179957, but adds code that makes sure we don't touch
atomic/volatile stores:

This transformation will transform a conditional store with a preceeding
uncondtional store to the same location:

 a[i] =
 may-alias with a[i] load
 if (cond)
   a[i] = Y

into an unconditional store.

 a[i] = X
 may-alias with a[i] load
 tmp = cond ? Y : X;
 a[i] = tmp

We assume that on average the cost of a mispredicted branch is going to be
higher than the cost of a second store to the same location, and that the
secondary benefits of creating a bigger basic block for other optimizations to
work on outway the potential case where the branch would be correctly predicted
and the cost of the executing the second store would be noticably reflected in
performance.

hmmer's execution time improves by 30% on an imac12,2 on ref data sets. With
this change we are on par with gcc's performance (gcc also performs this
transformation). There was a 1.2 % performance improvement on a ARM swift chip.
Other tests in the test-suite+external seem to be mostly uninfluenced in my
experiments:
This optimization was triggered on 41 tests such that the executable was
different before/after the patch. Only 1 out of the 40 tests (dealII) was
reproducable below 100% (by about .4%). Given that hmmer benefits so much I
believe this to be a fair trade off.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180731 91177308-0d34-0410-b5e6-96231b3b80d8
2013-04-29 21:28:24 +00:00
..
SPARC Use TargetTransformInfo to control switch-to-lookup table transformation 2012-10-30 11:23:25 +00:00
X86 Fix logic to determine whether to turn a switch into a lookup table. When 2012-11-30 02:02:42 +00:00
2002-05-21-PHIElimination.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2002-09-24-PHIAssertion.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2003-03-07-DominateProblem.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2003-08-05-InvokeCrash.ll Update tests to new EH model. Add landingpad instructions to landing pads. 2011-08-29 20:39:23 +00:00
2003-08-17-BranchFold.ll Converted 8x tests of SimplifyCFG to use FileCheck instead of grep. 2013-04-09 05:18:53 +00:00
2003-08-17-BranchFoldOrdering.ll Converted 8x tests of SimplifyCFG to use FileCheck instead of grep. 2013-04-09 05:18:53 +00:00
2003-08-17-FoldSwitch-dbg.ll Converted 8x tests of SimplifyCFG to use FileCheck instead of grep. 2013-04-09 05:18:53 +00:00
2003-08-17-FoldSwitch.ll Converted 8x tests of SimplifyCFG to use FileCheck instead of grep. 2013-04-09 05:18:53 +00:00
2004-12-10-SimplifyCFGCrash.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2005-06-16-PHICrash.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2005-08-01-PHIUpdateFail.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2005-10-02-InvokeSimplify.ll Update tests to new EH model. Add landingpad instructions to landing pads. 2011-08-29 20:39:23 +00:00
2005-12-03-IncorrectPHIFold.ll Converted 8x tests of SimplifyCFG to use FileCheck instead of grep. 2013-04-09 05:18:53 +00:00
2006-02-17-InfiniteUnroll.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2006-06-12-InfLoop.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2006-08-03-Crash.ll Improve the bail-out predicate to really only kick in when phi 2011-04-26 17:41:02 +00:00
2006-10-19-UncondDiv.ll Converted 8x tests of SimplifyCFG to use FileCheck instead of grep. 2013-04-09 05:18:53 +00:00
2006-12-08-Ptr-ICmp-Branch.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2007-11-22-InvokeNoUnwind.ll Converted 8x tests of SimplifyCFG to use FileCheck instead of grep. 2013-04-09 05:18:53 +00:00
2007-12-21-Crash.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2008-01-02-hoist-fp-add.ll Converted 8x tests of SimplifyCFG to use FileCheck instead of grep. 2013-04-09 05:18:53 +00:00
2008-05-16-PHIBlockMerge.ll Convert all tests using TCL-style quoting to use shell-style quoting. 2012-07-02 12:47:22 +00:00
2008-07-13-InfLoopMiscompile.ll Convert all tests using TCL-style quoting to use shell-style quoting. 2012-07-02 12:47:22 +00:00
2008-09-08-MultiplePred.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2008-09-17-SpeculativeHoist.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2008-10-03-SpeculativelyExecuteBeforePHI.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2008-12-06-SingleEntryPhi.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2008-12-16-DCECond.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2009-01-18-PHIPropCrash.ll Optimize test more. 2009-11-10 21:02:18 +00:00
2009-01-19-UnconditionalTrappingConstantExpr.ll Fix SpeculativelyExecuteBB to either speculate all or none of the phis 2012-01-05 23:58:56 +00:00
2009-05-12-externweak.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
2010-03-30-InvokeCrash.ll Tests: rewrite 'opt ... %s' to 'opt ... < %s' so that opt does not emit a ModuleID 2013-01-01 13:57:25 +00:00
2011-03-08-UnreachableUse.ll PR9420; an instruction before an unreachable is guaranteed not to have any 2011-03-09 00:48:33 +00:00
2011-09-05-TrivialLPad.ll Delete trivial landing pads that just continue unwinding the caught 2011-09-05 12:57:57 +00:00
basictest.ll Re-apply r124518 with fix. Watch out for invalidated iterator. 2011-01-29 04:46:23 +00:00
branch-cond-merge.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
branch-cond-prop.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
branch-fold-dbg.ll Tests: rewrite 'opt ... %s' to 'opt ... < %s' so that opt does not emit a ModuleID 2012-12-30 01:28:40 +00:00
branch-fold-test.ll Use opt -S instead of piping bitcode output through llvm-dis. 2009-09-08 22:34:10 +00:00
branch-fold.ll Remove dyn_cast + dereference pattern by replacing it with a cast and changing 2012-06-24 10:15:42 +00:00
branch-phi-thread.ll Fix the remaining TCL-style quotes found in the testsuite. This is 2012-07-02 19:09:46 +00:00
BrUnwind.ll Fix the remaining TCL-style quotes found in the testsuite. This is 2012-07-02 19:09:46 +00:00
dbginfo.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
dce-cond-after-folding-terminator.ll Add a parameter to ConstantFoldTerminator() that callers can use to ask it to also clean up the condition of any conditional terminator it folds to be unconditional, if that turns the condition into dead code. This just means it calls RecursivelyDeleteTriviallyDeadInstructions() in strategic spots. It defaults to the old behavior. 2011-05-22 16:24:18 +00:00
DeadSetCC.ll Fix the remaining TCL-style quotes found in the testsuite. This is 2012-07-02 19:09:46 +00:00
duplicate-phis.ll Convert all tests using TCL-style quoting to use shell-style quoting. 2012-07-02 12:47:22 +00:00
EmptyBlockMerge.ll Filecheckized 2x tests in SimplifyCFG and removed their date prefix to fit with current llvm style for test names. 2013-01-31 01:04:23 +00:00
EqualPHIEdgeBlockMerge.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
ForwardSwitchConditionToPHI.ll Fix PR10103: Less code for enum type translation. 2011-06-18 10:28:47 +00:00
hoist-common-code.ll fix a bunch of spurious failures for people whose home directory 2009-09-11 17:02:12 +00:00
hoist-dbgvalue.ll While hoisting common code from if/else, hoist debug info intrinsics if they match. 2011-04-07 17:27:36 +00:00
HoistCode.ll fix a bunch of spurious failures for people whose home directory 2009-09-11 17:02:12 +00:00
indirectbr.ll If the block that we're threading through is jumped to by an indirect branch, 2011-06-04 09:42:04 +00:00
invoke_unwind.ll Replace more uses of 'unwind' in the tests with calls to landingpad and 2011-09-19 22:11:35 +00:00
invoke.ll fix PR13339 (remove the predecessor from the unwind BB when removing an invoke) 2012-07-16 22:49:40 +00:00
iterative-simplify.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
lifetime.ll Add r134057 back, but splice the predecessor after the successors phi 2011-06-30 20:14:24 +00:00
lit.local.cfg Replace all instances of dg.exp file with lit.local.cfg, since all tests are run with LIT now and now Dejagnu. dg.exp is no longer needed. 2012-02-16 06:28:33 +00:00
MagicPointer.ll Re-apply r124518 with fix. Watch out for invalidated iterator. 2011-01-29 04:46:23 +00:00
multiple-phis.ll Fix SpeculativelyExecuteBB to either speculate all or none of the phis 2012-01-05 23:58:56 +00:00
noreturn-call.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
phi-undef-loadstore.ll SimplifyCFG: Enhance the "remove CFG edge that leads to null pointer dereference" optimization to also handle instructions with multiple uses. 2012-10-04 16:11:49 +00:00
PhiBlockMerge2.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
PhiBlockMerge.ll SimplifyCFG: Add CostRemaining parameter to DominatesMergePoint 2011-04-29 18:47:31 +00:00
PhiEliminate2.ll SimplifyCFG: Add Trunc, ZExt and SExt to the list of cheap instructions for phi node folding 2011-04-29 18:47:25 +00:00
PhiEliminate3.ll SimplifyCFG: Expose phi node folding cost threshold as command line parameter 2011-04-29 18:47:38 +00:00
PhiEliminate.ll - Insert new instructions before DomBlock's terminator, 2010-12-14 08:46:09 +00:00
PHINode.ll Filecheckized 2x tests in SimplifyCFG and removed their date prefix to fit with current llvm style for test names. 2013-01-31 01:04:23 +00:00
PhiNoEliminate.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
PR9946.ll Tests: rewrite 'opt ... %s' to 'opt ... < %s' so that opt does not emit a ModuleID 2013-01-01 13:57:25 +00:00
preserve-branchweights-partial.ll Remove an incorrect assert during branch weight propagation. 2012-09-08 00:07:26 +00:00
preserve-branchweights-switch-create.ll PGO: preserve branch-weight metadata when merging two switches where 2012-09-14 17:29:56 +00:00
preserve-branchweights.ll PGO: preserve branch-weight metadata when simplifying Switch to a sub, an icmp 2012-09-18 00:47:33 +00:00
return-merge.ll fix a bunch of spurious failures for people whose home directory 2009-09-11 17:02:12 +00:00
select-gep.ll Tests: rewrite 'opt ... %s' to 'opt ... < %s' so that opt does not emit a ModuleID 2012-12-30 01:28:40 +00:00
sink-common-code.ll SimplifyCFG: sink common codes from IF, ELSE blocks down to END block. 2012-09-20 22:37:36 +00:00
speculate-store.ll SimplifyCFG: If convert single conditional stores 2013-04-29 21:28:24 +00:00
speculate-with-offset.ll Factor out Instruction::isSafeToSpeculativelyExecute's code for 2010-11-11 21:23:25 +00:00
SpeculativeExec.ll Re-revert r173342, without losing the compile time improvements, flat 2013-01-27 06:42:03 +00:00
switch_create.ll Only do switch-to-lookup table transformation when TargetTransformInfo 2012-11-07 21:35:12 +00:00
switch_switch_fold.ll Use opt -S instead of piping bitcode output through llvm-dis. 2009-09-08 22:34:10 +00:00
switch_thread.ll Fix the remaining TCL-style quotes found in the testsuite. This is 2012-07-02 19:09:46 +00:00
switch-masked-bits.ll Fix SpeculativelyExecuteBB to either speculate all or none of the phis 2012-01-05 23:58:56 +00:00
switch-on-const-select.ll Use references to attribute groups on the call/invoke instructions. 2013-02-22 09:09:42 +00:00
switch-simplify-crash.ll Change tests from "opt %s" to "opt < %s" so that opt doesn't see the 2009-09-11 18:01:28 +00:00
switch-to-icmp.ll simplifycfg: Fix integer overflow converting switch into icmp. 2013-04-16 08:35:36 +00:00
trap-debugloc.ll Simplify cfg inserts a call to trap when unreachable code is detected. Assign DebugLoc to this new trap instruction. 2011-04-27 17:59:27 +00:00
trapping-load-unreachable.ll Update SimplifyCFG for atomic operations. 2011-08-15 23:59:28 +00:00
trivial-throw.ll Don't remove a landing pad if the invoke requires a table entry. 2013-03-11 20:53:00 +00:00
two-entry-phi-return.ll fix a bunch of spurious failures for people whose home directory 2009-09-11 17:02:12 +00:00
UncondBranchToReturn.ll Fix the remaining TCL-style quotes found in the testsuite. This is 2012-07-02 19:09:46 +00:00
unreachable-blocks.ll Make Value::isDereferenceablePointer() handle unreachable code blocks. (This 2012-01-23 00:05:17 +00:00
UnreachableEliminate.ll PR9450: Make switch optimization in SimplifyCFG not dependent on the ordering 2011-03-15 02:23:35 +00:00
volatile-phioper.ll SimplifyCFG fix for volatile load/store. 2013-03-07 01:03:35 +00:00