[PATCH] D39417: InstCombine: Preserve nuw when reassociating nuw ops [1/3]
Matt Arsenault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 18 16:24:58 PDT 2019
arsenm updated this revision to Diff 205463.
arsenm marked an inline comment as done.
arsenm retitled this revision from "InstCombine: Preserve nuw when reassociating nuw ops" to "InstCombine: Preserve nuw when reassociating nuw ops [1/3]".
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D39417/new/
https://reviews.llvm.org/D39417
Files:
lib/Transforms/InstCombine/InstructionCombining.cpp
test/Transforms/InstCombine/reassociate-nuw.ll
Index: test/Transforms/InstCombine/reassociate-nuw.ll
===================================================================
--- test/Transforms/InstCombine/reassociate-nuw.ll
+++ test/Transforms/InstCombine/reassociate-nuw.ll
@@ -92,7 +92,7 @@
define i32 @tryFactorization_add_nuw_mul_nuw(i32 %x) {
; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw(
-; CHECK-NEXT: [[ADD2:%.*]] = shl i32 [[X:%.*]], 2
+; CHECK-NEXT: [[ADD2:%.*]] = shl nuw i32 [[X:%.*]], 2
; CHECK-NEXT: ret i32 [[ADD2]]
;
%mul1 = mul nuw i32 %x, 3
@@ -102,7 +102,7 @@
define i32 @tryFactorization_add_nuw_mul_nuw_int_max(i32 %x) {
; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw_int_max(
-; CHECK-NEXT: [[ADD2:%.*]] = shl i32 [[X:%.*]], 31
+; CHECK-NEXT: [[ADD2:%.*]] = shl nuw i32 [[X:%.*]], 31
; CHECK-NEXT: ret i32 [[ADD2]]
;
%mul1 = mul nuw i32 %x, 2147483647
Index: lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- lib/Transforms/InstCombine/InstructionCombining.cpp
+++ lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -596,14 +596,21 @@
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(SimplifiedInst)) {
if (isa<OverflowingBinaryOperator>(SimplifiedInst)) {
bool HasNSW = false;
- if (isa<OverflowingBinaryOperator>(&I))
+ bool HasNUW = false;
+ if (isa<OverflowingBinaryOperator>(&I)) {
HasNSW = I.hasNoSignedWrap();
+ HasNUW = I.hasNoUnsignedWrap();
+ }
- if (auto *LOBO = dyn_cast<OverflowingBinaryOperator>(LHS))
+ if (auto *LOBO = dyn_cast<OverflowingBinaryOperator>(LHS)) {
HasNSW &= LOBO->hasNoSignedWrap();
+ HasNUW &= LOBO->hasNoUnsignedWrap();
+ }
- if (auto *ROBO = dyn_cast<OverflowingBinaryOperator>(RHS))
+ if (auto *ROBO = dyn_cast<OverflowingBinaryOperator>(RHS)) {
HasNSW &= ROBO->hasNoSignedWrap();
+ HasNUW &= ROBO->hasNoUnsignedWrap();
+ }
// We can propagate 'nsw' if we know that
// %Y = mul nsw i16 %X, C
@@ -615,8 +622,11 @@
const APInt *CInt;
if (TopLevelOpcode == Instruction::Add &&
InnerOpcode == Instruction::Mul)
- if (match(V, m_APInt(CInt)) && !CInt->isMinSignedValue())
- BO->setHasNoSignedWrap(HasNSW);
+ if (match(V, m_APInt(CInt))) {
+ if (!CInt->isMinSignedValue())
+ BO->setHasNoSignedWrap(HasNSW);
+ BO->setHasNoUnsignedWrap(HasNUW);
+ }
}
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39417.205463.patch
Type: text/x-patch
Size: 2569 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190618/4dc5728c/attachment.bin>
More information about the llvm-commits
mailing list