From 80c8f627db8c56c5abc7627bc13ace99624c5e63 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 22 Nov 2014 04:52:55 +0000 Subject: [PATCH] InstCombine: Preserve nsw when folding X*(2^C) -> X << C llvm-svn: 222606 --- llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 2 ++ llvm/test/Transforms/InstCombine/add2.ll | 6 +++--- llvm/test/Transforms/InstCombine/div.ll | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 7844223..5ea25bf 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -179,6 +179,8 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) { if (I.hasNoUnsignedWrap()) Shl->setHasNoUnsignedWrap(); + if (I.hasNoSignedWrap() && NewCst->isNotMinSignedValue()) + Shl->setHasNoSignedWrap(); return Shl; } diff --git a/llvm/test/Transforms/InstCombine/add2.ll b/llvm/test/Transforms/InstCombine/add2.ll index a166e5f..2a63082 100644 --- a/llvm/test/Transforms/InstCombine/add2.ll +++ b/llvm/test/Transforms/InstCombine/add2.ll @@ -219,7 +219,7 @@ define i16 @mul_add_to_mul_1(i16 %x) { %add2 = add nsw i16 %x, %mul1 ret i16 %add2 ; CHECK-LABEL: @mul_add_to_mul_1( -; CHECK-NEXT: %add2 = mul i16 %x, 9 +; CHECK-NEXT: %add2 = mul nsw i16 %x, 9 ; CHECK-NEXT: ret i16 %add2 } @@ -228,7 +228,7 @@ define i16 @mul_add_to_mul_2(i16 %x) { %add2 = add nsw i16 %mul1, %x ret i16 %add2 ; CHECK-LABEL: @mul_add_to_mul_2( -; CHECK-NEXT: %add2 = mul i16 %x, 9 +; CHECK-NEXT: %add2 = mul nsw i16 %x, 9 ; CHECK-NEXT: ret i16 %add2 } @@ -248,7 +248,7 @@ define i16 @mul_add_to_mul_4(i16 %a) { %add = add nsw i16 %mul1, %mul2 ret i16 %add ; CHECK-LABEL: @mul_add_to_mul_4( -; CHECK-NEXT: %add = mul i16 %a, 9 +; CHECK-NEXT: %add = mul nsw i16 %a, 9 ; CHECK-NEXT: ret i16 %add } diff --git a/llvm/test/Transforms/InstCombine/div.ll b/llvm/test/Transforms/InstCombine/div.ll index 2841043..5af8668 100644 --- a/llvm/test/Transforms/InstCombine/div.ll +++ b/llvm/test/Transforms/InstCombine/div.ll @@ -217,7 +217,7 @@ define i32 @test25(i32 %a) { %div = sdiv i32 %shl, 2 ret i32 %div ; CHECK-LABEL: @test25( -; CHECK-NEXT: %div = shl i32 %a, 1 +; CHECK-NEXT: %div = shl nsw i32 %a, 1 ; CHECK-NEXT: ret i32 %div } @@ -226,7 +226,7 @@ define i32 @test26(i32 %a) { %div = sdiv i32 %mul, 3 ret i32 %div ; CHECK-LABEL: @test26( -; CHECK-NEXT: %div = shl i32 %a, 2 +; CHECK-NEXT: %div = shl nsw i32 %a, 2 ; CHECK-NEXT: ret i32 %div } -- 2.7.4