diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2016-09-01 14:20:43 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2016-09-01 14:20:43 +0000 |
| commit | dd861964d125349be735267409dde25cf3bc9f6e (patch) | |
| tree | bef0722c89b7004439ba697149fbc4c3d94576c9 | |
| parent | 07d9f53b515ea9e6399238decc183b42ea1438ba (diff) | |
| download | bcm5719-llvm-dd861964d125349be735267409dde25cf3bc9f6e.tar.gz bcm5719-llvm-dd861964d125349be735267409dde25cf3bc9f6e.zip | |
[InstCombine] remove fold of an icmp pattern that should never happen
While removing a scalar shackle from an icmp fold, I noticed that I couldn't find any tests to trigger
this code path.
The 'and' shrinking transform should be handled by InstCombiner::foldCastedBitwiseLogic()
or eliminated with InstSimplify. The icmp narrowing is part of InstCombiner::foldICmpWithCastAndCast().
Differential Revision: https://reviews.llvm.org/D24031
llvm-svn: 280370
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 15 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/cast.ll | 15 |
2 files changed, 15 insertions, 15 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index d05b8d10e3c..d0675b77444 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -1526,21 +1526,6 @@ Instruction *InstCombiner::foldICmpAndConstConst(ICmpInst &Cmp, } } - // If the LHS is an AND of a zext, and we have an equality compare, we can - // shrink the and/compare to the smaller type, eliminating the cast. - if (ZExtInst *Cast = dyn_cast<ZExtInst>(And->getOperand(0))) { - IntegerType *Ty = cast<IntegerType>(Cast->getSrcTy()); - // Make sure we don't compare the upper bits, SimplifyDemandedBits - // should fold the icmp to true/false in that case. - if (Cmp.isEquality() && C1->getActiveBits() <= Ty->getBitWidth()) { - Value *NewAnd = Builder->CreateAnd(Cast->getOperand(0), - ConstantExpr::getTrunc(C2, Ty)); - NewAnd->takeName(And); - return new ICmpInst(Cmp.getPredicate(), NewAnd, - ConstantExpr::getTrunc(RHS, Ty)); - } - } - if (Instruction *I = foldICmpAndShift(Cmp, And, C1)) return I; diff --git a/llvm/test/Transforms/InstCombine/cast.ll b/llvm/test/Transforms/InstCombine/cast.ll index b4f14e115b6..4621d33d438 100644 --- a/llvm/test/Transforms/InstCombine/cast.ll +++ b/llvm/test/Transforms/InstCombine/cast.ll @@ -371,6 +371,21 @@ define <2 x i1> @test31vec(<2 x i64> %A) { ret <2 x i1> %D } +; Verify that the 'and' was narrowed, the zext was eliminated, and the compare was narrowed +; even for vectors. Earlier folds should ensure that the icmp(and(zext)) pattern never occurs. + +define <2 x i1> @test32vec(<2 x i8> %A) { +; CHECK-LABEL: @test32vec( +; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i8> %A, <i8 42, i8 42> +; CHECK-NEXT: [[D:%.*]] = icmp eq <2 x i8> [[TMP1]], <i8 10, i8 10> +; CHECK-NEXT: ret <2 x i1> [[D]] +; + %B = zext <2 x i8> %A to <2 x i16> + %C = and <2 x i16> %B, <i16 42, i16 42> + %D = icmp eq <2 x i16> %C, <i16 10, i16 10> + ret <2 x i1> %D +} + define i32 @test33(i32 %c1) { ; CHECK-LABEL: @test33( ; CHECK-NEXT: ret i32 %c1 |

