[PATCH] D152068: [InstCombine] add overflow checking on AddSub `C-(X+C2) --> (C-C2)-X`
Kohei Asano via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 4 20:31:34 PDT 2023
khei4 updated this revision to Diff 528267.
khei4 added a comment.
remove noise test
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D152068/new/
https://reviews.llvm.org/D152068
Files:
llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
llvm/test/Transforms/InstCombine/addsub-constant-folding.ll
Index: llvm/test/Transforms/InstCombine/addsub-constant-folding.ll
===================================================================
--- llvm/test/Transforms/InstCombine/addsub-constant-folding.ll
+++ llvm/test/Transforms/InstCombine/addsub-constant-folding.ll
@@ -134,7 +134,7 @@
define i8 @add_nsw_const_const_sub_nsw(i8 %arg) {
; CHECK-LABEL: @add_nsw_const_const_sub_nsw(
-; CHECK-NEXT: [[T1:%.*]] = sub i8 -128, [[ARG:%.*]]
+; CHECK-NEXT: [[T1:%.*]] = sub nsw i8 -128, [[ARG:%.*]]
; CHECK-NEXT: ret i8 [[T1]]
;
%t0 = add nsw i8 %arg, 1
@@ -193,14 +193,13 @@
ret i8 %t1
}
-
define <2 x i8> @non_splat_vec_add_nsw_const_const_sub_nsw_not_ov1(<2 x i8> %arg) {
; CHECK-LABEL: @non_splat_vec_add_nsw_const_const_sub_nsw_not_ov1(
-; CHECK-NEXT: [[T1:%.*]] = sub <2 x i8> <i8 -2, i8 -126>, [[ARG:%.*]]
+; CHECK-NEXT: [[T1:%.*]] = sub nsw <2 x i8> <i8 -127, i8 -126>, [[ARG:%.*]]
; CHECK-NEXT: ret <2 x i8> [[T1]]
;
- %t0 = add nsw <2 x i8> %arg, <i8 1, i8 0>
- %t1 = sub nsw <2 x i8> <i8 -1, i8 -126>, %t0
+ %t0 = add nsw <2 x i8> %arg, <i8 2, i8 0>
+ %t1 = sub nsw <2 x i8> <i8 -125, i8 -126>, %t0
ret <2 x i8> %t1
}
Index: llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -1995,8 +1995,17 @@
Constant *C2;
// C-(X+C2) --> (C-C2)-X
- if (match(Op1, m_Add(m_Value(X), m_ImmConstant(C2))))
- return BinaryOperator::CreateSub(ConstantExpr::getSub(C, C2), X);
+ if (match(Op1, m_Add(m_Value(X), m_ImmConstant(C2)))) {
+ // C-C2 never overflow, and C-(X+C2), (X+C2) has NSW
+ // => (C-C2)-X can have NSW
+ bool WillNotSOV = willNotOverflowSignedSub(C, C2, I);
+ BinaryOperator *Res =
+ BinaryOperator::CreateSub(ConstantExpr::getSub(C, C2), X);
+ auto *OBO1 = cast<OverflowingBinaryOperator>(Op1);
+ Res->setHasNoSignedWrap(I.hasNoSignedWrap() && OBO1->hasNoSignedWrap() &&
+ WillNotSOV);
+ return Res;
+ }
}
auto TryToNarrowDeduceFlags = [this, &I, &Op0, &Op1]() -> Instruction * {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D152068.528267.patch
Type: text/x-patch
Size: 2225 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230605/aaa6336c/attachment.bin>
More information about the llvm-commits
mailing list