preserve NUW/NSW when transforming add x,x
authorChris Lattner <sabre@nondot.org>
Thu, 17 Feb 2011 02:23:02 +0000 (02:23 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 17 Feb 2011 02:23:02 +0000 (02:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125711 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineAddSub.cpp
test/Transforms/InstCombine/add2.ll

index 4ff005e26c28eb2a26984f0ee297a7d37d7ee584..89cc540da71b7be98693f8dfb24d13964ddebac3 100644 (file)
@@ -147,8 +147,13 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
     return BinaryOperator::CreateXor(LHS, RHS);
 
   // X + X --> X << 1
-  if (LHS == RHS && I.getType()->isIntegerTy())
-    return BinaryOperator::CreateShl(LHS, ConstantInt::get(I.getType(), 1));
+  if (LHS == RHS && I.getType()->isIntegerTy()) {
+    BinaryOperator *New =
+      BinaryOperator::CreateShl(LHS, ConstantInt::get(I.getType(), 1));
+    New->setHasNoSignedWrap(I.hasNoSignedWrap());
+    New->setHasNoUnsignedWrap(I.hasNoUnsignedWrap());
+    return New;
+  }
 
   // -A + B  -->  B - A
   // -A + -B  -->  -(A + B)
index a382142d73a3b6cb0dee94fe472e12fc452ed0cc..c5109c528857c424163d749cfb0c8ddec4e61fe8 100644 (file)
@@ -33,3 +33,11 @@ define i32 @test3(i32 %A) {
 ; CHECK-NEXT: ret i32
 }
 
+define i32 @test4(i32 %A) {
+  %B = add nuw i32 %A, %A
+  ret i32 %B
+; CHECK: @test4
+; CHECK-NEXT: %B = shl nuw i32 %A, 1
+; CHECK-NEXT: ret i32 %B
+}
+