forked from OSchip/llvm-project
[InstCombine] Shift amount reassociation: fixup constantexpr handling (PR42484)
I was actually wondering if there was some nicer way than m_Value()+cast, but apparently what i was really "subconsciously" thinking about was correctness issue. hasNoUnsignedWrap()/hasNoUnsignedWrap() exist for Instruction, not for BinaryOperator, so let's just use m_Instruction(), thus both avoiding a cast, and a crash. Fixes https://bugs.llvm.org/show_bug.cgi?id=42484, https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=15587 llvm-svn: 364915
This commit is contained in:
parent
6c0dcf65e7
commit
0bde7c6527
|
@ -29,12 +29,12 @@ static Instruction *
|
|||
reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0,
|
||||
const SimplifyQuery &SQ) {
|
||||
// Look for: (x shiftopcode ShAmt0) shiftopcode ShAmt1
|
||||
Value *X, *ShAmt1, *Sh1Value, *ShAmt0;
|
||||
Value *X, *ShAmt1, *ShAmt0;
|
||||
Instruction *Sh1;
|
||||
if (!match(Sh0, m_Shift(m_CombineAnd(m_Shift(m_Value(X), m_Value(ShAmt1)),
|
||||
m_Value(Sh1Value)),
|
||||
m_Instruction(Sh1)),
|
||||
m_Value(ShAmt0))))
|
||||
return nullptr;
|
||||
auto *Sh1 = cast<BinaryOperator>(Sh1Value);
|
||||
|
||||
// The shift opcodes must be identical.
|
||||
Instruction::BinaryOps ShiftOpcode = Sh0->getOpcode();
|
||||
|
|
|
@ -154,6 +154,21 @@ define i32 @t11_shl_nsw_flag_preservation(i32 %x, i32 %y) {
|
|||
ret i32 %t3
|
||||
}
|
||||
|
||||
; Reduced from https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=15587
|
||||
@X = external global i32
|
||||
define i64 @constantexpr() {
|
||||
; CHECK-LABEL: @constantexpr(
|
||||
; CHECK-NEXT: ret i64 0
|
||||
;
|
||||
%A = alloca i64
|
||||
%L = load i64, i64* %A
|
||||
%V = add i64 ptrtoint (i32* @X to i64), 0
|
||||
%B2 = shl i64 %V, 0
|
||||
%B4 = ashr i64 %B2, %L
|
||||
%B = and i64 undef, %B4
|
||||
ret i64 %B
|
||||
}
|
||||
|
||||
; No one-use tests since we will only produce a single instruction here.
|
||||
|
||||
; Negative tests
|
||||
|
|
Loading…
Reference in New Issue