[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