Skip to content

Commit 0d326fc

Browse files
committed
[ConstraintElim] Decompose sub nsw
1 parent b18fb19 commit 0d326fc

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,13 @@ static Decomposition decompose(Value *V,
522522
if (match(V, m_NSWAdd(m_Value(Op0), m_Value(Op1))))
523523
return MergeResults(Op0, Op1, IsSigned);
524524

525+
if (match(V, m_NSWSub(m_Value(Op0), m_Value(Op1)))) {
526+
auto ResA = decompose(Op0, Preconditions, IsSigned, DL);
527+
auto ResB = decompose(Op1, Preconditions, IsSigned, DL);
528+
ResA.sub(ResB);
529+
return ResA;
530+
}
531+
525532
ConstantInt *CI;
526533
if (match(V, m_NSWMul(m_Value(Op0), m_ConstantInt(CI))) && canUseSExt(CI)) {
527534
auto Result = decompose(Op0, Preconditions, IsSigned, DL);

llvm/test/Transforms/ConstraintElimination/sub-nsw.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ define i1 @test_decompose_sub_nsw_sgt_nonneg(i32 %x, i32 %y) {
99
; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 10
1010
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
1111
; CHECK: [[IF_THEN]]:
12-
; CHECK-NEXT: [[RET:%.*]] = icmp slt i32 [[X]], [[Y]]
13-
; CHECK-NEXT: ret i1 [[RET]]
12+
; CHECK-NEXT: ret i1 true
1413
; CHECK: [[IF_ELSE]]:
1514
; CHECK-NEXT: ret i1 true
1615
;
@@ -35,8 +34,7 @@ define i1 @test_decompose_sub_nsw_sgt_zero(i32 %x, i32 %y) {
3534
; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 0
3635
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
3736
; CHECK: [[IF_THEN]]:
38-
; CHECK-NEXT: [[RET:%.*]] = icmp slt i32 [[X]], [[Y]]
39-
; CHECK-NEXT: ret i1 [[RET]]
37+
; CHECK-NEXT: ret i1 true
4038
; CHECK: [[IF_ELSE]]:
4139
; CHECK-NEXT: ret i1 true
4240
;
@@ -61,8 +59,7 @@ define i1 @test_decompose_sub_nsw_sgt_zero_inv(i32 %x, i32 %y) {
6159
; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 10
6260
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
6361
; CHECK: [[IF_THEN]]:
64-
; CHECK-NEXT: [[RET:%.*]] = icmp sge i32 [[X]], [[Y]]
65-
; CHECK-NEXT: ret i1 [[RET]]
62+
; CHECK-NEXT: ret i1 false
6663
; CHECK: [[IF_ELSE]]:
6764
; CHECK-NEXT: ret i1 true
6865
;

0 commit comments

Comments
 (0)