Skip to content

Commit 8ca5690

Browse files
nikictstellar
authored andcommitted
[PowerPC] Fix infinite loop in peephole CR optimization (PR49509)
If we encounter a degenerate select node where both operands are the same, then we can continue negating the condition while swapping operands, resulting in an infinite loop. Avoid this by bailing out if both operands are the same. Fixes https://bugs.llvm.org/show_bug.cgi?id=49509. Differential Revision: https://reviews.llvm.org/D98340 (cherry picked from commit 2489cba)
1 parent f43958b commit 8ca5690

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5896,7 +5896,13 @@ bool PPCDAGToDAGISel::AllUsersSelectZero(SDNode *N) {
58965896
User->getMachineOpcode() != PPC::SELECT_I8)
58975897
return false;
58985898

5899+
SDNode *Op1 = User->getOperand(1).getNode();
58995900
SDNode *Op2 = User->getOperand(2).getNode();
5901+
// If we have a degenerate select with two equal operands, swapping will
5902+
// not do anything, and we may run into an infinite loop.
5903+
if (Op1 == Op2)
5904+
return false;
5905+
59005906
if (!Op2->isMachineOpcode())
59015907
return false;
59025908

llvm/test/CodeGen/PowerPC/pr49509.ll

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s
3+
4+
target datalayout = "E-m:e-p:32:32-i64:64-n32"
5+
6+
define void @test() {
7+
; CHECK-LABEL: test:
8+
; CHECK: # %bb.0: # %bb
9+
; CHECK-NEXT: bc 12, 20, .LBB0_2
10+
; CHECK-NEXT: # %bb.1: # %bb2
11+
; CHECK-NEXT: li 3, 0
12+
; CHECK-NEXT: stw 3, 0(3)
13+
; CHECK-NEXT: lis 3, 256
14+
; CHECK-NEXT: stw 3, 0(3)
15+
; CHECK-NEXT: blr
16+
; CHECK-NEXT: .LBB0_2: # %bb1
17+
; CHECK-NEXT: bclr 4, 20, 0
18+
; CHECK-NEXT: # %bb.3: # %bb66
19+
; CHECK-NEXT: lwz 4, 12(0)
20+
; CHECK-NEXT: lwz 5, 8(0)
21+
; CHECK-NEXT: lwz 6, 0(0)
22+
; CHECK-NEXT: lwz 7, 4(0)
23+
; CHECK-NEXT: lbz 3, 0(3)
24+
; CHECK-NEXT: and 5, 5, 6
25+
; CHECK-NEXT: and 4, 4, 7
26+
; CHECK-NEXT: and 4, 4, 5
27+
; CHECK-NEXT: cmpwi 3, 0
28+
; CHECK-NEXT: lis 3, 256
29+
; CHECK-NEXT: lis 7, 512
30+
; CHECK-NEXT: bc 12, 2, .LBB0_4
31+
; CHECK-NEXT: b .LBB0_5
32+
; CHECK-NEXT: .LBB0_4: # %bb66
33+
; CHECK-NEXT: li 3, 0
34+
; CHECK-NEXT: .LBB0_5: # %bb66
35+
; CHECK-NEXT: cmpwi 1, 4, -1
36+
; CHECK-NEXT: cmpwi 5, 4, -1
37+
; CHECK-NEXT: li 6, 0
38+
; CHECK-NEXT: bc 12, 6, .LBB0_6
39+
; CHECK-NEXT: b .LBB0_7
40+
; CHECK-NEXT: .LBB0_6: # %bb66
41+
; CHECK-NEXT: addi 3, 7, 0
42+
; CHECK-NEXT: .LBB0_7: # %bb66
43+
; CHECK-NEXT: cror 20, 22, 2
44+
; CHECK-NEXT: stw 3, 0(3)
45+
; CHECK-NEXT: bc 12, 20, .LBB0_9
46+
; CHECK-NEXT: # %bb.8: # %bb66
47+
; CHECK-NEXT: ori 3, 6, 0
48+
; CHECK-NEXT: b .LBB0_10
49+
; CHECK-NEXT: .LBB0_9: # %bb66
50+
; CHECK-NEXT: li 3, 0
51+
; CHECK-NEXT: .LBB0_10: # %bb66
52+
; CHECK-NEXT: stw 3, 0(3)
53+
; CHECK-NEXT: blr
54+
bb:
55+
br i1 undef, label %bb2, label %bb1
56+
57+
bb2: ; preds = %bb
58+
%i = select i1 undef, i64 0, i64 72057594037927936
59+
store i64 %i, i64* undef, align 8
60+
ret void
61+
62+
bb1: ; preds = %bb
63+
%i50 = load i8, i8* undef, align 8
64+
%i52 = load i128, i128* null, align 8
65+
%i62 = icmp eq i8 %i50, 0
66+
br i1 undef, label %bb66, label %bb64
67+
68+
bb64: ; preds = %bb63
69+
ret void
70+
71+
bb66: ; preds = %bb63
72+
%i67 = lshr i128 -1, 0
73+
%i68 = xor i128 %i52, -1
74+
%i69 = add i128 0, %i68
75+
%i70 = and i128 %i67, %i69
76+
%i71 = icmp eq i128 %i70, 0
77+
%i74 = select i1 %i62, i64 0, i64 72057594037927936
78+
%i75 = select i1 %i71, i64 144115188075855872, i64 %i74
79+
store i64 %i75, i64* undef, align 8
80+
ret void
81+
}

0 commit comments

Comments
 (0)