[llvm-branch-commits] [llvm] c9b952e - [InstCombine] Drop nsw in negation of select (#112893)
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Nov 18 08:01:51 PST 2024
Author: Yingwei Zheng
Date: 2024-11-18T17:02:00+01:00
New Revision: c9b952e0e0b8f90c8d2b99f07263c43bced043f5
URL: https://github.com/llvm/llvm-project/commit/c9b952e0e0b8f90c8d2b99f07263c43bced043f5
DIFF: https://github.com/llvm/llvm-project/commit/c9b952e0e0b8f90c8d2b99f07263c43bced043f5.diff
LOG: [InstCombine] Drop nsw in negation of select (#112893)
Closes https://github.com/llvm/llvm-project/issues/112666 and
https://github.com/llvm/llvm-project/issues/114181.
(cherry picked from commit ff07df6620c32571c7e13ff96ec7976c63ed0ab8)
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp
llvm/test/Transforms/InstCombine/sub-of-negatible.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp b/llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp
index e4895b59f4b4a9..cb052da79bb3c6 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineNegator.cpp
@@ -334,6 +334,17 @@ std::array<Value *, 2> Negator::getSortedOperandsOfBinOp(Instruction *I) {
NewSelect->swapValues();
// Don't swap prof metadata, we didn't change the branch behavior.
NewSelect->setName(I->getName() + ".neg");
+ // Poison-generating flags should be dropped
+ Value *TV = NewSelect->getTrueValue();
+ Value *FV = NewSelect->getFalseValue();
+ if (match(TV, m_Neg(m_Specific(FV))))
+ cast<Instruction>(TV)->dropPoisonGeneratingFlags();
+ else if (match(FV, m_Neg(m_Specific(TV))))
+ cast<Instruction>(FV)->dropPoisonGeneratingFlags();
+ else {
+ cast<Instruction>(TV)->dropPoisonGeneratingFlags();
+ cast<Instruction>(FV)->dropPoisonGeneratingFlags();
+ }
Builder.Insert(NewSelect);
return NewSelect;
}
diff --git a/llvm/test/Transforms/InstCombine/sub-of-negatible.ll b/llvm/test/Transforms/InstCombine/sub-of-negatible.ll
index b2e14ceaca1b08..f9549881aa3131 100644
--- a/llvm/test/Transforms/InstCombine/sub-of-negatible.ll
+++ b/llvm/test/Transforms/InstCombine/sub-of-negatible.ll
@@ -1374,6 +1374,48 @@ define i8 @negate_select_of_op_vs_negated_op(i8 %x, i8 %y, i1 %c) {
%t2 = sub i8 %y, %t1
ret i8 %t2
}
+
+define i8 @negate_select_of_op_vs_negated_op_nsw(i8 %x, i8 %y, i1 %c) {
+; CHECK-LABEL: @negate_select_of_op_vs_negated_op_nsw(
+; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[X:%.*]]
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C:%.*]], i8 [[X]], i8 [[T0]]
+; CHECK-NEXT: [[T2:%.*]] = add i8 [[TMP1]], [[Y:%.*]]
+; CHECK-NEXT: ret i8 [[T2]]
+;
+ %t0 = sub nsw i8 0, %x
+ %t1 = select i1 %c, i8 %t0, i8 %x
+ %t2 = sub i8 %y, %t1
+ ret i8 %t2
+}
+
+define i8 @negate_select_of_op_vs_negated_op_nsw_commuted(i8 %x, i8 %y, i1 %c) {
+; CHECK-LABEL: @negate_select_of_op_vs_negated_op_nsw_commuted(
+; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[X:%.*]]
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C:%.*]], i8 [[T0]], i8 [[X]]
+; CHECK-NEXT: [[T2:%.*]] = add i8 [[TMP1]], [[Y:%.*]]
+; CHECK-NEXT: ret i8 [[T2]]
+;
+ %t0 = sub nsw i8 0, %x
+ %t1 = select i1 %c, i8 %x, i8 %t0
+ %t2 = sub i8 %y, %t1
+ ret i8 %t2
+}
+
+define i8 @negate_select_of_op_vs_negated_op_nsw_xyyx(i8 %x, i8 %y, i8 %z, i1 %c) {
+; CHECK-LABEL: @negate_select_of_op_vs_negated_op_nsw_xyyx(
+; CHECK-NEXT: [[SUB1:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[SUB2:%.*]] = sub i8 [[Y]], [[X]]
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C:%.*]], i8 [[SUB2]], i8 [[SUB1]]
+; CHECK-NEXT: [[T2:%.*]] = add i8 [[TMP1]], [[Z:%.*]]
+; CHECK-NEXT: ret i8 [[T2]]
+;
+ %sub1 = sub nsw i8 %x, %y
+ %sub2 = sub nsw i8 %y, %x
+ %t1 = select i1 %c, i8 %sub1, i8 %sub2
+ %t2 = sub i8 %z, %t1
+ ret i8 %t2
+}
+
define i8 @dont_negate_ordinary_select(i8 %x, i8 %y, i8 %z, i1 %c) {
; CHECK-LABEL: @dont_negate_ordinary_select(
; CHECK-NEXT: [[T0:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]
More information about the llvm-branch-commits
mailing list