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 | |
| 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
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 8 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll | 28 |
2 files changed, 33 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index cb9c7e5b893..b3727e4bbe5 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -2459,12 +2459,14 @@ Instruction *InstCombiner::visitICmpInstWithCastAndCast(ICmpInst &ICmp) { return new ICmpInst(ICmp.getUnsignedPredicate(), LHSCIOp, Res1); } - // The re-extended constant changed so the constant cannot be represented - // in the shorter type. Consequently, we cannot emit a simple comparison. + // The re-extended constant changed, partly changed (in the case of a vector), + // or could not be determined to be equal (in the case of a constant + // expression), so the constant cannot be represented in the shorter type. + // Consequently, we cannot emit a simple comparison. // All the cases that fold to true or false will have already been handled // by SimplifyICmpInst, so only deal with the tricky case. - if (isSignedCmp || !isSignedExt) + if (isSignedCmp || !isSignedExt || !isa<ConstantInt>(C)) return nullptr; // Evaluate the comparison for LT (we invert for GT below). LE and GE cases 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 |

