Skip to content

Commit e8e7135

Browse files
committed
[SelectionDAG] fold (not (sub Y, X)) -> (add X, ~Y)
This replaces (not (neg x)) -> (add X, -1) because that is covered by this.
1 parent a8280c4 commit e8e7135

14 files changed

+57
-54
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9979,13 +9979,16 @@ SDValue DAGCombiner::visitXOR(SDNode *N) {
99799979
}
99809980
}
99819981

9982-
// fold (not (neg x)) -> (add X, -1)
9983-
// FIXME: This can be generalized to (not (sub Y, X)) -> (add X, ~Y) if
9984-
// Y is a constant or the subtract has a single use.
9985-
if (isAllOnesConstant(N1) && N0.getOpcode() == ISD::SUB &&
9986-
isNullConstant(N0.getOperand(0))) {
9987-
return DAG.getNode(ISD::ADD, DL, VT, N0.getOperand(1),
9988-
DAG.getAllOnesConstant(DL, VT));
9982+
// fold (not (sub Y, X)) -> (add X, ~Y) if subtract is a single use
9983+
// or Y is a constant.
9984+
if (isAllOnesConstant(N1) && N0.getOpcode() == ISD::SUB) {
9985+
SDValue N00 = N0.getOperand(0), N01 = N0.getOperand(1);
9986+
if (isa<ConstantSDNode>(N00) || N0.hasOneUse()) {
9987+
SDValue NotY =
9988+
DAG.getNode(ISD::XOR, SDLoc(N00), VT, N00, N1); // N00 = ~N00
9989+
AddToWorklist(NotY.getNode());
9990+
return DAG.getNode(ISD::ADD, DL, VT, N01, NotY);
9991+
}
99899992
}
99909993

99919994
// fold (not (add X, -1)) -> (neg X)

llvm/test/CodeGen/PowerPC/setcc-to-sub.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ entry:
3131
define zeroext i1 @test2(ptr %s_a, ptr %s_b) local_unnamed_addr #0 {
3232
; CHECK-LABEL: test2:
3333
; CHECK: # %bb.0: # %entry
34-
; CHECK-NEXT: lwz 3, 0(3)
3534
; CHECK-NEXT: lwz 4, 0(4)
36-
; CHECK-NEXT: rlwinm 3, 3, 0, 28, 28
35+
; CHECK-NEXT: lwz 3, 0(3)
3736
; CHECK-NEXT: rlwinm 4, 4, 0, 28, 28
38-
; CHECK-NEXT: sub 3, 4, 3
39-
; CHECK-NEXT: not 3, 3
37+
; CHECK-NEXT: rlwinm 3, 3, 0, 28, 28
38+
; CHECK-NEXT: not 4, 4
39+
; CHECK-NEXT: add 3, 3, 4
4040
; CHECK-NEXT: rldicl 3, 3, 1, 63
4141
; CHECK-NEXT: blr
4242
entry:
@@ -76,8 +76,8 @@ define zeroext i1 @test4(ptr %s_a, ptr %s_b) local_unnamed_addr #0 {
7676
; CHECK-NEXT: lwz 4, 0(4)
7777
; CHECK-NEXT: rlwinm 3, 3, 0, 28, 28
7878
; CHECK-NEXT: rlwinm 4, 4, 0, 28, 28
79-
; CHECK-NEXT: sub 3, 3, 4
8079
; CHECK-NEXT: not 3, 3
80+
; CHECK-NEXT: add 3, 4, 3
8181
; CHECK-NEXT: rldicl 3, 3, 1, 63
8282
; CHECK-NEXT: blr
8383
entry:

llvm/test/CodeGen/PowerPC/testComparesigeuc.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
define dso_local signext i32 @test_igeuc(i8 zeroext %a, i8 zeroext %b) {
1313
; CHECK-LABEL: test_igeuc:
1414
; CHECK: # %bb.0: # %entry
15-
; CHECK-NEXT: sub r3, r3, r4
1615
; CHECK-NEXT: not r3, r3
16+
; CHECK-NEXT: add r3, r4, r3
1717
; CHECK-NEXT: rldicl r3, r3, 1, 63
1818
; CHECK-NEXT: blr
1919
entry:
@@ -65,9 +65,9 @@ entry:
6565
define dso_local void @test_igeuc_store(i8 zeroext %a, i8 zeroext %b) {
6666
; CHECK-LABEL: test_igeuc_store:
6767
; CHECK: # %bb.0: # %entry
68-
; CHECK-NEXT: sub r3, r3, r4
69-
; CHECK-NEXT: addis r4, r2, glob@toc@ha
7068
; CHECK-NEXT: not r3, r3
69+
; CHECK-NEXT: add r3, r4, r3
70+
; CHECK-NEXT: addis r4, r2, glob@toc@ha
7171
; CHECK-NEXT: rldicl r3, r3, 1, 63
7272
; CHECK-NEXT: stb r3, glob@toc@l(r4)
7373
; CHECK-NEXT: blr

llvm/test/CodeGen/PowerPC/testComparesigeui.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
define dso_local signext i32 @test_igeui(i32 zeroext %a, i32 zeroext %b) {
1313
; CHECK-LABEL: test_igeui:
1414
; CHECK: # %bb.0: # %entry
15-
; CHECK-NEXT: sub r3, r3, r4
1615
; CHECK-NEXT: not r3, r3
16+
; CHECK-NEXT: add r3, r4, r3
1717
; CHECK-NEXT: rldicl r3, r3, 1, 63
1818
; CHECK-NEXT: blr
1919
entry:
@@ -64,9 +64,9 @@ entry:
6464
define dso_local void @test_igeui_store(i32 zeroext %a, i32 zeroext %b) {
6565
; CHECK-LABEL: test_igeui_store:
6666
; CHECK: # %bb.0: # %entry
67-
; CHECK-NEXT: sub r3, r3, r4
68-
; CHECK-NEXT: addis r4, r2, glob@toc@ha
6967
; CHECK-NEXT: not r3, r3
68+
; CHECK-NEXT: add r3, r4, r3
69+
; CHECK-NEXT: addis r4, r2, glob@toc@ha
7070
; CHECK-NEXT: rldicl r3, r3, 1, 63
7171
; CHECK-NEXT: stw r3, glob@toc@l(r4)
7272
; CHECK-NEXT: blr

llvm/test/CodeGen/PowerPC/testComparesigeus.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
define dso_local signext i32 @test_igeus(i16 zeroext %a, i16 zeroext %b) {
1313
; CHECK-LABEL: test_igeus:
1414
; CHECK: # %bb.0: # %entry
15-
; CHECK-NEXT: sub r3, r3, r4
1615
; CHECK-NEXT: not r3, r3
16+
; CHECK-NEXT: add r3, r4, r3
1717
; CHECK-NEXT: rldicl r3, r3, 1, 63
1818
; CHECK-NEXT: blr
1919
entry:
@@ -64,9 +64,9 @@ entry:
6464
define dso_local void @test_igeus_store(i16 zeroext %a, i16 zeroext %b) {
6565
; CHECK-LABEL: test_igeus_store:
6666
; CHECK: # %bb.0: # %entry
67-
; CHECK-NEXT: sub r3, r3, r4
68-
; CHECK-NEXT: addis r4, r2, glob@toc@ha
6967
; CHECK-NEXT: not r3, r3
68+
; CHECK-NEXT: add r3, r4, r3
69+
; CHECK-NEXT: addis r4, r2, glob@toc@ha
7070
; CHECK-NEXT: rldicl r3, r3, 1, 63
7171
; CHECK-NEXT: sth r3, glob@toc@l(r4)
7272
; CHECK-NEXT: blr

llvm/test/CodeGen/PowerPC/testComparesileuc.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
define dso_local signext i32 @test_ileuc(i8 zeroext %a, i8 zeroext %b) {
1313
; CHECK-LABEL: test_ileuc:
1414
; CHECK: # %bb.0: # %entry
15-
; CHECK-NEXT: sub r3, r4, r3
16-
; CHECK-NEXT: not r3, r3
15+
; CHECK-NEXT: not r4, r4
16+
; CHECK-NEXT: add r3, r3, r4
1717
; CHECK-NEXT: rldicl r3, r3, 1, 63
1818
; CHECK-NEXT: blr
1919
entry:
@@ -67,9 +67,9 @@ entry:
6767
define dso_local void @test_ileuc_store(i8 zeroext %a, i8 zeroext %b) {
6868
; CHECK-LABEL: test_ileuc_store:
6969
; CHECK: # %bb.0: # %entry
70-
; CHECK-NEXT: sub r3, r4, r3
70+
; CHECK-NEXT: not r4, r4
71+
; CHECK-NEXT: add r3, r3, r4
7172
; CHECK-NEXT: addis r4, r2, glob@toc@ha
72-
; CHECK-NEXT: not r3, r3
7373
; CHECK-NEXT: rldicl r3, r3, 1, 63
7474
; CHECK-NEXT: stb r3, glob@toc@l(r4)
7575
; CHECK-NEXT: blr

llvm/test/CodeGen/PowerPC/testComparesileui.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
define dso_local signext i32 @test_ileui(i32 zeroext %a, i32 zeroext %b) {
1313
; CHECK-LABEL: test_ileui:
1414
; CHECK: # %bb.0: # %entry
15-
; CHECK-NEXT: sub r3, r4, r3
16-
; CHECK-NEXT: not r3, r3
15+
; CHECK-NEXT: not r4, r4
16+
; CHECK-NEXT: add r3, r3, r4
1717
; CHECK-NEXT: rldicl r3, r3, 1, 63
1818
; CHECK-NEXT: blr
1919
entry:
@@ -67,9 +67,9 @@ entry:
6767
define dso_local void @test_ileui_store(i32 zeroext %a, i32 zeroext %b) {
6868
; CHECK-LABEL: test_ileui_store:
6969
; CHECK: # %bb.0: # %entry
70-
; CHECK-NEXT: sub r3, r4, r3
70+
; CHECK-NEXT: not r4, r4
71+
; CHECK-NEXT: add r3, r3, r4
7172
; CHECK-NEXT: addis r4, r2, glob@toc@ha
72-
; CHECK-NEXT: not r3, r3
7373
; CHECK-NEXT: rldicl r3, r3, 1, 63
7474
; CHECK-NEXT: stw r3, glob@toc@l(r4)
7575
; CHECK-NEXT: blr

llvm/test/CodeGen/PowerPC/testComparesileus.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
define dso_local signext i32 @test_ileus(i16 zeroext %a, i16 zeroext %b) {
1313
; CHECK-LABEL: test_ileus:
1414
; CHECK: # %bb.0: # %entry
15-
; CHECK-NEXT: sub r3, r4, r3
16-
; CHECK-NEXT: not r3, r3
15+
; CHECK-NEXT: not r4, r4
16+
; CHECK-NEXT: add r3, r3, r4
1717
; CHECK-NEXT: rldicl r3, r3, 1, 63
1818
; CHECK-NEXT: blr
1919
entry:
@@ -67,9 +67,9 @@ entry:
6767
define dso_local void @test_ileus_store(i16 zeroext %a, i16 zeroext %b) {
6868
; CHECK-LABEL: test_ileus_store:
6969
; CHECK: # %bb.0: # %entry
70-
; CHECK-NEXT: sub r3, r4, r3
70+
; CHECK-NEXT: not r4, r4
71+
; CHECK-NEXT: add r3, r3, r4
7172
; CHECK-NEXT: addis r4, r2, glob@toc@ha
72-
; CHECK-NEXT: not r3, r3
7373
; CHECK-NEXT: rldicl r3, r3, 1, 63
7474
; CHECK-NEXT: sth r3, glob@toc@l(r4)
7575
; CHECK-NEXT: blr

llvm/test/CodeGen/PowerPC/testComparesllgeuc.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
define i64 @test_llgeuc(i8 zeroext %a, i8 zeroext %b) {
1313
; CHECK-LABEL: test_llgeuc:
1414
; CHECK: # %bb.0: # %entry
15-
; CHECK-NEXT: sub r3, r3, r4
1615
; CHECK-NEXT: not r3, r3
16+
; CHECK-NEXT: add r3, r4, r3
1717
; CHECK-NEXT: rldicl r3, r3, 1, 63
1818
; CHECK-NEXT: blr
1919
entry:
@@ -64,9 +64,9 @@ entry:
6464
define dso_local void @test_llgeuc_store(i8 zeroext %a, i8 zeroext %b) {
6565
; CHECK-LABEL: test_llgeuc_store:
6666
; CHECK: # %bb.0: # %entry
67-
; CHECK-NEXT: sub r3, r3, r4
68-
; CHECK-NEXT: addis r4, r2, glob@toc@ha
6967
; CHECK-NEXT: not r3, r3
68+
; CHECK-NEXT: add r3, r4, r3
69+
; CHECK-NEXT: addis r4, r2, glob@toc@ha
7070
; CHECK-NEXT: rldicl r3, r3, 1, 63
7171
; CHECK-NEXT: stb r3, glob@toc@l(r4)
7272
; CHECK-NEXT: blr

llvm/test/CodeGen/PowerPC/testComparesllgeui.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
define i64 @test_llgeui(i32 zeroext %a, i32 zeroext %b) {
1313
; CHECK-LABEL: test_llgeui:
1414
; CHECK: # %bb.0: # %entry
15-
; CHECK-NEXT: sub r3, r3, r4
1615
; CHECK-NEXT: not r3, r3
16+
; CHECK-NEXT: add r3, r4, r3
1717
; CHECK-NEXT: rldicl r3, r3, 1, 63
1818
; CHECK-NEXT: blr
1919
entry:
@@ -64,9 +64,9 @@ entry:
6464
define dso_local void @test_llgeui_store(i32 zeroext %a, i32 zeroext %b) {
6565
; CHECK-LABEL: test_llgeui_store:
6666
; CHECK: # %bb.0: # %entry
67-
; CHECK-NEXT: sub r3, r3, r4
68-
; CHECK-NEXT: addis r4, r2, glob@toc@ha
6967
; CHECK-NEXT: not r3, r3
68+
; CHECK-NEXT: add r3, r4, r3
69+
; CHECK-NEXT: addis r4, r2, glob@toc@ha
7070
; CHECK-NEXT: rldicl r3, r3, 1, 63
7171
; CHECK-NEXT: stw r3, glob@toc@l(r4)
7272
; CHECK-NEXT: blr

0 commit comments

Comments
 (0)