mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280370 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fc0391434b
commit
36ff41aa37
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user