[llvm-commits] [llvm] r60187 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/2008-11-27-UDivNegative.ll test/Transforms/InstCombine/udiv-simplify-bug-1.ll

Nick Lewycky nicholas at mxc.ca
Thu Nov 27 14:41:10 PST 2008


Author: nicholas
Date: Thu Nov 27 16:41:10 2008
New Revision: 60187

URL: http://llvm.org/viewvc/llvm-project?rev=60187&view=rev
Log:
Chris prefers icmp/select over udiv!

Added:
    llvm/trunk/test/Transforms/InstCombine/2008-11-27-UDivNegative.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
    llvm/trunk/test/Transforms/InstCombine/udiv-simplify-bug-1.ll

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

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Thu Nov 27 16:41:10 2008
@@ -2882,13 +2882,21 @@
   if (Instruction *Common = commonIDivTransforms(I))
     return Common;
 
-  // X udiv C^2 -> X >> C
-  // Check to see if this is an unsigned division with an exact power of 2,
-  // if so, convert to a right shift.
   if (ConstantInt *C = dyn_cast<ConstantInt>(Op1)) {
+    // X udiv C^2 -> X >> C
+    // Check to see if this is an unsigned division with an exact power of 2,
+    // if so, convert to a right shift.
     if (C->getValue().isPowerOf2())  // 0 not included in isPowerOf2
       return BinaryOperator::CreateLShr(Op0, 
                ConstantInt::get(Op0->getType(), C->getValue().logBase2()));
+
+    // X udiv C, where C >= signbit
+    if (C->getValue().isNegative()) {
+      Value *IC = InsertNewInstBefore(new ICmpInst(ICmpInst::ICMP_ULT, Op0, C),
+                                      I);
+      return SelectInst::Create(IC, Constant::getNullValue(I.getType()),
+                                ConstantInt::get(I.getType(), 1));
+    }
   }
 
   // X udiv (C1 << N), where C1 is "1<<C2"  -->  X >> (N+C2)

Added: llvm/trunk/test/Transforms/InstCombine/2008-11-27-UDivNegative.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2008-11-27-UDivNegative.ll?rev=60187&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2008-11-27-UDivNegative.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/2008-11-27-UDivNegative.ll Thu Nov 27 16:41:10 2008
@@ -0,0 +1,6 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep div
+
+define i8 @test(i8 %x) readnone nounwind {
+  %A = udiv i8 %x, 250
+  ret i8 %A
+}

Modified: llvm/trunk/test/Transforms/InstCombine/udiv-simplify-bug-1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/udiv-simplify-bug-1.ll?rev=60187&r1=60186&r2=60187&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/udiv-simplify-bug-1.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/udiv-simplify-bug-1.ll Thu Nov 27 16:41:10 2008
@@ -1,16 +1,11 @@
 ; RUN: llvm-as < %s | opt -instcombine | llvm-dis > %t1.ll
-; RUN: grep udiv %t1.ll | count 3
-; RUN: grep zext %t1.ll | count 3
+; RUN: grep udiv %t1.ll | count 2
+; RUN: grep zext %t1.ll | count 2
 ; PR2274
 
 ; The udiv instructions shouldn't be optimized away, and the
 ; sext instructions should be optimized to zext.
 
-define i64 @foo(i32 %x) nounwind {
-  %r = udiv i32 %x, -1
-  %z = sext i32 %r to i64
-  ret i64 %z
-}
 define i64 @bar(i32 %x) nounwind {
   %y = lshr i32 %x, 30
   %r = udiv i32 %y, 3





More information about the llvm-commits mailing list