diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2016-06-06 16:56:57 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2016-06-06 16:56:57 +0000 |
| commit | 6a333c3ed9006e9140e7b29dfb36b4fe37825eaf (patch) | |
| tree | 6141e786bcad44a1f7d8495f1cc03a9b5588c4eb /llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll | |
| parent | 83ccd1a994b21c8f98fe4b44d56dcba7cea4b5c6 (diff) | |
| download | bcm5719-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.ll | 28 |
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 |

