Skip to content

Commit 723b6cf

Browse files
committed
[DAG] visitFREEZE - handle case where the folded node merges with another existing node
Fixes #60413
1 parent a9ac22b commit 723b6cf

File tree

2 files changed

+175
-0
lines changed

2 files changed

+175
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14581,6 +14581,10 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) {
1458114581
}
1458214582
}
1458314583

14584+
// This node has been merged with another.
14585+
if (N->getOpcode() == ISD::DELETED_NODE)
14586+
return SDValue(N, 0);
14587+
1458414588
// The whole node may have been updated, so the value we were holding
1458514589
// may no longer be valid. Re-fetch the operand we're `freeze`ing.
1458614590
N0 = N->getOperand(0);

llvm/test/CodeGen/SystemZ/pr60413.ll

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=s390x-ibm-linux | FileCheck %s
3+
4+
%struct.anon.0.1.2.3.8.77 = type { [3 x i8], i8, [3 x i8] }
5+
6+
@e = external dso_local local_unnamed_addr global i32, align 4
7+
@f = external dso_local local_unnamed_addr global %struct.anon.0.1.2.3.8.77, align 4
8+
@g = external dso_local local_unnamed_addr global i8, align 2
9+
10+
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
11+
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0
12+
13+
define dso_local void @m() local_unnamed_addr #1 {
14+
; CHECK-LABEL: m:
15+
; CHECK: # %bb.0: # %entry
16+
; CHECK-NEXT: stmg %r13, %r15, 104(%r15)
17+
; CHECK-NEXT: aghi %r15, -168
18+
; CHECK-NEXT: llhrl %r1, f+4
19+
; CHECK-NEXT: sll %r1, 8
20+
; CHECK-NEXT: larl %r2, f
21+
; CHECK-NEXT: ic %r1, 6(%r2)
22+
; CHECK-NEXT: lr %r0, %r1
23+
; CHECK-NEXT: nilh %r0, 255
24+
; CHECK-NEXT: vlvgp %v1, %r1, %r0
25+
; CHECK-NEXT: vlvgf %v1, %r1, 0
26+
; CHECK-NEXT: vlvgf %v1, %r1, 2
27+
; CHECK-NEXT: vlvgp %v0, %r0, %r1
28+
; CHECK-NEXT: vlvgf %v0, %r0, 0
29+
; CHECK-NEXT: vlvgf %v0, %r0, 2
30+
; CHECK-NEXT: vlvgp %v2, %r1, %r1
31+
; CHECK-NEXT: vrepf %v2, %v2, 1
32+
; CHECK-NEXT: vgbm %v3, 30583
33+
; CHECK-NEXT: vn %v0, %v0, %v3
34+
; CHECK-NEXT: vn %v1, %v1, %v3
35+
; CHECK-NEXT: vn %v2, %v2, %v3
36+
; CHECK-NEXT: vrepif %v3, 127
37+
; CHECK-NEXT: vchlf %v1, %v1, %v3
38+
; CHECK-NEXT: vlgvf %r13, %v1, 0
39+
; CHECK-NEXT: vchlf %v2, %v2, %v3
40+
; CHECK-NEXT: vlgvf %r3, %v2, 1
41+
; CHECK-NEXT: nilf %r3, 1
42+
; CHECK-NEXT: vlgvf %r4, %v2, 0
43+
; CHECK-NEXT: risbg %r2, %r4, 48, 176, 15
44+
; CHECK-NEXT: rosbg %r2, %r3, 32, 49, 14
45+
; CHECK-NEXT: vlgvf %r5, %v2, 2
46+
; CHECK-NEXT: nilf %r5, 1
47+
; CHECK-NEXT: rosbg %r2, %r5, 32, 50, 13
48+
; CHECK-NEXT: vlgvf %r14, %v2, 3
49+
; CHECK-NEXT: nilf %r14, 1
50+
; CHECK-NEXT: rosbg %r2, %r14, 32, 51, 12
51+
; CHECK-NEXT: rosbg %r2, %r13, 52, 52, 11
52+
; CHECK-NEXT: vlgvf %r13, %v1, 1
53+
; CHECK-NEXT: rosbg %r2, %r13, 53, 53, 10
54+
; CHECK-NEXT: vlgvf %r13, %v1, 2
55+
; CHECK-NEXT: rosbg %r2, %r13, 54, 54, 9
56+
; CHECK-NEXT: vlgvf %r13, %v1, 3
57+
; CHECK-NEXT: rosbg %r2, %r13, 55, 55, 8
58+
; CHECK-NEXT: vchlf %v0, %v0, %v3
59+
; CHECK-NEXT: vlgvf %r13, %v0, 0
60+
; CHECK-NEXT: rosbg %r2, %r13, 56, 56, 7
61+
; CHECK-NEXT: vlgvf %r13, %v0, 1
62+
; CHECK-NEXT: rosbg %r2, %r13, 57, 57, 6
63+
; CHECK-NEXT: vlgvf %r13, %v0, 2
64+
; CHECK-NEXT: rosbg %r2, %r13, 58, 58, 5
65+
; CHECK-NEXT: vlgvf %r13, %v0, 3
66+
; CHECK-NEXT: rosbg %r2, %r13, 59, 59, 4
67+
; CHECK-NEXT: nilf %r4, 1
68+
; CHECK-NEXT: rosbg %r2, %r4, 32, 60, 3
69+
; CHECK-NEXT: rosbg %r2, %r3, 32, 61, 2
70+
; CHECK-NEXT: rosbg %r2, %r5, 32, 62, 1
71+
; CHECK-NEXT: or %r2, %r14
72+
; CHECK-NEXT: vlgvb %r4, %v0, 1
73+
; CHECK-NEXT: vlgvb %r3, %v0, 0
74+
; CHECK-NEXT: risbg %r3, %r3, 48, 176, 15
75+
; CHECK-NEXT: rosbg %r3, %r4, 49, 49, 14
76+
; CHECK-NEXT: vlgvb %r4, %v0, 2
77+
; CHECK-NEXT: rosbg %r3, %r4, 50, 50, 13
78+
; CHECK-NEXT: vlgvb %r4, %v0, 3
79+
; CHECK-NEXT: rosbg %r3, %r4, 51, 51, 12
80+
; CHECK-NEXT: vlgvb %r4, %v0, 4
81+
; CHECK-NEXT: rosbg %r3, %r4, 52, 52, 11
82+
; CHECK-NEXT: vlgvb %r4, %v0, 5
83+
; CHECK-NEXT: rosbg %r3, %r4, 53, 53, 10
84+
; CHECK-NEXT: vlgvb %r4, %v0, 6
85+
; CHECK-NEXT: rosbg %r3, %r4, 54, 54, 9
86+
; CHECK-NEXT: vlgvb %r4, %v0, 7
87+
; CHECK-NEXT: rosbg %r3, %r4, 55, 55, 8
88+
; CHECK-NEXT: vlgvb %r4, %v0, 8
89+
; CHECK-NEXT: rosbg %r3, %r4, 56, 56, 7
90+
; CHECK-NEXT: vlgvb %r4, %v0, 9
91+
; CHECK-NEXT: rosbg %r3, %r4, 57, 57, 6
92+
; CHECK-NEXT: vlgvb %r4, %v0, 10
93+
; CHECK-NEXT: rosbg %r3, %r4, 58, 58, 5
94+
; CHECK-NEXT: vlgvb %r4, %v0, 11
95+
; CHECK-NEXT: rosbg %r3, %r4, 59, 59, 4
96+
; CHECK-NEXT: vlgvb %r4, %v0, 12
97+
; CHECK-NEXT: rosbg %r3, %r4, 60, 60, 3
98+
; CHECK-NEXT: vlgvb %r4, %v0, 13
99+
; CHECK-NEXT: rosbg %r3, %r4, 61, 61, 2
100+
; CHECK-NEXT: vlgvb %r4, %v0, 14
101+
; CHECK-NEXT: rosbg %r3, %r4, 62, 62, 1
102+
; CHECK-NEXT: vlgvb %r4, %v0, 15
103+
; CHECK-NEXT: rosbg %r3, %r4, 63, 63, 0
104+
; CHECK-NEXT: xilf %r3, 4294967295
105+
; CHECK-NEXT: clijhe %r1, 128, .LBB0_2
106+
; CHECK-NEXT: # %bb.1:
107+
; CHECK-NEXT: larl %r1, e
108+
; CHECK-NEXT: llc %r1, 3(%r1)
109+
; CHECK-NEXT: nilf %r1, 1
110+
; CHECK-NEXT: j .LBB0_3
111+
; CHECK-NEXT: .LBB0_2: # %entry
112+
; CHECK-NEXT: lhi %r1, 0
113+
; CHECK-NEXT: .LBB0_3: # %entry
114+
; CHECK-NEXT: or %r2, %r3
115+
; CHECK-NEXT: chi %r0, 128
116+
; CHECK-NEXT: jl .LBB0_5
117+
; CHECK-NEXT: # %bb.4: # %entry
118+
; CHECK-NEXT: lhi %r1, 0
119+
; CHECK-NEXT: .LBB0_5: # %entry
120+
; CHECK-NEXT: tmll %r2, 65535
121+
; CHECK-NEXT: je .LBB0_7
122+
; CHECK-NEXT: # %bb.6: # %entry
123+
; CHECK-NEXT: lhi %r1, 0
124+
; CHECK-NEXT: .LBB0_7: # %entry
125+
; CHECK-NEXT: larl %r2, g
126+
; CHECK-NEXT: stc %r1, 0(%r2)
127+
; CHECK-NEXT: lmg %r13, %r15, 272(%r15)
128+
; CHECK-NEXT: br %r14
129+
entry:
130+
%n = alloca i32, align 4
131+
call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %n) #2
132+
%e.promoted9.i = load i32, ptr @e, align 4
133+
%bf.load.i = load i24, ptr getelementptr inbounds (%struct.anon.0.1.2.3.8.77, ptr @f, i64 0, i32 2), align 4
134+
%tobool.not.1.i = icmp ult i24 %bf.load.i, 128
135+
%bf.load.2.i = load i24, ptr getelementptr inbounds (%struct.anon.0.1.2.3.8.77, ptr @f, i64 0, i32 2), align 4
136+
%bf.load.2.i.fr = freeze i24 %bf.load.2.i
137+
%tobool.not.2.i = icmp ult i24 %bf.load.2.i.fr, 128
138+
%bf.load.427.i = load i24, ptr getelementptr inbounds (%struct.anon.0.1.2.3.8.77, ptr @f, i64 0, i32 2), align 4
139+
%bf.load.3.5.i = load i24, ptr getelementptr inbounds (%struct.anon.0.1.2.3.8.77, ptr @f, i64 0, i32 2), align 4
140+
%bf.load.2.6.i = load i24, ptr getelementptr inbounds (%struct.anon.0.1.2.3.8.77, ptr @f, i64 0, i32 2), align 4
141+
%0 = insertelement <16 x i24> poison, i24 %bf.load.2.6.i, i64 0
142+
%1 = insertelement <16 x i24> %0, i24 %bf.load.2.6.i, i64 1
143+
%2 = insertelement <16 x i24> %1, i24 %bf.load.3.5.i, i64 3
144+
%3 = insertelement <16 x i24> %2, i24 %bf.load.3.5.i, i64 5
145+
%4 = insertelement <16 x i24> %3, i24 poison, i64 7
146+
%5 = insertelement <16 x i24> %4, i24 poison, i64 9
147+
%6 = insertelement <16 x i24> %5, i24 %bf.load.427.i, i64 11
148+
%7 = insertelement <16 x i24> %6, i24 %bf.load.427.i, i64 13
149+
%8 = insertelement <16 x i24> %7, i24 %bf.load.2.i.fr, i64 15
150+
%9 = shufflevector <16 x i24> %8, <16 x i24> poison, <16 x i32> <i32 0, i32 1, i32 0, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15>
151+
%.fr = freeze <16 x i24> %9
152+
%10 = icmp ugt <16 x i24> %.fr, <i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127, i24 127>
153+
%11 = bitcast <16 x i1> %10 to i16
154+
%12 = icmp eq i16 %11, 0
155+
%13 = freeze <16 x i1> poison
156+
%14 = bitcast <16 x i1> %13 to i16
157+
%15 = icmp eq i16 %14, -1
158+
%op.rdx = and i1 %12, %15
159+
%op.rdx1 = and i1 %op.rdx, %tobool.not.2.i
160+
%op.rdx2 = select i1 %op.rdx1, i1 %tobool.not.1.i, i1 false
161+
%16 = trunc i32 %e.promoted9.i to i8
162+
%17 = and i8 %16, 1
163+
%18 = select i1 false, i8 0, i8 %17
164+
%conv14.i = select i1 %op.rdx2, i8 %18, i8 0
165+
store i8 %conv14.i, ptr @g, align 2
166+
ret void
167+
}
168+
169+
attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
170+
attributes #1 = { nounwind "target-features"="+transactional-execution,+vector" }
171+
attributes #2 = { nounwind }

0 commit comments

Comments
 (0)