mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
InstCombine: Remove overzealous asserts
These asserts can trigger if the worklist iteration order is sufficiently unlucky. Instead of adding special case logic to handle these edge conditions, just bail out on trying to transform them: InstSimplify will get them when it reaches them on the worklist. This fixes PR21378. N.B. No test case is included because any test would rely on the fragile worklist iteration order. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220612 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f4a288c0f0
commit
ae7aa60b2d
@ -1052,8 +1052,18 @@ Instruction *InstCombiner::FoldICmpCstShrCst(ICmpInst &I, Value *Op, Value *A,
|
||||
APInt AP1 = CI1->getValue();
|
||||
APInt AP2 = CI2->getValue();
|
||||
|
||||
assert(AP2 != 0 && "Handled in InstSimplify");
|
||||
assert(!AP2.isAllOnesValue() && "Handled in InstSimplify");
|
||||
// Don't bother doing any work for cases which InstSimplify handles.
|
||||
if (AP2 == 0)
|
||||
return nullptr;
|
||||
bool IsAShr = isa<AShrOperator>(Op);
|
||||
if (IsAShr) {
|
||||
if (AP2.isAllOnesValue())
|
||||
return nullptr;
|
||||
if (AP2.isNegative() != AP1.isNegative())
|
||||
return nullptr;
|
||||
if (AP2.sgt(AP1))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!AP1)
|
||||
// 'A' must be large enough to shift out the highest set bit.
|
||||
@ -1063,13 +1073,6 @@ Instruction *InstCombiner::FoldICmpCstShrCst(ICmpInst &I, Value *Op, Value *A,
|
||||
if (AP1 == AP2)
|
||||
return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
|
||||
|
||||
bool IsAShr = isa<AShrOperator>(Op);
|
||||
// If we are dealing with an arithmetic shift, both constants should agree in
|
||||
// sign. InstSimplify's SimplifyICmpInst range analysis is supposed to catch
|
||||
// the cases when they disagree.
|
||||
assert((!IsAShr || (AP1.isNegative() == AP2.isNegative() && AP1.sgt(AP2))) &&
|
||||
"Handled in InstSimplify");
|
||||
|
||||
// Get the distance between the highest bit that's set.
|
||||
int Shift;
|
||||
// Both the constants are negative, take their positive to calculate log.
|
||||
@ -1109,7 +1112,9 @@ Instruction *InstCombiner::FoldICmpCstShlCst(ICmpInst &I, Value *Op, Value *A,
|
||||
APInt AP1 = CI1->getValue();
|
||||
APInt AP2 = CI2->getValue();
|
||||
|
||||
assert(AP2 != 0 && "Handled in InstSimplify");
|
||||
// Don't bother doing any work for cases which InstSimplify handles.
|
||||
if (AP2 == 0)
|
||||
return nullptr;
|
||||
|
||||
unsigned AP2TrailingZeros = AP2.countTrailingZeros();
|
||||
|
||||
@ -2591,11 +2596,13 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
if (match(Op0, m_AShr(m_ConstantInt(CI2), m_Value(A))) ||
|
||||
match(Op0, m_LShr(m_ConstantInt(CI2), m_Value(A)))) {
|
||||
// (icmp eq/ne (ashr/lshr const2, A), const1)
|
||||
return FoldICmpCstShrCst(I, Op0, A, CI, CI2);
|
||||
if (Instruction *Inst = FoldICmpCstShrCst(I, Op0, A, CI, CI2))
|
||||
return Inst;
|
||||
}
|
||||
if (match(Op0, m_Shl(m_ConstantInt(CI2), m_Value(A)))) {
|
||||
// (icmp eq/ne (shl const2, A), const1)
|
||||
return FoldICmpCstShlCst(I, Op0, A, CI, CI2);
|
||||
if (Instruction *Inst = FoldICmpCstShlCst(I, Op0, A, CI, CI2))
|
||||
return Inst;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user