Skip to content

Commit f0e2a65

Browse files
committed
Remove infinite recursion checking
1 parent 381c926 commit f0e2a65

18 files changed

+75
-101
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10001,25 +10001,15 @@ SDValue DAGCombiner::visitXOR(SDNode *N) {
1000110001
}
1000210002
}
1000310003

10004-
// fold (not (sub Y, X)) -> (add X, ~Y) if Y is a constant or the subtract has
10005-
// a single use.
10004+
// fold (not (sub Y, X)) -> (add X, ~Y) if Y is a constant
1000610005
if (N0.getOpcode() == ISD::SUB && isAllOnesConstant(N1)) {
1000710006
SDValue Y = N0.getOperand(0);
1000810007
SDValue X = N0.getOperand(1);
1000910008

10010-
// Avoid infinite recursion with
10011-
// Fold (and X, (add (not Y), Z)) -> (and X, (not (sub Y, Z)))
10012-
if (none_of(N->users(),
10013-
[](SDNode *User) { return User->getOpcode() == ISD::AND; })) {
10014-
if (isa<ConstantSDNode>(Y) || N0.hasOneUse()) {
10015-
SDValue NotY = DAG.getNOT(DL, Y, VT);
10016-
return DAG.getNode(ISD::ADD, DL, VT, X, NotY, N->getFlags());
10017-
}
10018-
} else {
10019-
if (isa<ConstantSDNode>(Y) && N0.hasOneUse()) {
10020-
SDValue NotY = DAG.getNOT(DL, Y, VT);
10021-
return DAG.getNode(ISD::ADD, DL, VT, X, NotY, N->getFlags());
10022-
}
10009+
if (auto *YConst = dyn_cast<ConstantSDNode>(Y)) {
10010+
APInt NotYValue = ~YConst->getAPIntValue();
10011+
SDValue NotY = DAG.getConstant(NotYValue, DL, VT);
10012+
return DAG.getNode(ISD::ADD, DL, VT, X, NotY, N->getFlags());
1002310013
}
1002410014
}
1002510015

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 4, 0(4)
3534
; CHECK-NEXT: lwz 3, 0(3)
36-
; CHECK-NEXT: rlwinm 4, 4, 0, 28, 28
35+
; CHECK-NEXT: lwz 4, 0(4)
3736
; CHECK-NEXT: rlwinm 3, 3, 0, 28, 28
38-
; CHECK-NEXT: not 4, 4
39-
; CHECK-NEXT: add 3, 3, 4
37+
; CHECK-NEXT: rlwinm 4, 4, 0, 28, 28
38+
; CHECK-NEXT: sub 3, 4, 3
39+
; CHECK-NEXT: not 3, 3
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
7980
; 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
1516
; 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: not r3, r3
69-
; CHECK-NEXT: add r3, r4, r3
68+
; CHECK-NEXT: sub r3, r3, r4
7069
; CHECK-NEXT: addis r4, r2, glob@toc@ha
70+
; CHECK-NEXT: not r3, r3
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
1516
; 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: not r3, r3
68-
; CHECK-NEXT: add r3, r4, r3
67+
; CHECK-NEXT: sub r3, r3, r4
6968
; CHECK-NEXT: addis r4, r2, glob@toc@ha
69+
; CHECK-NEXT: not r3, r3
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
1516
; 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: not r3, r3
68-
; CHECK-NEXT: add r3, r4, r3
67+
; CHECK-NEXT: sub r3, r3, r4
6968
; CHECK-NEXT: addis r4, r2, glob@toc@ha
69+
; CHECK-NEXT: not r3, r3
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: not r4, r4
16-
; CHECK-NEXT: add r3, r3, r4
15+
; CHECK-NEXT: sub r3, r4, r3
16+
; CHECK-NEXT: not r3, r3
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: not r4, r4
71-
; CHECK-NEXT: add r3, r3, r4
70+
; CHECK-NEXT: sub r3, r4, r3
7271
; 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: not r4, r4
16-
; CHECK-NEXT: add r3, r3, r4
15+
; CHECK-NEXT: sub r3, r4, r3
16+
; CHECK-NEXT: not r3, r3
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: not r4, r4
71-
; CHECK-NEXT: add r3, r3, r4
70+
; CHECK-NEXT: sub r3, r4, r3
7271
; 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: not r4, r4
16-
; CHECK-NEXT: add r3, r3, r4
15+
; CHECK-NEXT: sub r3, r4, r3
16+
; CHECK-NEXT: not r3, r3
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: not r4, r4
71-
; CHECK-NEXT: add r3, r3, r4
70+
; CHECK-NEXT: sub r3, r4, r3
7271
; 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
1516
; 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: not r3, r3
68-
; CHECK-NEXT: add r3, r4, r3
67+
; CHECK-NEXT: sub r3, r3, r4
6968
; CHECK-NEXT: addis r4, r2, glob@toc@ha
69+
; CHECK-NEXT: not r3, r3
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
1516
; 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: not r3, r3
68-
; CHECK-NEXT: add r3, r4, r3
67+
; CHECK-NEXT: sub r3, r3, r4
6968
; CHECK-NEXT: addis r4, r2, glob@toc@ha
69+
; CHECK-NEXT: not r3, r3
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)