[llvm-commits] [llvm] r43480 - in /llvm/trunk: lib/Transforms/Scalar/LoopStrengthReduce.cpp test/CodeGen/X86/loop-strength-reduce6.ll

Evan Cheng evan.cheng at apple.com
Mon Oct 29 15:07:18 PDT 2007


Author: evancheng
Date: Mon Oct 29 17:07:18 2007
New Revision: 43480

URL: http://llvm.org/viewvc/llvm-project?rev=43480&view=rev
Log:
- Bug fixes.
- Allow icmp rewrite using an iv / stride of a smaller integer type.

Added:
    llvm/trunk/test/CodeGen/X86/loop-strength-reduce6.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=43480&r1=43479&r2=43480&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Mon Oct 29 17:07:18 2007
@@ -1476,6 +1476,8 @@
   uint64_t SignBit = 1ULL << (BitWidth-1);
   const Type *CmpTy = C->getType();
   const Type *NewCmpTy = NULL;
+  unsigned TyBits = CmpTy->getPrimitiveSizeInBits();
+  unsigned NewTyBits = 0;
   int64_t NewCmpVal = CmpVal;
   SCEVHandle *NewStride = NULL;
   Value *NewIncV = NULL;
@@ -1521,7 +1523,31 @@
       }
 
       NewCmpTy = NewIncV->getType();
