Simplify trunc(extend(x)) in SCEVs, just for completeness. Also fix some odd
authorNick Lewycky <nicholas@mxc.ca>
Thu, 23 Apr 2009 05:15:08 +0000 (05:15 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Thu, 23 Apr 2009 05:15:08 +0000 (05:15 +0000)
whitespace in the same file.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69870 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp
test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll [new file with mode: 0644]

index cebf4d704fee25d76cc9a3476f6408c53ca4de64..409bad9166976eebea28932de10df1ade8d78c1d 100644 (file)
@@ -658,6 +658,14 @@ SCEVHandle ScalarEvolution::getTruncateExpr(const SCEVHandle &Op, const Type *Ty
   if (SCEVTruncateExpr *ST = dyn_cast<SCEVTruncateExpr>(Op))
     return getTruncateExpr(ST->getOperand(), Ty);
 
+  // trunc(sext(x)) --> sext(x) if widening or trunc(x) if narrowing
+  if (SCEVSignExtendExpr *SS = dyn_cast<SCEVSignExtendExpr>(Op))
+    return getTruncateOrSignExtend(SS->getOperand(), Ty);
+
+  // trunc(zext(x)) --> zext(x) if widening or trunc(x) if narrowing
+  if (SCEVZeroExtendExpr *SZ = dyn_cast<SCEVZeroExtendExpr>(Op))
+    return getTruncateOrZeroExtend(SZ->getOperand(), Ty);
+
   // If the input value is a chrec scev made out of constants, truncate
   // all of the constants.
   if (SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Op)) {
@@ -1152,7 +1160,7 @@ SCEVHandle ScalarEvolution::getAddRecExpr(const SCEVHandle &Start,
 /// SCEVAddRecExpr::get - Get a add recurrence expression for the
 /// specified loop.  Simplify the expression as much as possible.
 SCEVHandle ScalarEvolution::getAddRecExpr(std::vector<SCEVHandle> &Operands,
-                               const Loop *L) {
+                                          const Loop *L) {
   if (Operands.size() == 1) return Operands[0];
 
   if (Operands.back()->isZero()) {
@@ -1484,7 +1492,7 @@ SCEVHandle ScalarEvolution::getNotSCEV(const SCEVHandle &V) {
 /// getMinusSCEV - Return a SCEV corresponding to LHS - RHS.
 ///
 SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS,
-                                              const SCEVHandle &RHS) {
+                                         const SCEVHandle &RHS) {
   // X - Y --> X + -Y
   return getAddExpr(LHS, getNegativeSCEV(RHS));
 }
@@ -1494,7 +1502,7 @@ SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS,
 /// extended.
 SCEVHandle
 ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V,
-                                              const Type *Ty) {
+                                         const Type *Ty) {
   const Type *SrcTy = V->getType();
   assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
          (Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
@@ -1511,7 +1519,7 @@ ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V,
 /// extended.
 SCEVHandle
 ScalarEvolution::getTruncateOrSignExtend(const SCEVHandle &V,
-                                              const Type *Ty) {
+                                         const Type *Ty) {
   const Type *SrcTy = V->getType();
   assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
          (Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
diff --git a/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll b/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll
new file mode 100644 (file)
index 0000000..4af79af
--- /dev/null
@@ -0,0 +1,37 @@
+; RUN: llvm-as < %s | opt -analyze -scalar-evolution | grep truncate | not grep extend
+
+define i16 @test1(i8 %x) {
+  %A = sext i8 %x to i32
+  %B = trunc i32 %A to i16
+  ret i16 %B
+}
+
+define i8 @test2(i16 %x) {
+  %A = sext i16 %x to i32
+  %B = trunc i32 %A to i8
+  ret i8 %B
+}
+
+define i16 @test3(i16 %x) {
+  %A = sext i16 %x to i32
+  %B = trunc i32 %A to i16
+  ret i16 %B
+}
+
+define i16 @test4(i8 %x) {
+  %A = zext i8 %x to i32
+  %B = trunc i32 %A to i16
+  ret i16 %B
+}
+
+define i8 @test5(i16 %x) {
+  %A = zext i16 %x to i32
+  %B = trunc i32 %A to i8
+  ret i8 %B
+}
+
+define i16 @test6(i16 %x) {
+  %A = zext i16 %x to i32
+  %B = trunc i32 %A to i16
+  ret i16 %B
+}