mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[InstCombine] foldShiftIntoShiftInAnotherHandOfAndInICmp(): avoid constantexpr pitfail (PR42962)
Instead of matching value and then blindly casting to BinaryOperator just to get the opcode, just match instruction and do no cast. Fixes https://bugs.llvm.org/show_bug.cgi?id=42962 llvm-svn: 368554
This commit is contained in:
parent
70688517d3
commit
caf7add21b
@ -3312,10 +3312,10 @@ foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ,
|
||||
|
||||
// Look for an 'and' of two (opposite) logical shifts.
|
||||
// Pick the single-use shift as XShift.
|
||||
Value *XShift, *YShift;
|
||||
Instruction *XShift, *YShift;
|
||||
if (!match(I.getOperand(0),
|
||||
m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Value(XShift)),
|
||||
m_CombineAnd(m_AnyLogicalShift, m_Value(YShift)))))
|
||||
m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
|
||||
m_CombineAnd(m_AnyLogicalShift, m_Instruction(YShift)))))
|
||||
return nullptr;
|
||||
|
||||
// If YShift is a 'lshr', swap the shifts around.
|
||||
@ -3323,9 +3323,8 @@ foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ,
|
||||
std::swap(XShift, YShift);
|
||||
|
||||
// The shifts must be in opposite directions.
|
||||
Instruction::BinaryOps XShiftOpcode =
|
||||
cast<BinaryOperator>(XShift)->getOpcode();
|
||||
if (XShiftOpcode == cast<BinaryOperator>(YShift)->getOpcode())
|
||||
auto XShiftOpcode = XShift->getOpcode();
|
||||
if (XShiftOpcode == YShift->getOpcode())
|
||||
return nullptr; // Do not care about same-direction shifts here.
|
||||
|
||||
Value *X, *XShAmt, *Y, *YShAmt;
|
||||
|
@ -667,3 +667,15 @@ define <2 x i1> @n38_overshift(<2 x i32> %x, <2 x i32> %y) {
|
||||
%t3 = icmp ne <2 x i32> %t2, <i32 0, i32 0>
|
||||
ret <2 x i1> %t3
|
||||
}
|
||||
|
||||
; As usual, don't crash given constantexpr's :/
|
||||
@f.a = internal global i16 0
|
||||
define i1 @constantexpr() {
|
||||
entry:
|
||||
%0 = load i16, i16* @f.a
|
||||
%shr = ashr i16 %0, 1
|
||||
%shr1 = ashr i16 %shr, zext (i1 icmp ne (i16 ptrtoint (i16* @f.a to i16), i16 1) to i16)
|
||||
%and = and i16 %shr1, 1
|
||||
%tobool = icmp ne i16 %and, 0
|
||||
ret i1 %tobool
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user