-      if (RequiresTypeConversion(CmpTy, NewCmpTy)) {
+      NewTyBits = isa<PointerType>(NewCmpTy)
+        ? UIntPtrTy->getPrimitiveSizeInBits()
+        : NewCmpTy->getPrimitiveSizeInBits();
+      if (RequiresTypeConversion(NewCmpTy, CmpTy)) {
+        // Check if it is possible to rewrite it using a iv / stride of a smaller
+        // integer type.
+        bool TruncOk = false;
+        if (NewCmpTy->isInteger()) {
+          unsigned Bits = NewTyBits;
+          if (ICmpInst::isSignedPredicate(Predicate))
+            --Bits;
+          uint64_t Mask = (1ULL << Bits) - 1;
+          if (((uint64_t)NewCmpVal & Mask) == (uint64_t)NewCmpVal)
+            TruncOk = true;
+        }
+        if (!TruncOk) {
+          NewCmpVal = CmpVal;
+          continue;
+        }
+      }
+
+      // Don't rewrite if use offset is non-constant and the new type is
+      // of a different type.
+      // FIXME: too conservative?
+      if (NewTyBits != TyBits && !isa<SCEVConstant>(CondUse->Offset)) {
         NewCmpVal = CmpVal;
         continue;
       }
@@ -1552,13 +1578,12 @@
   if (NewCmpVal != CmpVal) {
     // Create a new compare instruction using new stride / iv.
     ICmpInst *OldCond = Cond;
-    Value *RHS = ConstantInt::get(C->getType(), NewCmpVal);
-    // Both sides of a ICmpInst must be of the same type.
-    if (NewCmpTy != CmpTy) {
-      if (isa<PointerType>(NewCmpTy) && !isa<PointerType>(CmpTy))
-        RHS= SCEVExpander::InsertCastOfTo(Instruction::IntToPtr, RHS, NewCmpTy);
-      else
-        RHS = SCEVExpander::InsertCastOfTo(Instruction::BitCast, RHS, NewCmpTy);
+    Value *RHS;
+    if (!isa<PointerType>(NewCmpTy))
+      RHS = ConstantInt::get(NewCmpTy, NewCmpVal);
+    else {
+      RHS = ConstantInt::get(UIntPtrTy, NewCmpVal);
+      RHS = SCEVExpander::InsertCastOfTo(Instruction::IntToPtr, RHS, NewCmpTy);
     }
     // Insert new compare instruction.
     Cond = new ICmpInst(Predicate, NewIncV, RHS);
@@ -1572,8 +1597,11 @@
     OldCond->eraseFromParent();
 
     IVUsesByStride[*CondStride].Users.pop_back();
-    SCEVHandle NewOffset = SE->getMulExpr(CondUse->Offset,
-          SE->getConstant(ConstantInt::get(CondUse->Offset->getType(), Scale)));
+    SCEVHandle NewOffset = TyBits == NewTyBits
+      ? SE->getMulExpr(CondUse->Offset,
+                       SE->getConstant(ConstantInt::get(CmpTy, Scale)))
+      : SE->getConstant(ConstantInt::get(NewCmpTy,
+        cast<SCEVConstant>(CondUse->Offset)->getValue()->getSExtValue()*Scale));
     IVUsesByStride[*NewStride].addUser(NewOffset, Cond, NewIncV);
     CondUse = &IVUsesByStride[*NewStride].Users.back();
     CondStride = NewStride;

Added: llvm/trunk/test/CodeGen/X86/loop-strength-reduce6.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/loop-strength-reduce6.ll?rev=43480&view=auto

==============================================================================
--- llvm/trunk/test/CodeGen/X86/loop-strength-reduce6.ll (added)
+++ llvm/trunk/test/CodeGen/X86/loop-strength-reduce6.ll Mon Oct 29 17:07:18 2007
@@ -0,0 +1,66 @@
+; RUN: llvm-as < %s | llc -march=x86-64 | not grep inc
+
+define fastcc i32 @decodeMP3(i32 %isize, i32* %done) {
+entry:
+	br i1 false, label %cond_next191, label %cond_true189
+
+cond_true189:		; preds = %entry
+	ret i32 0
+
+cond_next191:		; preds = %entry
+	br i1 false, label %cond_next37.i, label %cond_false.i9
+
+cond_false.i9:		; preds = %cond_next191
+	ret i32 0
+
+cond_next37.i:		; preds = %cond_next191
+	br i1 false, label %cond_false50.i, label %cond_true44.i
+
+cond_true44.i:		; preds = %cond_next37.i
+	br i1 false, label %cond_true11.i.i, label %bb414.preheader.i
+
+cond_true11.i.i:		; preds = %cond_true44.i
+	ret i32 0
+
+cond_false50.i:		; preds = %cond_next37.i
+	ret i32 0
+
+bb414.preheader.i:		; preds = %cond_true44.i
+	br i1 false, label %bb.i18, label %do_layer3.exit
+
+bb.i18:		; preds = %bb414.preheader.i
+	br i1 false, label %bb358.i, label %cond_true79.i
+
+cond_true79.i:		; preds = %bb.i18
+	ret i32 0
+
+bb331.i:		; preds = %bb358.i, %cond_true.i149.i
+	br i1 false, label %cond_true.i149.i, label %cond_false.i151.i
+
+cond_true.i149.i:		; preds = %bb331.i
+	br i1 false, label %bb178.preheader.i.i, label %bb331.i
+
+cond_false.i151.i:		; preds = %bb331.i
+	ret i32 0
+
+bb163.i.i:		; preds = %bb178.preheader.i.i, %bb163.i.i
+	%rawout2.451.rec.i.i = phi i64 [ 0, %bb178.preheader.i.i ], [ %indvar.next260.i, %bb163.i.i ]		; <i64> [#uses=2]
+	%i.052.i.i = trunc i64 %rawout2.451.rec.i.i to i32		; <i32> [#uses=1]
+	%tmp165.i144.i = shl i32 %i.052.i.i, 5		; <i32> [#uses=1]
+	%tmp165169.i.i = sext i32 %tmp165.i144.i to i64		; <i64> [#uses=0]
+	%indvar.next260.i = add i64 %rawout2.451.rec.i.i, 1		; <i64> [#uses=2]
+	%exitcond261.i = icmp eq i64 %indvar.next260.i, 18		; <i1> [#uses=1]
+	br i1 %exitcond261.i, label %bb178.preheader.i.i, label %bb163.i.i
+
+bb178.preheader.i.i:		; preds = %bb163.i.i, %cond_true.i149.i
+	br label %bb163.i.i
+
+bb358.i:		; preds = %bb.i18
+	br i1 false, label %bb331.i, label %bb406.i
+
+bb406.i:		; preds = %bb358.i
+	ret i32 0
+
+do_layer3.exit:		; preds = %bb414.preheader.i
+	ret i32 0
+}





More information about the llvm-commits mailing list