Skip to content

Commit 02debce

Browse files
authored
update_test_checks: improve IR value name stability (#110940)
By default, UTC attempts to keep the produced diff small by keeping IR value name variables stable. The old algorithm was roughly: 1. Compute a diff between the old and new check lines, where "uncommitted" variable names are replaced by a wildcard. This leads to a set of non-crossing "candidate" pairs of (old line, new line) that we can try to make equal. 2. Greedily walk this list of candidates, committing to variable names that make candidate lines equal if possible. The greedy approach in the second step has the downside that committing to a variable name greedily can sometimes prevent many subsequent candidates from getting the variable name assignment that would make them equal. We keep the first step as-is, but replace the second one by an algorithm that finds a large independent set of candidates, i.e. candidate pairs of (old line, new line) which are non-conflicting in the sense that their desired variable name mappings are not in conflict. We find the large independent set by greedily assigning a coloring to the conflict graph and taking the largest color class. We then commit to all the variable name mappings which are desired by candidates in this largest color class. As before, we then recurse into regions between matching lines. This is required in large cases. For example, running this algorithm at the top-level of the new test case (stable_ir_values5.ll) matches up most of the instructions, but not the names of the result values of all the `load`s. This is because (unlike e.g. the getelementptrs) the load instructions are all equal except for variable names, and so step 1 (the diff algorithm) doesn't consider them as candidates. However, they are trivially matched by recursion. This also happens to fix a bug in tracking line indices that went unnoticed previously... As is usually the case with these changes, the quality improvement is hard to see from the diff of this patch. However, it becomes obvious when comparing the diff of stable_ir_values5.ll against stable_ir_value5.ll.expected before and after this change.
1 parent 04540fa commit 02debce

File tree

4 files changed

+718
-27
lines changed

4 files changed

+718
-27
lines changed
Lines changed: 305 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,305 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2+
; RUN: opt < %s -S | FileCheck %s
3+
4+
; Test a very long run of similar (but different) instructions in which the optimal
5+
; diff is sensitive to how names are mapped. This is already slightly reduced
6+
; from the original, but attempting to reduce it further ended up hiding another
7+
; bug.
8+
9+
%structA = type { <3 x i32> }
10+
%structC = type { [50 x i32] }
11+
12+
define dso_local void @main.resume.0(i64 %0, %structA %arg01, [23 x i32] %arg12, [30 x i32] %arg23) {
13+
; CHECK-LABEL: define dso_local void @main.resume.0(
14+
; CHECK-SAME: i64 [[TMP0:%.*]], { [[STRUCTA:%.*]], [23 x i32], [30 x i32] } [[TMP1:%.*]]) {
15+
; CHECK-NEXT: entryresume.0:
16+
; CHECK-NEXT: [[FOO:%.*]] = call ptr @getter(i32 108)
17+
; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { [[STRUCTA]], [23 x i32], [30 x i32] } [[TMP1]], 2
18+
; CHECK-NEXT: [[DOTFCA_0_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 0
19+
; CHECK-NEXT: [[DOTFCA_1_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 1
20+
; CHECK-NEXT: [[DOTFCA_2_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 2
21+
; CHECK-NEXT: [[DOTFCA_3_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 3
22+
; CHECK-NEXT: [[DOTFCA_4_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 4
23+
; CHECK-NEXT: [[DOTFCA_5_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 5
24+
; CHECK-NEXT: [[DOTFCA_6_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 6
25+
; CHECK-NEXT: [[DOTFCA_7_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 7
26+
; CHECK-NEXT: [[DOTFCA_8_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 8
27+
; CHECK-NEXT: [[DOTFCA_9_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 9
28+
; CHECK-NEXT: [[DOTFCA_10_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 10
29+
; CHECK-NEXT: [[DOTFCA_11_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 11
30+
; CHECK-NEXT: [[DOTFCA_12_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 12
31+
; CHECK-NEXT: [[DOTFCA_13_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 13
32+
; CHECK-NEXT: [[DOTFCA_14_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 14
33+
; CHECK-NEXT: [[DOTFCA_15_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 15
34+
; CHECK-NEXT: [[DOTFCA_16_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 16
35+
; CHECK-NEXT: [[DOTFCA_17_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 17
36+
; CHECK-NEXT: [[DOTFCA_18_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 18
37+
; CHECK-NEXT: [[DOTFCA_19_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 19
38+
; CHECK-NEXT: [[DOTFCA_20_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 20
39+
; CHECK-NEXT: [[DOTFCA_21_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 21
40+
; CHECK-NEXT: [[DOTFCA_22_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 22
41+
; CHECK-NEXT: [[DOTFCA_23_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 23
42+
; CHECK-NEXT: [[DOTFCA_24_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 24
43+
; CHECK-NEXT: [[DOTFCA_25_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 25
44+
; CHECK-NEXT: [[DOTFCA_26_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 26
45+
; CHECK-NEXT: [[DOTFCA_27_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 27
46+
; CHECK-NEXT: [[TMP23:%.*]] = extractvalue [30 x i32] [[TMP3]], 28
47+
; CHECK-NEXT: [[DOTFCA_29_EXTRACT:%.*]] = extractvalue [30 x i32] [[TMP3]], 29
48+
; CHECK-NEXT: [[TMP4:%.*]] = freeze [[STRUCTC:%.*]] poison
49+
; CHECK-NEXT: [[DOTFCA_0_0_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 0
50+
; CHECK-NEXT: [[DOTFCA_0_1_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 1
51+
; CHECK-NEXT: [[DOTFCA_0_2_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 2
52+
; CHECK-NEXT: [[DOTFCA_0_3_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 3
53+
; CHECK-NEXT: [[DOTFCA_0_4_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 4
54+
; CHECK-NEXT: [[DOTFCA_0_5_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 5
55+
; CHECK-NEXT: [[DOTFCA_0_6_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 6
56+
; CHECK-NEXT: [[DOTFCA_0_7_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 7
57+
; CHECK-NEXT: [[DOTFCA_0_8_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 8
58+
; CHECK-NEXT: [[DOTFCA_0_9_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 9
59+
; CHECK-NEXT: [[DOTFCA_0_10_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 10
60+
; CHECK-NEXT: [[DOTFCA_0_11_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 11
61+
; CHECK-NEXT: [[DOTFCA_0_12_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 12
62+
; CHECK-NEXT: [[DOTFCA_0_13_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 13
63+
; CHECK-NEXT: [[DOTFCA_0_14_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 14
64+
; CHECK-NEXT: [[DOTFCA_0_15_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 15
65+
; CHECK-NEXT: [[DOTFCA_0_16_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 16
66+
; CHECK-NEXT: [[DOTFCA_0_17_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 17
67+
; CHECK-NEXT: [[DOTFCA_0_18_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 18
68+
; CHECK-NEXT: [[DOTFCA_0_19_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 19
69+
; CHECK-NEXT: [[DOTFCA_0_20_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 20
70+
; CHECK-NEXT: [[DOTFCA_0_21_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 21
71+
; CHECK-NEXT: [[DOTFCA_0_22_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 22
72+
; CHECK-NEXT: [[DOTFCA_0_23_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 23
73+
; CHECK-NEXT: [[DOTFCA_0_24_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 24
74+
; CHECK-NEXT: [[DOTFCA_0_25_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 25
75+
; CHECK-NEXT: [[DOTFCA_0_26_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 26
76+
; CHECK-NEXT: [[DOTFCA_0_27_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 27
77+
; CHECK-NEXT: [[DOTFCA_0_28_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 28
78+
; CHECK-NEXT: [[DOTFCA_0_29_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 29
79+
; CHECK-NEXT: [[DOTFCA_0_30_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 30
80+
; CHECK-NEXT: [[DOTFCA_0_31_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 31
81+
; CHECK-NEXT: [[DOTFCA_0_32_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 32
82+
; CHECK-NEXT: [[DOTFCA_0_33_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 33
83+
; CHECK-NEXT: [[DOTFCA_0_34_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 34
84+
; CHECK-NEXT: [[DOTFCA_0_35_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 35
85+
; CHECK-NEXT: [[DOTFCA_0_36_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 36
86+
; CHECK-NEXT: [[DOTFCA_0_37_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 37
87+
; CHECK-NEXT: [[DOTFCA_0_38_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 38
88+
; CHECK-NEXT: [[DOTFCA_0_39_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 39
89+
; CHECK-NEXT: [[DOTFCA_0_40_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 40
90+
; CHECK-NEXT: [[DOTFCA_0_41_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 41
91+
; CHECK-NEXT: [[DOTFCA_0_42_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 42
92+
; CHECK-NEXT: [[DOTFCA_0_43_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 43
93+
; CHECK-NEXT: [[DOTFCA_0_44_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 44
94+
; CHECK-NEXT: [[DOTFCA_0_45_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 45
95+
; CHECK-NEXT: [[DOTFCA_0_46_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 46
96+
; CHECK-NEXT: [[DOTFCA_0_47_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 47
97+
; CHECK-NEXT: [[DOTFCA_0_48_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 48
98+
; CHECK-NEXT: [[DOTFCA_0_49_EXTRACT:%.*]] = extractvalue [[STRUCTC]] [[TMP4]], 0, 49
99+
; CHECK-NEXT: [[TMP2:%.*]] = inttoptr i32 [[DOTFCA_0_EXTRACT]] to ptr
100+
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP2]], align 4
101+
; CHECK-NEXT: [[TMP27:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 1
102+
; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP27]], align 4
103+
; CHECK-NEXT: [[TMP29:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 2
104+
; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP29]], align 4
105+
; CHECK-NEXT: [[TMP31:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 3
106+
; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP31]], align 4
107+
; CHECK-NEXT: [[TMP33:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 4
108+
; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP33]], align 4
109+
; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 5
110+
; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP35]], align 4
111+
; CHECK-NEXT: [[TMP37:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 6
112+
; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP37]], align 4
113+
; CHECK-NEXT: [[TMP39:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 7
114+
; CHECK-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP39]], align 4
115+
; CHECK-NEXT: [[TMP41:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 8
116+
; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP41]], align 4
117+
; CHECK-NEXT: [[TMP43:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 9
118+
; CHECK-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP43]], align 4
119+
; CHECK-NEXT: [[TMP45:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 10
120+
; CHECK-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP45]], align 4
121+
; CHECK-NEXT: [[TMP47:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 11
122+
; CHECK-NEXT: [[TMP28:%.*]] = load i32, ptr [[TMP47]], align 4
123+
; CHECK-NEXT: [[TMP49:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 12
124+
; CHECK-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP49]], align 4
125+
; CHECK-NEXT: [[TMP51:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 13
126+
; CHECK-NEXT: [[TMP32:%.*]] = load i32, ptr [[TMP51]], align 4
127+
; CHECK-NEXT: [[TMP53:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 14
128+
; CHECK-NEXT: [[TMP34:%.*]] = load i32, ptr [[TMP53]], align 4
129+
; CHECK-NEXT: [[TMP55:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 15
130+
; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP55]], align 4
131+
; CHECK-NEXT: [[TMP57:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 16
132+
; CHECK-NEXT: [[TMP38:%.*]] = load i32, ptr [[TMP57]], align 4
133+
; CHECK-NEXT: [[TMP59:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 17
134+
; CHECK-NEXT: [[TMP40:%.*]] = load i32, ptr [[TMP59]], align 4
135+
; CHECK-NEXT: [[TMP61:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 18
136+
; CHECK-NEXT: [[TMP42:%.*]] = load i32, ptr [[TMP61]], align 4
137+
; CHECK-NEXT: [[TMP63:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 19
138+
; CHECK-NEXT: [[TMP44:%.*]] = load i32, ptr [[TMP63]], align 4
139+
; CHECK-NEXT: [[TMP65:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 20
140+
; CHECK-NEXT: [[TMP46:%.*]] = load i32, ptr [[TMP65]], align 4
141+
; CHECK-NEXT: [[TMP67:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 21
142+
; CHECK-NEXT: [[TMP48:%.*]] = load i32, ptr [[TMP67]], align 4
143+
; CHECK-NEXT: [[TMP69:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 22
144+
; CHECK-NEXT: [[TMP50:%.*]] = load i32, ptr [[TMP69]], align 4
145+
; CHECK-NEXT: [[TMP71:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 23
146+
; CHECK-NEXT: [[TMP52:%.*]] = load i32, ptr [[TMP71]], align 4
147+
; CHECK-NEXT: [[TMP73:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 24
148+
; CHECK-NEXT: [[TMP54:%.*]] = load i32, ptr [[TMP73]], align 4
149+
; CHECK-NEXT: [[TMP75:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 25
150+
; CHECK-NEXT: [[TMP56:%.*]] = load i32, ptr [[TMP75]], align 4
151+
; CHECK-NEXT: [[TMP77:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 26
152+
; CHECK-NEXT: [[TMP62:%.*]] = load i32, ptr [[TMP77]], align 4
153+
; CHECK-NEXT: [[TMP60:%.*]] = inttoptr i32 [[DOTFCA_0_EXTRACT]] to ptr
154+
; CHECK-NEXT: [[TMP58:%.*]] = extractvalue { [[STRUCTA]], [23 x i32], [30 x i32] } [[TMP1]], 0
155+
; CHECK-NEXT: [[DOTFCA_0_EXTRACT57:%.*]] = extractvalue [[STRUCTA]] [[TMP58]], 0
156+
; CHECK-NEXT: ret void
157+
;
158+
entryresume.0:
159+
%1 = call ptr @getter(i32 108)
160+
%2 = insertvalue { %structA, [23 x i32], [30 x i32] } poison, %structA %arg01, 0
161+
%3 = insertvalue { %structA, [23 x i32], [30 x i32] } %2, [23 x i32] %arg12, 1
162+
%4 = insertvalue { %structA, [23 x i32], [30 x i32] } %3, [30 x i32] %arg23, 2
163+
%5 = extractvalue { %structA, [23 x i32], [30 x i32] } %4, 2
164+
%.fca.0.extract = extractvalue [30 x i32] %5, 0
165+
%.fca.1.extract = extractvalue [30 x i32] %5, 1
166+
%.fca.2.extract = extractvalue [30 x i32] %5, 2
167+
%.fca.3.extract = extractvalue [30 x i32] %5, 3
168+
%.fca.4.extract = extractvalue [30 x i32] %5, 4
169+
%.fca.5.extract = extractvalue [30 x i32] %5, 5
170+
%.fca.6.extract = extractvalue [30 x i32] %5, 6
171+
%.fca.7.extract = extractvalue [30 x i32] %5, 7
172+
%.fca.8.extract = extractvalue [30 x i32] %5, 8
173+
%.fca.9.extract = extractvalue [30 x i32] %5, 9
174+
%.fca.10.extract = extractvalue [30 x i32] %5, 10
175+
%.fca.11.extract = extractvalue [30 x i32] %5, 11
176+
%.fca.12.extract = extractvalue [30 x i32] %5, 12
177+
%.fca.13.extract = extractvalue [30 x i32] %5, 13
178+
%.fca.14.extract = extractvalue [30 x i32] %5, 14
179+
%.fca.15.extract = extractvalue [30 x i32] %5, 15
180+
%.fca.16.extract = extractvalue [30 x i32] %5, 16
181+
%.fca.17.extract = extractvalue [30 x i32] %5, 17
182+
%.fca.18.extract = extractvalue [30 x i32] %5, 18
183+
%.fca.19.extract = extractvalue [30 x i32] %5, 19
184+
%.fca.20.extract = extractvalue [30 x i32] %5, 20
185+
%.fca.21.extract = extractvalue [30 x i32] %5, 21
186+
%.fca.22.extract = extractvalue [30 x i32] %5, 22
187+
%.fca.23.extract = extractvalue [30 x i32] %5, 23
188+
%.fca.24.extract = extractvalue [30 x i32] %5, 24
189+
%.fca.25.extract = extractvalue [30 x i32] %5, 25
190+
%.fca.26.extract = extractvalue [30 x i32] %5, 26
191+
%.fca.27.extract = extractvalue [30 x i32] %5, 27
192+
%.fca.28.extract = extractvalue [30 x i32] %5, 28
193+
%.fca.29.extract = extractvalue [30 x i32] %5, 29
194+
%6 = freeze %structC poison
195+
%.fca.0.0.extract = extractvalue %structC %6, 0, 0
196+
%.fca.0.1.extract = extractvalue %structC %6, 0, 1
197+
%.fca.0.2.extract = extractvalue %structC %6, 0, 2
198+
%.fca.0.3.extract = extractvalue %structC %6, 0, 3
199+
%.fca.0.4.extract = extractvalue %structC %6, 0, 4
200+
%.fca.0.5.extract = extractvalue %structC %6, 0, 5
201+
%.fca.0.6.extract = extractvalue %structC %6, 0, 6
202+
%.fca.0.7.extract = extractvalue %structC %6, 0, 7
203+
%.fca.0.8.extract = extractvalue %structC %6, 0, 8
204+
%.fca.0.9.extract = extractvalue %structC %6, 0, 9
205+
%.fca.0.10.extract = extractvalue %structC %6, 0, 10
206+
%.fca.0.11.extract = extractvalue %structC %6, 0, 11
207+
%.fca.0.12.extract = extractvalue %structC %6, 0, 12
208+
%.fca.0.13.extract = extractvalue %structC %6, 0, 13
209+
%.fca.0.14.extract = extractvalue %structC %6, 0, 14
210+
%.fca.0.15.extract = extractvalue %structC %6, 0, 15
211+
%.fca.0.16.extract = extractvalue %structC %6, 0, 16
212+
%.fca.0.17.extract = extractvalue %structC %6, 0, 17
213+
%.fca.0.18.extract = extractvalue %structC %6, 0, 18
214+
%.fca.0.19.extract = extractvalue %structC %6, 0, 19
215+
%.fca.0.20.extract = extractvalue %structC %6, 0, 20
216+
%.fca.0.21.extract = extractvalue %structC %6, 0, 21
217+
%.fca.0.22.extract = extractvalue %structC %6, 0, 22
218+
%.fca.0.23.extract = extractvalue %structC %6, 0, 23
219+
%.fca.0.24.extract = extractvalue %structC %6, 0, 24
220+
%.fca.0.25.extract = extractvalue %structC %6, 0, 25
221+
%.fca.0.26.extract = extractvalue %structC %6, 0, 26
222+
%.fca.0.27.extract = extractvalue %structC %6, 0, 27
223+
%.fca.0.28.extract = extractvalue %structC %6, 0, 28
224+
%.fca.0.29.extract = extractvalue %structC %6, 0, 29
225+
%.fca.0.30.extract = extractvalue %structC %6, 0, 30
226+
%.fca.0.31.extract = extractvalue %structC %6, 0, 31
227+
%.fca.0.32.extract = extractvalue %structC %6, 0, 32
228+
%.fca.0.33.extract = extractvalue %structC %6, 0, 33
229+
%.fca.0.34.extract = extractvalue %structC %6, 0, 34
230+
%.fca.0.35.extract = extractvalue %structC %6, 0, 35
231+
%.fca.0.36.extract = extractvalue %structC %6, 0, 36
232+
%.fca.0.37.extract = extractvalue %structC %6, 0, 37
233+
%.fca.0.38.extract = extractvalue %structC %6, 0, 38
234+
%.fca.0.39.extract = extractvalue %structC %6, 0, 39
235+
%.fca.0.40.extract = extractvalue %structC %6, 0, 40
236+
%.fca.0.41.extract = extractvalue %structC %6, 0, 41
237+
%.fca.0.42.extract = extractvalue %structC %6, 0, 42
238+
%.fca.0.43.extract = extractvalue %structC %6, 0, 43
239+
%.fca.0.44.extract = extractvalue %structC %6, 0, 44
240+
%.fca.0.45.extract = extractvalue %structC %6, 0, 45
241+
%.fca.0.46.extract = extractvalue %structC %6, 0, 46
242+
%.fca.0.47.extract = extractvalue %structC %6, 0, 47
243+
%.fca.0.48.extract = extractvalue %structC %6, 0, 48
244+
%.fca.0.49.extract = extractvalue %structC %6, 0, 49
245+
%7 = inttoptr i32 %.fca.0.extract to ptr
246+
%8 = load i32, ptr %7, align 4
247+
%9 = getelementptr inbounds i32, ptr %7, i32 1
248+
%10 = load i32, ptr %9, align 4
249+
%11 = getelementptr inbounds i32, ptr %7, i32 2
250+
%12 = load i32, ptr %11, align 4
251+
%13 = getelementptr inbounds i32, ptr %7, i32 3
252+
%14 = load i32, ptr %13, align 4
253+
%15 = getelementptr inbounds i32, ptr %7, i32 4
254+
%16 = load i32, ptr %15, align 4
255+
%17 = getelementptr inbounds i32, ptr %7, i32 5
256+
%18 = load i32, ptr %17, align 4
257+
%19 = getelementptr inbounds i32, ptr %7, i32 6
258+
%20 = load i32, ptr %19, align 4
259+
%21 = getelementptr inbounds i32, ptr %7, i32 7
260+
%22 = load i32, ptr %21, align 4
261+
%23 = getelementptr inbounds i32, ptr %7, i32 8
262+
%24 = load i32, ptr %23, align 4
263+
%25 = getelementptr inbounds i32, ptr %7, i32 9
264+
%26 = load i32, ptr %25, align 4
265+
%27 = getelementptr inbounds i32, ptr %7, i32 10
266+
%28 = load i32, ptr %27, align 4
267+
%29 = getelementptr inbounds i32, ptr %7, i32 11
268+
%30 = load i32, ptr %29, align 4
269+
%31 = getelementptr inbounds i32, ptr %7, i32 12
270+
%32 = load i32, ptr %31, align 4
271+
%33 = getelementptr inbounds i32, ptr %7, i32 13
272+
%34 = load i32, ptr %33, align 4
273+
%35 = getelementptr inbounds i32, ptr %7, i32 14
274+
%36 = load i32, ptr %35, align 4
275+
%37 = getelementptr inbounds i32, ptr %7, i32 15
276+
%38 = load i32, ptr %37, align 4
277+
%39 = getelementptr inbounds i32, ptr %7, i32 16
278+
%40 = load i32, ptr %39, align 4
279+
%41 = getelementptr inbounds i32, ptr %7, i32 17
280+
%42 = load i32, ptr %41, align 4
281+
%43 = getelementptr inbounds i32, ptr %7, i32 18
282+
%44 = load i32, ptr %43, align 4
283+
%45 = getelementptr inbounds i32, ptr %7, i32 19
284+
%46 = load i32, ptr %45, align 4
285+
%47 = getelementptr inbounds i32, ptr %7, i32 20
286+
%48 = load i32, ptr %47, align 4
287+
%49 = getelementptr inbounds i32, ptr %7, i32 21
288+
%50 = load i32, ptr %49, align 4
289+
%51 = getelementptr inbounds i32, ptr %7, i32 22
290+
%52 = load i32, ptr %51, align 4
291+
%53 = getelementptr inbounds i32, ptr %7, i32 23
292+
%54 = load i32, ptr %53, align 4
293+
%55 = getelementptr inbounds i32, ptr %7, i32 24
294+
%56 = load i32, ptr %55, align 4
295+
%57 = getelementptr inbounds i32, ptr %7, i32 25
296+
%58 = load i32, ptr %57, align 4
297+
%59 = getelementptr inbounds i32, ptr %7, i32 26
298+
%60 = load i32, ptr %59, align 4
299+
%61 = inttoptr i32 %.fca.0.extract to ptr
300+
%62 = extractvalue { %structA, [23 x i32], [30 x i32] } %4, 0
301+
%.fca.0.extract57 = extractvalue %structA %62, 0
302+
ret void
303+
}
304+
305+
declare ptr @getter(i32)

0 commit comments

Comments
 (0)