Skip to content

Commit

Permalink
[InstCombine] add overflow checking on AddSub C-(X+C2) --> (C-C2)-X
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D152068
  • Loading branch information
khei4 committed Jun 5, 2023
1 parent 41588b5 commit 4db8d4f
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 7 deletions.
13 changes: 11 additions & 2 deletions llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
Expand Up @@ -1995,8 +1995,17 @@ Instruction *InstCombinerImpl::visitSub(BinaryOperator &I) {
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 * {
Expand Down
9 changes: 4 additions & 5 deletions llvm/test/Transforms/InstCombine/addsub-constant-folding.ll
Expand Up @@ -134,7 +134,7 @@ define i32 @add_const_const_sub(i32 %arg) {

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
Expand Down Expand Up @@ -193,14 +193,13 @@ define i8 @add_const_const_sub_nuw(i8 %arg) {
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
}

Expand Down

0 comments on commit 4db8d4f

Please sign in to comment.