Skip to content

Commit f0d1ae8

Browse files
authored
[llvm][ScheduleDAG] SUnit::biasCriticalPath() does not find the critical path consistently (#92368)
Fix #38037
1 parent dfdf1c5 commit f0d1ae8

File tree

2 files changed

+243
-1
lines changed

2 files changed

+243
-1
lines changed

llvm/lib/CodeGen/ScheduleDAG.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,10 @@ void SUnit::biasCriticalPath() {
331331
unsigned MaxDepth = BestI->getSUnit()->getDepth();
332332
for (SUnit::pred_iterator I = std::next(BestI), E = Preds.end(); I != E;
333333
++I) {
334-
if (I->getKind() == SDep::Data && I->getSUnit()->getDepth() > MaxDepth)
334+
if (I->getKind() == SDep::Data && I->getSUnit()->getDepth() > MaxDepth) {
335+
MaxDepth = I->getSUnit()->getDepth();
335336
BestI = I;
337+
}
336338
}
337339
if (BestI != Preds.begin())
338340
std::swap(*Preds.begin(), *BestI);
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
; RUN: llc < %s -mtriple=x86_64-apple-darwin8 -misched-print-dags -o - 2>&1 > /dev/null | FileCheck %s
2+
3+
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
4+
5+
@sc = common global i8 0
6+
@uc = common global i8 0
7+
@ss = common global i16 0
8+
@us = common global i16 0
9+
@si = common global i32 0
10+
@ui = common global i32 0
11+
@sl = common global i64 0
12+
@ul = common global i64 0
13+
@sll = common global i64 0
14+
@ull = common global i64 0
15+
16+
; Regression Test for PR92368.
17+
;
18+
; CHECK: SU(75): CMP8rr %49:gr8, %48:gr8, implicit-def $eflags
19+
; CHECK: Predecessors:
20+
; CHECK-NEXT: SU(73): Data Latency=0 Reg=%49
21+
; CHECK-NEXT: SU(74): Out Latency=0
22+
; CHECK-NEXT: SU(72): Out Latency=0
23+
; CHECK-NEXT: SU(70): Data Latency=4 Reg=%48
24+
define void @misched_bug() nounwind {
25+
entry:
26+
%0 = load i8, i8* @sc, align 1
27+
%1 = zext i8 %0 to i32
28+
%2 = load i8, i8* @uc, align 1
29+
%3 = zext i8 %2 to i32
30+
%4 = trunc i32 %3 to i8
31+
%5 = trunc i32 %1 to i8
32+
%pair6 = cmpxchg i8* @sc, i8 %4, i8 %5 monotonic monotonic
33+
%6 = extractvalue { i8, i1 } %pair6, 0
34+
store i8 %6, i8* @sc, align 1
35+
%7 = load i8, i8* @sc, align 1
36+
%8 = zext i8 %7 to i32
37+
%9 = load i8, i8* @uc, align 1
38+
%10 = zext i8 %9 to i32
39+
%11 = trunc i32 %10 to i8
40+
%12 = trunc i32 %8 to i8
41+
%pair13 = cmpxchg i8* @uc, i8 %11, i8 %12 monotonic monotonic
42+
%13 = extractvalue { i8, i1 } %pair13, 0
43+
store i8 %13, i8* @uc, align 1
44+
%14 = load i8, i8* @sc, align 1
45+
%15 = sext i8 %14 to i16
46+
%16 = zext i16 %15 to i32
47+
%17 = load i8, i8* @uc, align 1
48+
%18 = zext i8 %17 to i32
49+
%19 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
50+
%20 = trunc i32 %18 to i16
51+
%21 = trunc i32 %16 to i16
52+
%pair22 = cmpxchg i16* %19, i16 %20, i16 %21 monotonic monotonic
53+
%22 = extractvalue { i16, i1 } %pair22, 0
54+
store i16 %22, i16* @ss, align 2
55+
%23 = load i8, i8* @sc, align 1
56+
%24 = sext i8 %23 to i16
57+
%25 = zext i16 %24 to i32
58+
%26 = load i8, i8* @uc, align 1
59+
%27 = zext i8 %26 to i32
60+
%28 = bitcast i8* bitcast (i16* @us to i8*) to i16*
61+
%29 = trunc i32 %27 to i16
62+
%30 = trunc i32 %25 to i16
63+
%pair31 = cmpxchg i16* %28, i16 %29, i16 %30 monotonic monotonic
64+
%31 = extractvalue { i16, i1 } %pair31, 0
65+
store i16 %31, i16* @us, align 2
66+
%32 = load i8, i8* @sc, align 1
67+
%33 = sext i8 %32 to i32
68+
%34 = load i8, i8* @uc, align 1
69+
%35 = zext i8 %34 to i32
70+
%36 = bitcast i8* bitcast (i32* @si to i8*) to i32*
71+
%pair37 = cmpxchg i32* %36, i32 %35, i32 %33 monotonic monotonic
72+
%37 = extractvalue { i32, i1 } %pair37, 0
73+
store i32 %37, i32* @si, align 4
74+
%38 = load i8, i8* @sc, align 1
75+
%39 = sext i8 %38 to i32
76+
%40 = load i8, i8* @uc, align 1
77+
%41 = zext i8 %40 to i32
78+
%42 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
79+
%pair43 = cmpxchg i32* %42, i32 %41, i32 %39 monotonic monotonic
80+
%43 = extractvalue { i32, i1 } %pair43, 0
81+
store i32 %43, i32* @ui, align 4
82+
%44 = load i8, i8* @sc, align 1
83+
%45 = sext i8 %44 to i64
84+
%46 = load i8, i8* @uc, align 1
85+
%47 = zext i8 %46 to i64
86+
%48 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
87+
%pair49 = cmpxchg i64* %48, i64 %47, i64 %45 monotonic monotonic
88+
%49 = extractvalue { i64, i1 } %pair49, 0
89+
store i64 %49, i64* @sl, align 8
90+
%50 = load i8, i8* @sc, align 1
91+
%51 = sext i8 %50 to i64
92+
%52 = load i8, i8* @uc, align 1
93+
%53 = zext i8 %52 to i64
94+
%54 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
95+
%pair55 = cmpxchg i64* %54, i64 %53, i64 %51 monotonic monotonic
96+
%55 = extractvalue { i64, i1 } %pair55, 0
97+
store i64 %55, i64* @ul, align 8
98+
%56 = load i8, i8* @sc, align 1
99+
%57 = sext i8 %56 to i64
100+
%58 = load i8, i8* @uc, align 1
101+
%59 = zext i8 %58 to i64
102+
%60 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
103+
%pair61 = cmpxchg i64* %60, i64 %59, i64 %57 monotonic monotonic
104+
%61 = extractvalue { i64, i1 } %pair61, 0
105+
store i64 %61, i64* @sll, align 8
106+
%62 = load i8, i8* @sc, align 1
107+
%63 = sext i8 %62 to i64
108+
%64 = load i8, i8* @uc, align 1
109+
%65 = zext i8 %64 to i64
110+
%66 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
111+
%pair67 = cmpxchg i64* %66, i64 %65, i64 %63 monotonic monotonic
112+
%67 = extractvalue { i64, i1 } %pair67, 0
113+
store i64 %67, i64* @ull, align 8
114+
%68 = load i8, i8* @sc, align 1
115+
%69 = zext i8 %68 to i32
116+
%70 = load i8, i8* @uc, align 1
117+
%71 = zext i8 %70 to i32
118+
%72 = trunc i32 %71 to i8
119+
%73 = trunc i32 %69 to i8
120+
%pair74 = cmpxchg i8* @sc, i8 %72, i8 %73 monotonic monotonic
121+
%74 = extractvalue { i8, i1 } %pair74, 0
122+
%75 = icmp eq i8 %74, %72
123+
%76 = zext i1 %75 to i8
124+
%77 = zext i8 %76 to i32
125+
store i32 %77, i32* @ui, align 4
126+
%78 = load i8, i8* @sc, align 1
127+
%79 = zext i8 %78 to i32
128+
%80 = load i8, i8* @uc, align 1
129+
%81 = zext i8 %80 to i32
130+
%82 = trunc i32 %81 to i8
131+
%83 = trunc i32 %79 to i8
132+
%pair84 = cmpxchg i8* @uc, i8 %82, i8 %83 monotonic monotonic
133+
%84 = extractvalue { i8, i1 } %pair84, 0
134+
%85 = icmp eq i8 %84, %82
135+
%86 = zext i1 %85 to i8
136+
%87 = zext i8 %86 to i32
137+
store i32 %87, i32* @ui, align 4
138+
%88 = load i8, i8* @sc, align 1
139+
%89 = sext i8 %88 to i16
140+
%90 = zext i16 %89 to i32
141+
%91 = load i8, i8* @uc, align 1
142+
%92 = zext i8 %91 to i32
143+
%93 = trunc i32 %92 to i8
144+
%94 = trunc i32 %90 to i8
145+
%pair95 = cmpxchg i8* bitcast (i16* @ss to i8*), i8 %93, i8 %94 monotonic monotonic
146+
%95 = extractvalue { i8, i1 } %pair95, 0
147+
%96 = icmp eq i8 %95, %93
148+
%97 = zext i1 %96 to i8
149+
%98 = zext i8 %97 to i32
150+
store i32 %98, i32* @ui, align 4
151+
%99 = load i8, i8* @sc, align 1
152+
%100 = sext i8 %99 to i16
153+
%101 = zext i16 %100 to i32
154+
%102 = load i8, i8* @uc, align 1
155+
%103 = zext i8 %102 to i32
156+
%104 = trunc i32 %103 to i8
157+
%105 = trunc i32 %101 to i8
158+
%pair106 = cmpxchg i8* bitcast (i16* @us to i8*), i8 %104, i8 %105 monotonic monotonic
159+
%106 = extractvalue { i8, i1 } %pair106, 0
160+
%107 = icmp eq i8 %106, %104
161+
%108 = zext i1 %107 to i8
162+
%109 = zext i8 %108 to i32
163+
store i32 %109, i32* @ui, align 4
164+
%110 = load i8, i8* @sc, align 1
165+
%111 = sext i8 %110 to i32
166+
%112 = load i8, i8* @uc, align 1
167+
%113 = zext i8 %112 to i32
168+
%114 = trunc i32 %113 to i8
169+
%115 = trunc i32 %111 to i8
170+
%pair116 = cmpxchg i8* bitcast (i32* @si to i8*), i8 %114, i8 %115 monotonic monotonic
171+
%116 = extractvalue { i8, i1 } %pair116, 0
172+
%117 = icmp eq i8 %116, %114
173+
%118 = zext i1 %117 to i8
174+
%119 = zext i8 %118 to i32
175+
store i32 %119, i32* @ui, align 4
176+
%120 = load i8, i8* @sc, align 1
177+
%121 = sext i8 %120 to i32
178+
%122 = load i8, i8* @uc, align 1
179+
%123 = zext i8 %122 to i32
180+
%124 = trunc i32 %123 to i8
181+
%125 = trunc i32 %121 to i8
182+
%pair126 = cmpxchg i8* bitcast (i32* @ui to i8*), i8 %124, i8 %125 monotonic monotonic
183+
%126 = extractvalue { i8, i1 } %pair126, 0
184+
%127 = icmp eq i8 %126, %124
185+
%128 = zext i1 %127 to i8
186+
%129 = zext i8 %128 to i32
187+
store i32 %129, i32* @ui, align 4
188+
%130 = load i8, i8* @sc, align 1
189+
%131 = sext i8 %130 to i64
190+
%132 = load i8, i8* @uc, align 1
191+
%133 = zext i8 %132 to i64
192+
%134 = trunc i64 %133 to i8
193+
%135 = trunc i64 %131 to i8
194+
%pair136 = cmpxchg i8* bitcast (i64* @sl to i8*), i8 %134, i8 %135 monotonic monotonic
195+
%136 = extractvalue { i8, i1 } %pair136, 0
196+
%137 = icmp eq i8 %136, %134
197+
%138 = zext i1 %137 to i8
198+
%139 = zext i8 %138 to i32
199+
store i32 %139, i32* @ui, align 4
200+
%140 = load i8, i8* @sc, align 1
201+
%141 = sext i8 %140 to i64
202+
%142 = load i8, i8* @uc, align 1
203+
%143 = zext i8 %142 to i64
204+
%144 = trunc i64 %143 to i8
205+
%145 = trunc i64 %141 to i8
206+
%pair146 = cmpxchg i8* bitcast (i64* @ul to i8*), i8 %144, i8 %145 monotonic monotonic
207+
%146 = extractvalue { i8, i1 } %pair146, 0
208+
%147 = icmp eq i8 %146, %144
209+
%148 = zext i1 %147 to i8
210+
%149 = zext i8 %148 to i32
211+
store i32 %149, i32* @ui, align 4
212+
%150 = load i8, i8* @sc, align 1
213+
%151 = sext i8 %150 to i64
214+
%152 = load i8, i8* @uc, align 1
215+
%153 = zext i8 %152 to i64
216+
%154 = trunc i64 %153 to i8
217+
%155 = trunc i64 %151 to i8
218+
%pair156 = cmpxchg i8* bitcast (i64* @sll to i8*), i8 %154, i8 %155 monotonic monotonic
219+
%156 = extractvalue { i8, i1 } %pair156, 0
220+
%157 = icmp eq i8 %156, %154
221+
%158 = zext i1 %157 to i8
222+
%159 = zext i8 %158 to i32
223+
store i32 %159, i32* @ui, align 4
224+
%160 = load i8, i8* @sc, align 1
225+
%161 = sext i8 %160 to i64
226+
%162 = load i8, i8* @uc, align 1
227+
%163 = zext i8 %162 to i64
228+
%164 = trunc i64 %163 to i8
229+
%165 = trunc i64 %161 to i8
230+
%pair166 = cmpxchg i8* bitcast (i64* @ull to i8*), i8 %164, i8 %165 monotonic monotonic
231+
%166 = extractvalue { i8, i1 } %pair166, 0
232+
%167 = icmp eq i8 %166, %164
233+
%168 = zext i1 %167 to i8
234+
%169 = zext i8 %168 to i32
235+
store i32 %169, i32* @ui, align 4
236+
br label %return
237+
238+
return: ; preds = %entry
239+
ret void
240+
}

0 commit comments

Comments
 (0)