summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-08-22 07:56:32 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-08-22 07:56:32 +0000
commit42b83a5e3643c049eb4f89e9ca07de245d2979ea (patch)
tree342f3edb130a939a4ffcf163bc8e970cec86a362 /llvm/test/Transforms
parent987f1864caeb3b685e03d78c7316b97c506b649f (diff)
downloadbcm5719-llvm-42b83a5e3643c049eb4f89e9ca07de245d2979ea.tar.gz
bcm5719-llvm-42b83a5e3643c049eb4f89e9ca07de245d2979ea.zip
InstCombine: Don't unconditionally preserve 'nsw' when shrinking constants
Consider: %add = add nsw i32 %a, -16777216 %and = and i32 %add, 255 Regardless of whether or not we demand the sign bit of %add, we cannot replace -16777216 with 2130706432 without also removing 'nsw' from the instruction. This fixes PR20377. llvm-svn: 216261
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/cast.ll14
1 files changed, 13 insertions, 1 deletions
diff --git a/llvm/test/Transforms/InstCombine/cast.ll b/llvm/test/Transforms/InstCombine/cast.ll
index 86e9f3f5335..81b0d7eff52 100644
--- a/llvm/test/Transforms/InstCombine/cast.ll
+++ b/llvm/test/Transforms/InstCombine/cast.ll
@@ -1022,7 +1022,19 @@ define i64 @test83(i16 %a, i64 %k) {
ret i64 %sh_prom1
; CHECK-LABEL: @test83(
-; CHECK: %sub = add nsw i64 %k, 4294967295
+; CHECK: %sub = add i64 %k, 4294967295
; CHECK: %sh_prom = trunc i64 %sub to i32
; CHECK: %shl = shl i32 %conv, %sh_prom
}
+
+define i8 @test84(i32 %a) {
+ %add = add nsw i32 %a, -16777216
+ %shr = lshr exact i32 %add, 23
+ %trunc = trunc i32 %shr to i8
+ ret i8 %trunc
+
+; CHECK-LABEL: @test84(
+; CHECK: [[ADD:%.*]] = add i32 %a, 2130706432
+; CHECK: [[SHR:%.*]] = lshr exact i32 [[ADD]], 23
+; CHECK: [[CST:%.*]] = trunc i32 [[SHR]] to i8
+}
OpenPOWER on IntegriCloud