From 92ea6fc1355a2d27069a40f47ee146ce8d8d94d5 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Sun, 4 Apr 2021 23:25:29 +0300 Subject: [PATCH] [InstCombine] dropRedundantMaskingOfLeftShiftInput(): check that adding shift amounts doesn't overflow (PR49778) This is identical to 781d077afb0ed9771c513d064c40170c1ccd21c9, but for the other function. For certain shift amount bit widths, we must first ensure that adding shift amounts is safe, that the sum won't have an unsigned overflow. Fixes https://bugs.llvm.org/show_bug.cgi?id=49778 --- lib/Transforms/InstCombine/InstCombineShifts.cpp | 12 ++++++------ .../redundant-left-shift-input-masking-pr49778.ll | 7 ++++++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineShifts.cpp b/lib/Transforms/InstCombine/InstCombineShifts.cpp index 8413ae95c29..52237401718 100644 --- a/lib/Transforms/InstCombine/InstCombineShifts.cpp +++ b/lib/Transforms/InstCombine/InstCombineShifts.cpp @@ -226,9 +226,9 @@ dropRedundantMaskingOfLeftShiftInput(BinaryOperator *OuterShift, // Peek through an optional zext of the shift amount. match(MaskShAmt, m_ZExtOrSelf(m_Value(MaskShAmt))); - // We have two shift amounts from two different shifts. The types of those - // shift amounts may not match. If that's the case let's bailout now. - if (MaskShAmt->getType() != ShiftShAmt->getType()) + // Verify that it would be safe to try to add those two shift amounts. + if (!canTryToConstantAddTwoShiftAmounts(OuterShift, ShiftShAmt, Masked, + MaskShAmt)) return nullptr; // Can we simplify (MaskShAmt+ShiftShAmt) ? @@ -258,9 +258,9 @@ dropRedundantMaskingOfLeftShiftInput(BinaryOperator *OuterShift, // Peek through an optional zext of the shift amount. match(MaskShAmt, m_ZExtOrSelf(m_Value(MaskShAmt))); - // We have two shift amounts from two different shifts. The types of those - // shift amounts may not match. If that's the case let's bailout now. - if (MaskShAmt->getType() != ShiftShAmt->getType()) + // Verify that it would be safe to try to add those two shift amounts. + if (!canTryToConstantAddTwoShiftAmounts(OuterShift, ShiftShAmt, Masked, + MaskShAmt)) return nullptr; // Can we simplify (ShiftShAmt-MaskShAmt) ? diff --git a/test/Transforms/InstCombine/redundant-left-shift-input-masking-pr49778.ll b/test/Transforms/InstCombine/redundant-left-shift-input-masking-pr49778.ll index 4865afa56a0..8d70733ed03 100644 --- a/test/Transforms/InstCombine/redundant-left-shift-input-masking-pr49778.ll +++ b/test/Transforms/InstCombine/redundant-left-shift-input-masking-pr49778.ll @@ -4,7 +4,12 @@ ; PR49778: this should not be folded to 0. define i32 @src(i1 %x2) { ; CHECK-LABEL: @src( -; CHECK-NEXT: ret i32 0 +; CHECK-NEXT: [[X13:%.*]] = zext i1 [[X2:%.*]] to i32 +; CHECK-NEXT: [[_7:%.*]] = shl i32 -1, [[X13]] +; CHECK-NEXT: [[MASK:%.*]] = xor i32 [[_7]], -1 +; CHECK-NEXT: [[_8:%.*]] = and i32 [[MASK]], [[X13]] +; CHECK-NEXT: [[_9:%.*]] = shl i32 [[_8]], [[X13]] +; CHECK-NEXT: ret i32 [[_9]] ; %x13 = zext i1 %x2 to i32 %_7 = shl i32 4294967295, %x13