[llvm] r262638 - [SCEV] Be less eager about demoting zexts to sexts

Sanjoy Das via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 3 10:31:23 PST 2016


Author: sanjoy
Date: Thu Mar  3 12:31:23 2016
New Revision: 262638

URL: http://llvm.org/viewvc/llvm-project?rev=262638&view=rev
Log:
[SCEV] Be less eager about demoting zexts to sexts

After r262438 we can have provably positive NSW SCEV expressions whose
zero extensions cannot be simplified (since r262438 makes SCEV better at
computing constant ranges).  This means demoting sexts of positive add
recurrences eagerly can result in an unsimplified zero extension where
we could have had a simplified sign extension.  This change fixes the
issue by teaching SCEV to demote sext of a positive SCEV expression to a
zext only if the sext could not be simplified.

Added:
    llvm/trunk/test/Analysis/ScalarEvolution/sext-to-zext.ll
Modified:
    llvm/trunk/lib/Analysis/ScalarEvolution.cpp

Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=262638&r1=262637&r2=262638&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Thu Mar  3 12:31:23 2016
@@ -1612,10 +1612,6 @@ const SCEV *ScalarEvolution::getSignExte
   void *IP = nullptr;
   if (const SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) return S;
 
-  // If the input value is provably positive, build a zext instead.
-  if (isKnownNonNegative(Op))
-    return getZeroExtendExpr(Op, Ty);
-
   // sext(trunc(x)) --> sext(x) or x or trunc(x)
   if (const SCEVTruncateExpr *ST = dyn_cast<SCEVTruncateExpr>(Op)) {
     // It's possible the bits taken off by the truncate were all sign bits. If
@@ -1781,6 +1777,11 @@ const SCEV *ScalarEvolution::getSignExte
       }
     }
 
+  // If the input value is provably positive and we could not simplify
+  // away the sext build a zext instead.
+  if (isKnownNonNegative(Op))
+    return getZeroExtendExpr(Op, Ty);
+
   // The cast wasn't folded; create an explicit cast node.
   // Recompute the insert position, as it may have been invalidated.
   if (const SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) return S;

Added: llvm/trunk/test/Analysis/ScalarEvolution/sext-to-zext.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/sext-to-zext.ll?rev=262638&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/sext-to-zext.ll (added)
+++ llvm/trunk/test/Analysis/ScalarEvolution/sext-to-zext.ll Thu Mar  3 12:31:23 2016
@@ -0,0 +1,23 @@
+; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
+
+define void @f(i1 %c) {
+; CHECK-LABEL: Classifying expressions for: @f
+entry:
+  %start = select i1 %c, i32 100, i32 0
+  %step =  select i1 %c, i32 -1,  i32 1
+  br label %loop
+
+loop:
+  %iv = phi i32 [ %start, %entry ], [ %iv.dec, %loop ]
+  %iv.tc = phi i32 [ 0, %entry ], [ %iv.tc.inc, %loop ]
+  %iv.tc.inc = add i32 %iv.tc, 1
+  %iv.dec = add nsw i32 %iv, %step
+  %iv.sext = sext i32 %iv to i64
+; CHECK:  %iv.sext = sext i32 %iv to i64
+; CHECK-NEXT:  -->  {(sext i32 %start to i64),+,(sext i32 %step to i64)}<nsw><%loop>
+  %be = icmp ne i32 %iv.tc.inc, 100
+  br i1 %be, label %loop, label %leave
+
+leave:
+  ret void
+}




More information about the llvm-commits mailing list