[PATCH][instcombine] Remove preservesCFG from instcombine
Mark Heffernan
meheff at google.com
Mon Nov 3 14:36:01 PST 2014
Here's the -debug-pass=Structure output from an O2 build of the repro code
I posted earlier. The '+' lines are new with the change:
Pass Arguments: -datalayout -notti -basictti -x86tti -no-aa -tbaa
-scoped-noalias -assumption-tracker -targetlibinfo -basicaa -verify
-simplifycfg -domtree -sroa -early-cse -lower-expect
Data Layout
No target information
Target independent code generator's TTI
X86 Target Transform Info
No Alias Analysis (always returns 'may' alias)
Type-Based Alias Analysis
Scoped NoAlias Alias Analysis
Assumption Tracker
Target Library Information
Basic Alias Analysis (stateless AA impl)
FunctionPass Manager
Module Verifier
Simplify the CFG
Dominator Tree Construction
SROA
Early CSE
Lower 'expect' Intrinsics
-Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti
-no-aa -tbaa -scoped-noalias -assumption-tracker -basicaa -verify-di
-ipsccp -globalopt -deadargelim -instcombine -simplifycfg -basiccg
-prune-eh -inline-cost -inline -functionattrs -sroa -domtree -early-cse
-lazy-value-info -jump-threading -correlated-propagation -simplifycfg
-instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops
-loop-simplify -lcssa -loop-rotate -licm -loop-unswitch -instcombine
-scalar-evolution -lcssa -indvars -loop-idiom -loop-deletion -function_tti
-loop-unroll -memdep -mldst-motion -domtree -memdep -gvn -memdep -memcpyopt
-sccp -instcombine -lazy-value-info -jump-threading -correlated-propagation
-domtree -memdep -dse -adce -simplifycfg -instcombine -barrier -domtree
-loops -loop-simplify -lcssa -branch-prob -block-freq -scalar-evolution
-loop-vectorize -instcombine -scalar-evolution -slp-vectorizer -simplifycfg
-instcombine -domtree -loops -loop-simplify -lcssa -scalar-evolution
-function_tti -loop-unroll -alignment-from-assumptions
-strip-dead-prototypes -globaldce -constmerge -verify -verify-di
-print-module
+Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti
-no-aa -tbaa -scoped-noalias -assumption-tracker -basicaa -verify-di
-ipsccp -globalopt -deadargelim -instcombine -simplifycfg -basiccg
-prune-eh -inline-cost -inline -functionattrs -sroa -domtree -early-cse
-lazy-value-info -jump-threading -correlated-propagation -simplifycfg
-instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops
-loop-simplify -lcssa -loop-rotate -licm -loop-unswitch -instcombine
-domtree -loops -scalar-evolution -loop-simplify -lcssa -indvars
-loop-idiom -loop-deletion -function_tti -loop-unroll -memdep -mldst-motion
-domtree -memdep -gvn -memdep -memcpyopt -sccp -instcombine
-lazy-value-info -jump-threading -correlated-propagation -domtree -memdep
-dse -adce -simplifycfg -instcombine -barrier -domtree -loops
-loop-simplify -lcssa -branch-prob -block-freq -scalar-evolution
-loop-vectorize -instcombine -domtree -loops -scalar-evolution
-slp-vectorizer -simplifycfg -instcombine -domtree -loops -loop-simplify
-lcssa -scalar-evolution -function_tti -loop-unroll
-alignment-from-assumptions -strip-dead-prototypes -globaldce -constmerge
-verify -verify-di -print-module
Target Library Information
Data Layout
No target information
Target independent code generator's TTI
X86 Target Transform Info
No Alias Analysis (always returns 'may' alias)
Type-Based Alias Analysis
Scoped NoAlias Alias Analysis
Assumption Tracker
Basic Alias Analysis (stateless AA impl)
ModulePass Manager
Debug Info Verifier
Interprocedural Sparse Conditional Constant Propagation
Global Variable Optimizer
Dead Argument Elimination
FunctionPass Manager
Combine redundant instructions
Simplify the CFG
CallGraph Construction
Call Graph SCC Pass Manager
Remove unused exception handling info
Inline Cost Analysis
Function Integration/Inlining
Deduce function attributes
FunctionPass Manager
SROA
Dominator Tree Construction
Early CSE
Lazy Value Information Analysis
Jump Threading
Value Propagation
Simplify the CFG
Combine redundant instructions
Tail Call Elimination
Simplify the CFG
Reassociate expressions
Dominator Tree Construction
Natural Loop Information
Canonicalize natural loops
Loop-Closed SSA Form Pass
Loop Pass Manager
Rotate Loops
Loop Invariant Code Motion
Unswitch loops
Combine redundant instructions
+ Dominator Tree Construction
+ Natural Loop Information
Scalar Evolution Analysis
+ Canonicalize natural loops
Loop-Closed SSA Form Pass
Loop Pass Manager
Induction Variable Simplification
Recognize loop idioms
Delete dead loops
Function TargetTransformInfo
Loop Pass Manager
Unroll loops
Memory Dependence Analysis
MergedLoadStoreMotion
Dominator Tree Construction
Memory Dependence Analysis
Global Value Numbering
Memory Dependence Analysis
MemCpy Optimization
Sparse Conditional Constant Propagation
Combine redundant instructions
Lazy Value Information Analysis
Jump Threading
Value Propagation
Dominator Tree Construction
Memory Dependence Analysis
Dead Store Elimination
Aggressive Dead Code Elimination
Simplify the CFG
Combine redundant instructions
A No-Op Barrier Pass
FunctionPass Manager
Dominator Tree Construction
Natural Loop Information
Canonicalize natural loops
Loop-Closed SSA Form Pass
Branch Probability Analysis
Block Frequency Analysis
Scalar Evolution Analysis
Loop Vectorization
Combine redundant instructions
+ Dominator Tree Construction
+ Natural Loop Information
Scalar Evolution Analysis
SLP Vectorizer
Simplify the CFG
Combine redundant instructions
Dominator Tree Construction
Natural Loop Information
Canonicalize natural loops
Loop-Closed SSA Form Pass
Scalar Evolution Analysis
Function TargetTransformInfo
Loop Pass Manager
Unroll loops
Alignment from assumptions
Strip Unused Function Prototypes
Dead Global Elimination
Merge Duplicate Global Constants
FunctionPass Manager
Module Verifier
Debug Info Verifier
Print module to stderr
On Mon, Nov 3, 2014 at 1:14 PM, Andrew Trick <atrick at apple.com> wrote:
>
> On Nov 3, 2014, at 11:48 AM, Mark Heffernan <meheff at google.com> wrote:
>
> Hi Andrew,
>
> (Let me know if someone else is more appropriate to review this). This
> patch removes setPreservesCFG() from the instcombine pass. The reason is
> that InstCombine can modify terminator instructions (branches) specifically
> the predicate. Instcombine clears out dead blocks and replaces all the
> dead instruction uses with undef:
>
>
> http://llvm.org/docs/doxygen/html/InstructionCombining_8cpp_source.html#l02792
>
> These new undefs can be predicates of branches, and from the comment
> of setPreservesCFG():
>
> // setPreservesCFG - This function should be called to by the pass, iff
> they do
> // not:
> //
> // 1. Add or remove basic blocks from the function
> // 2. Modify terminator instructions in any way.
>
> Clearly instcombine is modifying terminator instructions so should not be
> calling setPreservesCFG(). The specific issue I ran into was a dead loop
> not being deleted because of stale analysis data. Repro:
>
> void foo(int *a, int start_x, int end_x, int start_y, int end_y, int k) {
> for (int y = start_y; y < end_y; y++) {
> for (int x = start_x; x < end_x; x++) {
> for (int i = 0; i < 1000; i++) {
> a[x + y + k*i] = 0;
> }
> }
> }
> }
>
> # Dead loop left after loop deletion:
> clang -S -emit-llvm foo.c -o - | opt -O1 -loop-rotate -loop-unswitch
> -instcombine -loop-deletion -S > bad.ll
>
> # Dead loop removed by splitting out loop-deletion into separate opt
> invocation:
> clang -S -emit-llvm foo.c -o - | opt -O1 -loop-rotate -loop-unswitch
> -instcombine | opt -loop-deletion -S > good.ll
>
> This patch fixes this discrepancy.
>
>
> This seems totally reasonable given the current (lack of) invalidation
> mechanisms.
>
> For the record, can you report the difference between
> -debug-pass=Structure before and after output?
>
> -Andy
>
>
> Mark
> <no_cfg_preserve_instcombine.patch>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141103/045cf7f2/attachment.html>
More information about the llvm-commits
mailing list