llvm-project/llvm/test/Transforms/SCCP
Eli Friedman 278299b0f0 [SCCP] Reduce the number of times ResolvedUndefsIn is called for large modules.
If a module has many values that need to be resolved by
ResolvedUndefsIn, compilation takes quadratic time overall. Solve should
do a small amount of work, since not much is added to the worklists each
time markOverdefined is called. But ResolvedUndefsIn is linear over the
length of the function/module, so resolving one undef at a time is
quadratic in general.

To solve this, make ResolvedUndefsIn resolve every undef value at once,
instead of resolving them one at a time. This loses a little
optimization power, but can be a lot faster.

We still need a loop around ResolvedUndefsIn because markOverdefined
could change the set of blocks that are live. That should be uncommon,
hopefully. We could optimize it by tracking which blocks transition from
dead to live, instead of iterating over the whole module to find them.
But I'll leave that for later. (The whole function will become a lot
simpler once we start pruning branches on undef.)

The regression test changes seem minor. The specific cases in question
could probably be optimized with a bit more work, but they seem like
edge cases that don't really matter.

Fixes an "infinite" compile issue my team found on an internal workoad.

Differential Revision: https://reviews.llvm.org/D89080
2020-10-09 15:24:16 -07:00
..
2002-05-02-MissSecondInst.ll
2002-05-20-MissedIncomingValue.ll
2002-05-21-InvalidSimplify.ll
2002-08-30-GetElementPtrTest.ll
2003-06-24-OverdefinedPHIValue.ll
2003-08-26-InvokeHandling.ll
2004-11-16-DeadInvoke.ll
2004-12-10-UndefBranchBug.ll [SCCP] Reduce the number of times ResolvedUndefsIn is called for large modules. 2020-10-09 15:24:16 -07:00
2006-10-23-IPSCCP-Crash.ll
2006-12-04-PackedType.ll
2006-12-19-UndefBug.ll Recommit "[SCCP] Remove forcedconstant, go to overdefined instead" 2020-02-15 18:36:44 +01:00
2007-05-16-InvokeCrash.ll
2008-01-27-UndefCorrelate.ll
2008-04-22-multiple-ret-sccp.ll
2008-05-23-UndefCallFold.ll
2008-06-09-WeakProp.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
2009-01-14-IPSCCP-Invoke.ll
2009-05-27-VectorOperandZero.ll
2009-09-24-byval-ptr.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
PR16052.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
PR26044.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
PR43857.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
apfloat-basictest.ll
apint-array.ll
apint-basictest.ll
apint-basictest2.ll
apint-basictest3.ll
apint-basictest4.ll
apint-bigarray.ll
apint-bigint.ll
apint-bigint2.ll Revert "Recommit "[SCCP] Do not replace deref'able ptr with un-deref'able one."" 2020-09-29 09:18:19 +01:00
apint-ipsccp1.ll
apint-ipsccp2.ll
apint-ipsccp3.ll Recommit "[SCCP] Remove forcedconstant, go to overdefined instead" 2020-02-15 18:36:44 +01:00
apint-ipsccp4.ll
apint-load.ll
apint-phi.ll
apint-select.ll Recommit "[SCCP] Remove forcedconstant, go to overdefined instead" 2020-02-15 18:36:44 +01:00
apint-xor.ll [SCCP] Add a few more tests for conditional propagation,XOR. 2020-03-22 21:43:33 +00:00
arg-count-mismatch.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
arg-type-mismatch.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
assume.ll [SCCP] Propagate inequalities 2020-08-04 20:20:52 +02:00
atomic-load-store.ll
atomic.ll
binaryops-constexprs.ll [SCCP] Add test case for binary ops with constant expressions. 2020-04-09 13:38:43 +01:00
binaryops-range-special-cases.ll [SCCP] Use constant ranges for PHI nodes. 2020-03-19 12:45:33 +00:00
bitcast.ll
calltest.ll
comdat-ipo.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
conditions-iter-order.ll [SCCP] Add a few more tests for conditional propagation,XOR. 2020-03-22 21:43:33 +00:00
conditions-ranges-with-undef.ll [SCCP] Use ranges for predicate info conditions. 2020-04-07 11:09:18 +01:00
conditions-ranges.ll Reapply [SCCP] Directly remove non-feasible edges 2020-07-25 14:52:35 +02:00
constant-range-struct.ll [SCCP] Switch to widen at PHIs, stores and call edges. 2020-05-29 11:59:17 +01:00
constant-struct.ll
crash.ll
dangling-block-address.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
deadarg.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
definite-initializer.ll
domtree-update.ll Reapply [SCCP] Directly remove non-feasible edges 2020-07-25 14:52:35 +02:00
dont-zap-return.ll
float-nan-simplification.ll Recommit "[SCCP] Use SimplifyBinOp for non-integer constant/expressions & overdef." 2020-04-14 11:48:52 +01:00
float-phis.ll [ValueLattice] Add new state for undef constants. 2020-03-14 17:19:59 +00:00
fp-bc-icmp-const-fold.ll Re-land "[PowerPC] Remove QPX/A2Q BGQ/BGP CNK support" 2020-07-28 14:00:11 +00:00
global-alias-constprop.ll
global.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
indirectbr.ll Revert "Recommit "[SCCP] Do not replace deref'able ptr with un-deref'able one."" 2020-09-29 09:18:19 +01:00
int-phis.ll [ValueLattice] Add new state for undef constants. 2020-03-14 17:19:59 +00:00
intrinsics.ll [SCCP] Compute ranges for supported intrinsics 2020-09-07 22:16:06 +02:00
ip-add-range-to-call.ll [SCCP] Add range metadata to call sites with known return ranges. 2020-07-21 10:06:54 +01:00
ip-constant-ranges.ll [SCCP] Use ranges for predicate info conditions. 2020-04-07 11:09:18 +01:00
ip-ranges-binaryops.ll [SCCP] Use constant ranges for binary operators. 2020-03-19 09:35:48 +00:00
ip-ranges-casts.ll [SCCP] Turn sext into zext for non-negative ranges. 2020-06-19 10:17:55 +01:00
ip-ranges-phis.ll [SCCP] Use constant ranges for PHI nodes. 2020-03-19 12:45:33 +00:00
ip-ranges-select.ll [SCCP] Use constant ranges for select, if cond is overdefined. 2020-03-18 09:26:02 +00:00
ip-ranges-sext.ll [SCCP] Turn sext into zext for non-negative ranges. 2020-06-19 10:17:55 +01:00
ipsccp-addr-taken.ll
ipsccp-basic.ll Recommit "[SCCP] Remove forcedconstant, go to overdefined instead" 2020-02-15 18:36:44 +01:00
ipsccp-branch-unresolved-undef.ll
ipsccp-clear-returned.ll [IPSCCP] Fix a bug that the "returned" attribute is not cleared when function is optimized to return undef 2020-09-02 11:21:48 -04:00
ipsccp-cycles.ll [SCCP] Switch to widen at PHIs, stores and call edges. 2020-05-29 11:59:17 +01:00
ipsccp-phi-one-pred-dead.ll
ipsccp-predinfo-order.ll
ipsccp-preserve-analysis.ll [NewPM] Don't print 'Invalidating all non-preserved analyses' 2020-07-30 19:40:29 -07:00
ipsccp-range-crashes.ll [SCCP] Precommit some additional tests for integer ranges. 2020-03-18 11:34:04 +00:00
ipsccp-ssa-copy-nested-conds.ll [SCCP] Add tests with AND/OR branch conditions. 2020-04-09 16:39:13 +01:00
ipscp-drop-argmemonly.ll [IPSCCP] Drop argmemonly after replacing pointer argument. 2020-07-25 11:52:14 +01:00
latticeval-invalidate.ll
load-store-range.ll [SCCP] Support ranges for loads and stores. 2020-04-26 13:16:47 +01:00
loadtest.ll [SCCP] Do not mark unknown loads as overdefined. 2020-02-20 22:48:58 +01:00
loadtest2.ll [SCCP] Do not mark unknown loads as overdefined. 2020-02-20 22:48:58 +01:00
logical-nuke.ll Recommit "[SCCP] Remove forcedconstant, go to overdefined instead" 2020-02-15 18:36:44 +01:00
metadata.ll [SCCP] Propagate inequalities 2020-08-04 20:20:52 +02:00
multiple_callbacks.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
musttail-call.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
naked-return.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
openmp_parallel_for.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
overdefined-div.ll
phi-cycle.ll [ValueLattice] Distinguish between constant ranges with/without undef. 2020-03-31 12:50:20 +01:00
phis.ll [SCCP] Use constant ranges for PHI nodes. 2020-03-19 12:45:33 +00:00
pr27712.ll
pr35357.ll
pr45185-range-predinfo.ll Recommit "[SCCP] Use ValueLatticeElement instead of LatticeVal (NFCI)" 2020-03-13 17:03:22 +00:00
predicateinfo-cond.ll Reapply [SCCP] Directly remove non-feasible edges 2020-07-25 14:52:35 +02:00
preserve-analysis.ll [NewPM] Pin tests with -debug-pass to legacy PM 2020-09-22 17:54:25 -07:00
pthreads.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
range-and-ip.ll [ValueLattice] Distinguish between constant ranges with/without undef. 2020-03-31 12:50:20 +01:00
range-and.ll [ValueLattice] Distinguish between constant ranges with/without undef. 2020-03-31 12:50:20 +01:00
ranges-sext.ll [SCCP] Turn sext into zext for non-negative ranges. 2020-06-19 10:17:55 +01:00
recursion.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
remove-call-inst.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
replace-dereferenceable-ptr-with-undereferenceable.ll Revert "Recommit "[SCCP] Do not replace deref'able ptr with un-deref'able one."" 2020-09-29 09:18:19 +01:00
resolvedundefsin-tracked-fn.ll [SCCP] Reduce the number of times ResolvedUndefsIn is called for large modules. 2020-10-09 15:24:16 -07:00
return-argument.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
return-constant.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
return-constants.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
return-zapped.ll
retvalue-undef.ll
sccptest.ll
select.ll [SCCP] Use constant ranges for select, if cond is overdefined. 2020-03-18 09:26:02 +00:00
solve-after-each-resolving-undefs-for-function.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
struct-arg-resolve-undefs.ll
switch-constantfold-crash.ll Reapply [SCCP] Directly remove non-feasible edges 2020-07-25 14:52:35 +02:00
switch-multiple-undef.ll Recommit "[SCCP] Remove forcedconstant, go to overdefined instead" 2020-02-15 18:36:44 +01:00
switch-undef-constantfoldterminator.ll
switch.ll [SCCP] Remove dead switch cases based on range information 2020-07-30 21:21:08 +02:00
thread_local_acs.ll Recommit "[IPConstProp] Remove and move tests to SCCP." 2020-08-02 22:23:54 +01:00
ub-shift.ll Recommit "[SCCP] Use SimplifyBinOp for non-integer constant/expressions & overdef." 2020-04-14 11:48:52 +01:00
ubsan_overflow.ll
undef-resolve.ll Recommit "[SCCP] Remove forcedconstant, go to overdefined instead" 2020-02-15 18:36:44 +01:00
user-with-multiple-uses.ll [SCCP] Move tests using only ipsccp from IPConstantProp to SCCP (NFC). 2020-07-09 17:16:15 +01:00
vector-bitcast.ll Recommit "[SCCP] Use SimplifyBinOp for non-integer constant/expressions & overdef." 2020-04-14 11:48:52 +01:00
widening.ll Reapply [SCCP] Directly remove non-feasible edges 2020-07-25 14:52:35 +02:00