Skip to content

Commit 52f323d

Browse files
bcl5980rotateright
authored andcommitted
[InstCombine] Fold abs of known negative operand when source is sub
When abs source comes from (x - y), check if a "x > y" dominating condition exists. Fixes #54132 Differential Revision: https://reviews.llvm.org/D122013
1 parent 6c90a65 commit 52f323d

File tree

2 files changed

+11
-10
lines changed

2 files changed

+11
-10
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,10 @@ static Optional<bool> getKnownSign(Value *Op, Instruction *CxtI,
812812
if (Known.isNegative())
813813
return true;
814814

815+
Value *X, *Y;
816+
if (match(Op, m_NSWSub(m_Value(X), m_Value(Y))))
817+
return isImpliedByDomCondition(ICmpInst::ICMP_SLT, X, Y, CxtI, DL);
818+
815819
return isImpliedByDomCondition(
816820
ICmpInst::ICMP_SLT, Op, Constant::getNullValue(Op->getType()), CxtI, DL);
817821
}

llvm/test/Transforms/InstCombine/abs-intrinsic.ll

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -433,10 +433,9 @@ define i32 @sub_abs_gt(i32 %x, i32 %y) {
433433
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
434434
; CHECK: cond.true:
435435
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X]], [[Y]]
436-
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 true)
437436
; CHECK-NEXT: br label [[COND_END]]
438437
; CHECK: cond.end:
439-
; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[TMP0]], [[COND_TRUE]] ], [ 0, [[ENTRY:%.*]] ]
438+
; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[SUB]], [[COND_TRUE]] ], [ 0, [[ENTRY:%.*]] ]
440439
; CHECK-NEXT: ret i32 [[R]]
441440
;
442441
entry:
@@ -456,14 +455,13 @@ cond.end:
456455
define i32 @sub_abs_lt(i32 %x, i32 %y) {
457456
; CHECK-LABEL: @sub_abs_lt(
458457
; CHECK-NEXT: entry:
459-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
458+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[Y:%.*]], [[X:%.*]]
460459
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
461460
; CHECK: cond.true:
462-
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X]], [[Y]]
463-
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 true)
461+
; CHECK-NEXT: [[SUB_NEG:%.*]] = sub i32 [[Y]], [[X]]
464462
; CHECK-NEXT: br label [[COND_END]]
465463
; CHECK: cond.end:
466-
; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[TMP0]], [[COND_TRUE]] ], [ 0, [[ENTRY:%.*]] ]
464+
; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[SUB_NEG]], [[COND_TRUE]] ], [ 0, [[ENTRY:%.*]] ]
467465
; CHECK-NEXT: ret i32 [[R]]
468466
;
469467
entry:
@@ -483,14 +481,13 @@ cond.end:
483481
define i32 @sub_abs_lt_min_not_poison(i32 %x, i32 %y) {
484482
; CHECK-LABEL: @sub_abs_lt_min_not_poison(
485483
; CHECK-NEXT: entry:
486-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
484+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[Y:%.*]], [[X:%.*]]
487485
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
488486
; CHECK: cond.true:
489-
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X]], [[Y]]
490-
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 false)
487+
; CHECK-NEXT: [[SUB_NEG:%.*]] = sub i32 [[Y]], [[X]]
491488
; CHECK-NEXT: br label [[COND_END]]
492489
; CHECK: cond.end:
493-
; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[TMP0]], [[COND_TRUE]] ], [ 0, [[ENTRY:%.*]] ]
490+
; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[SUB_NEG]], [[COND_TRUE]] ], [ 0, [[ENTRY:%.*]] ]
494491
; CHECK-NEXT: ret i32 [[R]]
495492
;
496493
entry:

0 commit comments

Comments
 (0)