[llvm] fa0014a - [SCEV] Drop LCSSA check in createNodeFromSelectLikePHI()

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 27 06:18:30 PDT 2023


Author: Nikita Popov
Date: 2023-04-27T15:18:07+02:00
New Revision: fa0014a68bb452ff12af6e4af5e6e919dbe8584b

URL: https://github.com/llvm/llvm-project/commit/fa0014a68bb452ff12af6e4af5e6e919dbe8584b
DIFF: https://github.com/llvm/llvm-project/commit/fa0014a68bb452ff12af6e4af5e6e919dbe8584b.diff

LOG: [SCEV] Drop LCSSA check in createNodeFromSelectLikePHI()

SCEV expressions no longer try to preserve LCSSA form. SCEV
construction will try to look through LCSSA phi nodes. As such,
we also no longer need to limit this special-case fold.

Added: 
    

Modified: 
    llvm/lib/Analysis/ScalarEvolution.cpp
    llvm/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index d7aeb0b28609..3edd4f71c7fa 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -6013,11 +6013,6 @@ const SCEV *ScalarEvolution::createNodeFromSelectLikePHI(PHINode *PN) {
   if (PN->getNumIncomingValues() == 2 && all_of(PN->blocks(), IsReachable)) {
     const Loop *L = LI.getLoopFor(PN->getParent());
 
-    // We don't want to break LCSSA, even in a SCEV expression tree.
-    for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
-      if (LI.getLoopFor(PN->getIncomingBlock(i)) != L)
-        return nullptr;
-
     // Try to match
     //
     //  br %cond, label %left, label %right

diff  --git a/llvm/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll b/llvm/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll
index 82600b979e31..e307bd589a93 100644
--- a/llvm/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll
+++ b/llvm/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll
@@ -145,15 +145,14 @@ merge:
   ret i32 %v
 }
 
-; Matching "through" %init will break LCSSA at the SCEV expression
-; level.
+; It's okay to match "through" %init, as SCEV expressions don't preserve LCSSA.
 define i32 @f5(ptr %val) {
 ; CHECK-LABEL: 'f5'
 ; CHECK-NEXT:  Classifying expressions for: @f5
 ; CHECK-NEXT:    %inc = load i32, ptr %val, align 4
 ; CHECK-NEXT:    --> %inc U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %for.end: Variant }
 ; CHECK-NEXT:    %init = phi i32 [ 0, %for.condt ], [ %inc, %for.end ]
-; CHECK-NEXT:    --> %init U: full-set S: full-set
+; CHECK-NEXT:    --> %inc U: full-set S: full-set
 ; CHECK-NEXT:  Determining loop execution counts for: @f5
 ; CHECK-NEXT:  Loop %for.end: <multiple exits> backedge-taken count is false
 ; CHECK-NEXT:    exit count for for.end: false


        


More information about the llvm-commits mailing list