[llvm] r368554 - [InstCombine] foldShiftIntoShiftInAnotherHandOfAndInICmp(): avoid constantexpr pitfail (PR42962)
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 13 04:56:03 PDT 2019
Merged together with r368517--r368519 to release_90 in r368673.
On Mon, Aug 12, 2019 at 1:26 PM Roman Lebedev via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: lebedevri
> Date: Mon Aug 12 04:28:02 2019
> New Revision: 368554
>
> URL: http://llvm.org/viewvc/llvm-project?rev=368554&view=rev
> Log:
> [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
>
> Modified:
> llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> llvm/trunk/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=368554&r1=368553&r2=368554&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Mon Aug 12 04:28:02 2019
> @@ -3312,10 +3312,10 @@ foldShiftIntoShiftInAnotherHandOfAndInIC
>
> // 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 @@ foldShiftIntoShiftInAnotherHandOfAndInIC
> 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;
>
> Modified: llvm/trunk/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll?rev=368554&r1=368553&r2=368554&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll Mon Aug 12 04:28:02 2019
> @@ -667,3 +667,15 @@ define <2 x i1> @n38_overshift(<2 x i32>
> %t3 = icmp ne <2 x i32> %t2, <i32 0, i32 0>
> ret <2 x i1> %t3
> }
> +
> +; As usual, don't crash given constantexpr's :/
> + at 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
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list