Skip to content

Commit ed2fde5

Browse files
authored
feat: Restore old array lowering (#2194)
Closes #2193
1 parent 84cfb5f commit ed2fde5

10 files changed

+2254
-0
lines changed

hugr-llvm/src/extension/collections.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
33
pub mod array;
44
pub mod list;
5+
pub mod stack_array;
56
pub mod static_array;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
---
2+
source: hugr-llvm/src/extension/collections/stack_array.rs
3+
expression: mod_str
4+
---
5+
; ModuleID = 'test_context'
6+
source_filename = "test_context"
7+
8+
@0 = private unnamed_addr constant [37 x i8] c"Expected variant 1 but got variant 0\00", align 1
9+
@prelude.panic_template = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1
10+
@1 = private unnamed_addr constant [37 x i8] c"Expected variant 1 but got variant 0\00", align 1
11+
@prelude.panic_template.1 = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1
12+
@2 = private unnamed_addr constant [37 x i8] c"Expected variant 1 but got variant 0\00", align 1
13+
@prelude.panic_template.2 = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1
14+
@3 = private unnamed_addr constant [37 x i8] c"Expected variant 1 but got variant 0\00", align 1
15+
@prelude.panic_template.3 = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1
16+
@4 = private unnamed_addr constant [37 x i8] c"Expected variant 1 but got variant 0\00", align 1
17+
@prelude.panic_template.4 = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1
18+
19+
define void @_hl.main.1() {
20+
alloca_block:
21+
br label %entry_block
22+
23+
entry_block: ; preds = %alloca_block
24+
%0 = insertvalue [2 x i64] undef, i64 1, 0
25+
%1 = insertvalue [2 x i64] %0, i64 2, 1
26+
%2 = icmp ult i64 0, 2
27+
%3 = icmp ult i64 1, 2
28+
%4 = and i1 %2, %3
29+
br i1 %4, label %7, label %5
30+
31+
5: ; preds = %entry_block
32+
%6 = insertvalue { i1, [2 x i64] } { i1 false, [2 x i64] poison }, [2 x i64] %1, 1
33+
br label %17
34+
35+
7: ; preds = %entry_block
36+
%8 = alloca i64, i32 2, align 8
37+
%9 = bitcast i64* %8 to [2 x i64]*
38+
store [2 x i64] %1, [2 x i64]* %9, align 4
39+
%10 = getelementptr inbounds i64, i64* %8, i64 0
40+
%11 = load i64, i64* %10, align 4
41+
%12 = getelementptr inbounds i64, i64* %8, i64 1
42+
%13 = load i64, i64* %12, align 4
43+
store i64 %13, i64* %10, align 4
44+
store i64 %11, i64* %12, align 4
45+
%14 = bitcast i64* %8 to [2 x i64]*
46+
%15 = load [2 x i64], [2 x i64]* %14, align 4
47+
%16 = insertvalue { i1, [2 x i64] } { i1 true, [2 x i64] poison }, [2 x i64] %15, 1
48+
br label %17
49+
50+
17: ; preds = %5, %7
51+
%"0.0" = phi { i1, [2 x i64] } [ %16, %7 ], [ %6, %5 ]
52+
%18 = extractvalue { i1, [2 x i64] } %"0.0", 0
53+
switch i1 %18, label %19 [
54+
i1 true, label %21
55+
]
56+
57+
19: ; preds = %17
58+
%20 = extractvalue { i1, [2 x i64] } %"0.0", 1
59+
br label %cond_16_case_0
60+
61+
21: ; preds = %17
62+
%22 = extractvalue { i1, [2 x i64] } %"0.0", 1
63+
br label %cond_16_case_1
64+
65+
cond_16_case_0: ; preds = %19
66+
%23 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @0, i32 0, i32 0) }, 0
67+
%24 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @0, i32 0, i32 0) }, 1
68+
%25 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template, i32 0, i32 0), i32 %23, i8* %24)
69+
call void @abort()
70+
br label %cond_exit_16
71+
72+
cond_16_case_1: ; preds = %21
73+
br label %cond_exit_16
74+
75+
cond_exit_16: ; preds = %cond_16_case_1, %cond_16_case_0
76+
%"08.0" = phi [2 x i64] [ zeroinitializer, %cond_16_case_0 ], [ %22, %cond_16_case_1 ]
77+
%26 = icmp ult i64 0, 2
78+
br i1 %26, label %28, label %27
79+
80+
27: ; preds = %cond_exit_16
81+
br label %34
82+
83+
28: ; preds = %cond_exit_16
84+
%29 = alloca i64, i32 2, align 8
85+
%30 = bitcast i64* %29 to [2 x i64]*
86+
store [2 x i64] %"08.0", [2 x i64]* %30, align 4
87+
%31 = getelementptr inbounds i64, i64* %29, i64 0
88+
%32 = load i64, i64* %31, align 4
89+
%33 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %32, 1
90+
br label %34
91+
92+
34: ; preds = %27, %28
93+
%"020.0" = phi { i1, i64 } [ %33, %28 ], [ { i1 false, i64 poison }, %27 ]
94+
%35 = extractvalue { i1, i64 } %"020.0", 0
95+
switch i1 %35, label %36 [
96+
i1 true, label %37
97+
]
98+
99+
36: ; preds = %34
100+
br label %cond_28_case_0
101+
102+
37: ; preds = %34
103+
%38 = extractvalue { i1, i64 } %"020.0", 1
104+
br label %cond_28_case_1
105+
106+
cond_28_case_0: ; preds = %36
107+
%39 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @1, i32 0, i32 0) }, 0
108+
%40 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @1, i32 0, i32 0) }, 1
109+
%41 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template.1, i32 0, i32 0), i32 %39, i8* %40)
110+
call void @abort()
111+
br label %cond_exit_28
112+
113+
cond_28_case_1: ; preds = %37
114+
br label %cond_exit_28
115+
116+
cond_exit_28: ; preds = %cond_28_case_1, %cond_28_case_0
117+
%"024.0" = phi i64 [ 0, %cond_28_case_0 ], [ %38, %cond_28_case_1 ]
118+
%42 = icmp ult i64 1, 2
119+
br i1 %42, label %46, label %43
120+
121+
43: ; preds = %cond_exit_28
122+
%44 = insertvalue { i1, i64, [2 x i64] } { i1 false, i64 poison, [2 x i64] poison }, i64 %"024.0", 1
123+
%45 = insertvalue { i1, i64, [2 x i64] } %44, [2 x i64] %"08.0", 2
124+
br label %55
125+
126+
46: ; preds = %cond_exit_28
127+
%47 = alloca i64, i32 2, align 8
128+
%48 = bitcast i64* %47 to [2 x i64]*
129+
store [2 x i64] %"08.0", [2 x i64]* %48, align 4
130+
%49 = getelementptr inbounds i64, i64* %47, i64 1
131+
%50 = load i64, i64* %49, align 4
132+
store i64 %"024.0", i64* %49, align 4
133+
%51 = bitcast i64* %47 to [2 x i64]*
134+
%52 = load [2 x i64], [2 x i64]* %51, align 4
135+
%53 = insertvalue { i1, i64, [2 x i64] } { i1 true, i64 poison, [2 x i64] poison }, i64 %50, 1
136+
%54 = insertvalue { i1, i64, [2 x i64] } %53, [2 x i64] %52, 2
137+
br label %55
138+
139+
55: ; preds = %43, %46
140+
%"034.0" = phi { i1, i64, [2 x i64] } [ %54, %46 ], [ %45, %43 ]
141+
%56 = extractvalue { i1, i64, [2 x i64] } %"034.0", 0
142+
switch i1 %56, label %57 [
143+
i1 true, label %60
144+
]
145+
146+
57: ; preds = %55
147+
%58 = extractvalue { i1, i64, [2 x i64] } %"034.0", 1
148+
%59 = extractvalue { i1, i64, [2 x i64] } %"034.0", 2
149+
br label %cond_39_case_0
150+
151+
60: ; preds = %55
152+
%61 = extractvalue { i1, i64, [2 x i64] } %"034.0", 1
153+
%62 = extractvalue { i1, i64, [2 x i64] } %"034.0", 2
154+
br label %cond_39_case_1
155+
156+
cond_39_case_0: ; preds = %57
157+
%63 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @2, i32 0, i32 0) }, 0
158+
%64 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @2, i32 0, i32 0) }, 1
159+
%65 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template.2, i32 0, i32 0), i32 %63, i8* %64)
160+
call void @abort()
161+
br label %cond_exit_39
162+
163+
cond_39_case_1: ; preds = %60
164+
br label %cond_exit_39
165+
166+
cond_exit_39: ; preds = %cond_39_case_1, %cond_39_case_0
167+
%"037.0" = phi i64 [ 0, %cond_39_case_0 ], [ %61, %cond_39_case_1 ]
168+
%"138.0" = phi [2 x i64] [ zeroinitializer, %cond_39_case_0 ], [ %62, %cond_39_case_1 ]
169+
%66 = alloca i64, i32 2, align 8
170+
%67 = bitcast i64* %66 to [2 x i64]*
171+
store [2 x i64] %"138.0", [2 x i64]* %67, align 4
172+
%68 = getelementptr i64, i64* %66, i32 1
173+
%69 = load i64, i64* %66, align 4
174+
%70 = bitcast i64* %68 to [1 x i64]*
175+
%71 = load [1 x i64], [1 x i64]* %70, align 4
176+
%72 = insertvalue { i1, i64, [1 x i64] } { i1 true, i64 poison, [1 x i64] poison }, i64 %69, 1
177+
%73 = insertvalue { i1, i64, [1 x i64] } %72, [1 x i64] %71, 2
178+
%74 = extractvalue { i1, i64, [1 x i64] } %73, 0
179+
switch i1 %74, label %75 [
180+
i1 true, label %76
181+
]
182+
183+
75: ; preds = %cond_exit_39
184+
br label %cond_50_case_0
185+
186+
76: ; preds = %cond_exit_39
187+
%77 = extractvalue { i1, i64, [1 x i64] } %73, 1
188+
%78 = extractvalue { i1, i64, [1 x i64] } %73, 2
189+
br label %cond_50_case_1
190+
191+
cond_50_case_0: ; preds = %75
192+
%79 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @3, i32 0, i32 0) }, 0
193+
%80 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @3, i32 0, i32 0) }, 1
194+
%81 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template.3, i32 0, i32 0), i32 %79, i8* %80)
195+
call void @abort()
196+
br label %cond_exit_50
197+
198+
cond_50_case_1: ; preds = %76
199+
br label %cond_exit_50
200+
201+
cond_exit_50: ; preds = %cond_50_case_1, %cond_50_case_0
202+
%"058.0" = phi i64 [ 0, %cond_50_case_0 ], [ %77, %cond_50_case_1 ]
203+
%"159.0" = phi [1 x i64] [ zeroinitializer, %cond_50_case_0 ], [ %78, %cond_50_case_1 ]
204+
%82 = alloca i64, align 8
205+
%83 = bitcast i64* %82 to [1 x i64]*
206+
store [1 x i64] %"159.0", [1 x i64]* %83, align 4
207+
%84 = getelementptr i64, i64* %82, i32 0
208+
%85 = load i64, i64* %84, align 4
209+
%86 = bitcast i64* %82 to [0 x i64]*
210+
%87 = load [0 x i64], [0 x i64]* %86, align 4
211+
%88 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %85, 1
212+
%89 = extractvalue { i1, i64 } %88, 0
213+
switch i1 %89, label %90 [
214+
i1 true, label %91
215+
]
216+
217+
90: ; preds = %cond_exit_50
218+
br label %cond_61_case_0
219+
220+
91: ; preds = %cond_exit_50
221+
%92 = extractvalue { i1, i64 } %88, 1
222+
br label %cond_61_case_1
223+
224+
cond_61_case_0: ; preds = %90
225+
%93 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @4, i32 0, i32 0) }, 0
226+
%94 = extractvalue { i32, i8* } { i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @4, i32 0, i32 0) }, 1
227+
%95 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template.4, i32 0, i32 0), i32 %93, i8* %94)
228+
call void @abort()
229+
br label %cond_exit_61
230+
231+
cond_61_case_1: ; preds = %91
232+
br label %cond_exit_61
233+
234+
cond_exit_61: ; preds = %cond_61_case_1, %cond_61_case_0
235+
%"073.0" = phi i64 [ 0, %cond_61_case_0 ], [ %92, %cond_61_case_1 ]
236+
ret void
237+
}
238+
239+
declare i32 @printf(i8*, ...)
240+
241+
declare void @abort()

0 commit comments

Comments
 (0)