summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2016-06-06 16:56:57 +0000
committerSanjay Patel <spatel@rotateright.com>2016-06-06 16:56:57 +0000
commit6a333c3ed9006e9140e7b29dfb36b4fe37825eaf (patch)
tree6141e786bcad44a1f7d8495f1cc03a9b5588c4eb /llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll
parent83ccd1a994b21c8f98fe4b44d56dcba7cea4b5c6 (diff)
downloadbcm5719-llvm-6a333c3ed9006e9140e7b29dfb36b4fe37825eaf.tar.gz
bcm5719-llvm-6a333c3ed9006e9140e7b29dfb36b4fe37825eaf.zip
[InstCombine] limit icmp transform to ConstantInt (PR28011)
In r271810 ( http://reviews.llvm.org/rL271810 ), I loosened the check above this to work for any Constant rather than ConstantInt. AFAICT, that part makes sense if we can determine that the shrunken/extended constant remained equal. But it doesn't make sense for this later transform where we assume that the constant DID change. This could assert for a ConstantExpr: https://llvm.org/bugs/show_bug.cgi?id=28011 And it could be wrong for a vector as shown in the added regression test. llvm-svn: 271908
Diffstat (limited to 'llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll')
-rw-r--r--llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll b/llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll
index 34dc65f4b70..6a95c82374d 100644
--- a/llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll
+++ b/llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll
@@ -22,6 +22,34 @@ define i1 @lt_signed_to_large_unsigned(i8 %SB) {
ret i1 %C
}
+; PR28011 - https://llvm.org/bugs/show_bug.cgi?id=28011
+; The above transform only applies to scalar integers; it shouldn't be attempted for constant expressions or vectors.
+
+@a = common global i32** null
+@b = common global [1 x i32] zeroinitializer
+
+define i1 @PR28011(i16 %a) {
+; CHECK-LABEL: @PR28011(
+; CHECK-NEXT: [[CONV:%.*]] = sext i16 %a to i32
+; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[CONV]], or (i32 zext (i1 icmp ne (i32*** bitcast ([1 x i32]* @b to i32***), i32*** @a) to i32), i32 1)
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %conv = sext i16 %a to i32
+ %cmp = icmp ne i32 %conv, or (i32 zext (i1 icmp ne (i32*** bitcast ([1 x i32]* @b to i32***), i32*** @a) to i32), i32 1)
+ ret i1 %cmp
+}
+
+define <2 x i1> @lt_signed_to_large_unsigned_vec(<2 x i8> %SB) {
+; CHECK-LABEL: @lt_signed_to_large_unsigned_vec(
+; CHECK-NEXT: [[Y:%.*]] = sext <2 x i8> %SB to <2 x i32>
+; CHECK-NEXT: [[C:%.*]] = icmp ult <2 x i32> [[Y]], <i32 1024, i32 2>
+; CHECK-NEXT: ret <2 x i1> [[C]]
+;
+ %Y = sext <2 x i8> %SB to <2 x i32>
+ %C = icmp ult <2 x i32> %Y, <i32 1024, i32 2>
+ ret <2 x i1> %C
+}
+
define i1 @lt_signed_to_large_signed(i8 %SB) {
; CHECK-LABEL: @lt_signed_to_large_signed(
; CHECK-NEXT: ret i1 true
OpenPOWER on IntegriCloud