11; ModuleID = 'generics.go'
22source_filename = "generics.go"
3- target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
3+ target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128- n32:64-S128-ni:1:10:20"
44target triple = "wasm32-unknown-wasi"
55
6- %"main.Point[int]" = type { i32 , i32 }
76%"main.Point[float32]" = type { float , float }
7+ %"main.Point[int]" = type { i32 , i32 }
88
9- declare noalias nonnull i8* @runtime.alloc (i32 , i8* , i8* ) #0
9+ ; Function Attrs: allockind("alloc,zeroed") allocsize(0)
10+ declare noalias nonnull ptr @runtime.alloc (i32 , ptr , ptr ) #0
1011
11- declare void @runtime.trackPointer (i8* nocapture readonly , i8* ) #0
12+ declare void @runtime.trackPointer (ptr nocapture readonly , ptr , ptr ) #1
1213
1314; Function Attrs: nounwind
14- define hidden void @main.init (i8* %context ) unnamed_addr #1 {
15+ define hidden void @main.init (ptr %context ) unnamed_addr #2 {
1516entry:
1617 ret void
1718}
1819
1920; Function Attrs: nounwind
20- define hidden void @main.main (i8* %context ) unnamed_addr #1 {
21+ define hidden void @main.main (ptr %context ) unnamed_addr #2 {
2122entry:
22- %bi = alloca %"main.Point[int]" , align 8
23- %ai = alloca %"main.Point[int]" , align 8
24- %bf = alloca %"main.Point[float32]" , align 8
25- %af = alloca %"main.Point[float32]" , align 8
26- %af.repack = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %af , i32 0 , i32 0
27- store float 0 .000000e+00 , float * %af.repack , align 8
28- %af.repack1 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %af , i32 0 , i32 1
29- store float 0 .000000e+00 , float * %af.repack1 , align 4
30- %0 = bitcast %"main.Point[float32]" * %af to i8*
31- call void @runtime.trackPointer (i8* nonnull %0 , i8* undef ) #2
32- %bf.repack = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %bf , i32 0 , i32 0
33- store float 0 .000000e+00 , float * %bf.repack , align 8
34- %bf.repack2 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %bf , i32 0 , i32 1
35- store float 0 .000000e+00 , float * %bf.repack2 , align 4
36- %1 = bitcast %"main.Point[float32]" * %bf to i8*
37- call void @runtime.trackPointer (i8* nonnull %1 , i8* undef ) #2
38- %.elt = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %af , i32 0 , i32 0
39- %.unpack = load float , float * %.elt , align 8
40- %.elt3 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %af , i32 0 , i32 1
41- %.unpack4 = load float , float * %.elt3 , align 4
42- %.elt5 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %bf , i32 0 , i32 0
43- %.unpack6 = load float , float * %.elt5 , align 8
44- %.elt7 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %bf , i32 0 , i32 1
45- %.unpack8 = load float , float * %.elt7 , align 4
46- %2 = call %"main.Point[float32]" @"main.Add[float32]" (float %.unpack , float %.unpack4 , float %.unpack6 , float %.unpack8 , i8* undef )
47- %ai.repack = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %ai , i32 0 , i32 0
48- store i32 0 , i32* %ai.repack , align 8
49- %ai.repack9 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %ai , i32 0 , i32 1
50- store i32 0 , i32* %ai.repack9 , align 4
51- %3 = bitcast %"main.Point[int]" * %ai to i8*
52- call void @runtime.trackPointer (i8* nonnull %3 , i8* undef ) #2
53- %bi.repack = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %bi , i32 0 , i32 0
54- store i32 0 , i32* %bi.repack , align 8
55- %bi.repack10 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %bi , i32 0 , i32 1
56- store i32 0 , i32* %bi.repack10 , align 4
57- %4 = bitcast %"main.Point[int]" * %bi to i8*
58- call void @runtime.trackPointer (i8* nonnull %4 , i8* undef ) #2
59- %.elt11 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %ai , i32 0 , i32 0
60- %.unpack12 = load i32 , i32* %.elt11 , align 8
61- %.elt13 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %ai , i32 0 , i32 1
62- %.unpack14 = load i32 , i32* %.elt13 , align 4
63- %.elt15 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %bi , i32 0 , i32 0
64- %.unpack16 = load i32 , i32* %.elt15 , align 8
65- %.elt17 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %bi , i32 0 , i32 1
66- %.unpack18 = load i32 , i32* %.elt17 , align 4
67- %5 = call %"main.Point[int]" @"main.Add[int]" (i32 %.unpack12 , i32 %.unpack14 , i32 %.unpack16 , i32 %.unpack18 , i8* undef )
23+ %0 = call %"main.Point[float32]" @"main.Add[float32]" (float 0 .000000e+00 , float 0 .000000e+00 , float 0 .000000e+00 , float 0 .000000e+00 , ptr undef )
24+ %1 = call %"main.Point[int]" @"main.Add[int]" (i32 0 , i32 0 , i32 0 , i32 0 , ptr undef )
6825 ret void
6926}
7027
7128; Function Attrs: nounwind
72- define linkonce_odr hidden %"main.Point[float32]" @"main.Add[float32]" (float %a.X , float %a.Y , float %b.X , float %b.Y , i8* %context ) unnamed_addr #1 {
29+ define linkonce_odr hidden %"main.Point[float32]" @"main.Add[float32]" (float %a.X , float %a.Y , float %b.X , float %b.Y , ptr %context ) unnamed_addr #2 {
7330entry:
74- %complit = alloca %"main.Point[float32]" , align 8
75- %b = alloca %"main.Point[float32]" , align 8
76- %a = alloca %"main.Point[float32]" , align 8
77- %a.repack = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %a , i32 0 , i32 0
78- store float 0 .000000e+00 , float * %a.repack , align 8
79- %a.repack9 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %a , i32 0 , i32 1
80- store float 0 .000000e+00 , float * %a.repack9 , align 4
81- %0 = bitcast %"main.Point[float32]" * %a to i8*
82- call void @runtime.trackPointer (i8* nonnull %0 , i8* undef ) #2
83- %a.repack10 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %a , i32 0 , i32 0
84- store float %a.X , float * %a.repack10 , align 8
85- %a.repack11 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %a , i32 0 , i32 1
86- store float %a.Y , float * %a.repack11 , align 4
87- %b.repack = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %b , i32 0 , i32 0
88- store float 0 .000000e+00 , float * %b.repack , align 8
89- %b.repack13 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %b , i32 0 , i32 1
90- store float 0 .000000e+00 , float * %b.repack13 , align 4
91- %1 = bitcast %"main.Point[float32]" * %b to i8*
92- call void @runtime.trackPointer (i8* nonnull %1 , i8* undef ) #2
93- %b.repack14 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %b , i32 0 , i32 0
94- store float %b.X , float * %b.repack14 , align 8
95- %b.repack15 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %b , i32 0 , i32 1
96- store float %b.Y , float * %b.repack15 , align 4
97- call void @main.checkSize (i32 4 , i8* undef ) #2
98- call void @main.checkSize (i32 8 , i8* undef ) #2
99- %complit.repack = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %complit , i32 0 , i32 0
100- store float 0 .000000e+00 , float * %complit.repack , align 8
101- %complit.repack17 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %complit , i32 0 , i32 1
102- store float 0 .000000e+00 , float * %complit.repack17 , align 4
103- %2 = bitcast %"main.Point[float32]" * %complit to i8*
104- call void @runtime.trackPointer (i8* nonnull %2 , i8* undef ) #2
105- %3 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %complit , i32 0 , i32 0
31+ %stackalloc = alloca i8 , align 1
32+ %a = call align 4 dereferenceable (8 ) ptr @runtime.alloc (i32 8 , ptr nonnull inttoptr (i32 3 to ptr ), ptr undef ) #3
33+ call void @runtime.trackPointer (ptr nonnull %a , ptr nonnull %stackalloc , ptr undef ) #3
34+ store float %a.X , ptr %a , align 4
35+ %a.repack9 = getelementptr inbounds nuw i8 , ptr %a , i32 4
36+ store float %a.Y , ptr %a.repack9 , align 4
37+ %b = call align 4 dereferenceable (8 ) ptr @runtime.alloc (i32 8 , ptr nonnull inttoptr (i32 3 to ptr ), ptr undef ) #3
38+ call void @runtime.trackPointer (ptr nonnull %b , ptr nonnull %stackalloc , ptr undef ) #3
39+ store float %b.X , ptr %b , align 4
40+ %b.repack11 = getelementptr inbounds nuw i8 , ptr %b , i32 4
41+ store float %b.Y , ptr %b.repack11 , align 4
42+ call void @main.checkSize (i32 4 , ptr undef ) #3
43+ call void @main.checkSize (i32 8 , ptr undef ) #3
44+ %complit = call align 4 dereferenceable (8 ) ptr @runtime.alloc (i32 8 , ptr nonnull inttoptr (i32 3 to ptr ), ptr undef ) #3
45+ call void @runtime.trackPointer (ptr nonnull %complit , ptr nonnull %stackalloc , ptr undef ) #3
10646 br i1 false , label %deref.throw , label %deref.next
10747
10848deref.next: ; preds = %entry
10949 br i1 false , label %deref.throw1 , label %deref.next2
11050
11151deref.next2: ; preds = %deref.next
112- %4 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %b , i32 0 , i32 0
113- %5 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %a , i32 0 , i32 0
114- %6 = load float , float * %5 , align 8
115- %7 = load float , float * %4 , align 8
116- %8 = fadd float %6 , %7
52+ %0 = load float , ptr %a , align 4
53+ %1 = load float , ptr %b , align 4
54+ %2 = fadd float %0 , %1
11755 br i1 false , label %deref.throw3 , label %deref.next4
11856
11957deref.next4: ; preds = %deref.next2
12058 br i1 false , label %deref.throw5 , label %deref.next6
12159
12260deref.next6: ; preds = %deref.next4
123- %9 = getelementptr inbounds % "main.Point[float32]" , % "main.Point[float32]" * %b , i32 0 , i32 1
124- %10 = getelementptr inbounds % "main.Point[float32]" , % "main.Point[float32]" * %a , i32 0 , i32 1
125- %11 = load float , float * %10 , align 4
126- %12 = load float , float * %9 , align 4
61+ %3 = getelementptr inbounds nuw i8 , ptr %b , i32 4
62+ %4 = getelementptr inbounds nuw i8 , ptr %a , i32 4
63+ %5 = load float , ptr %4 , align 4
64+ %6 = load float , ptr %3 , align 4
12765 br i1 false , label %store.throw , label %store.next
12866
12967store .next: ; preds = %deref.next6
130- store float %8 , float * %3 , align 8
68+ store float %2 , ptr %complit , align 4
13169 br i1 false , label %store.throw7 , label %store.next8
13270
13371store .next8: ; preds = %store.next
134- %13 = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %complit , i32 0 , i32 1
135- %14 = fadd float %11 , %12
136- store float %14 , float * %13 , align 4
137- %.elt = getelementptr inbounds %"main.Point[float32]" , %"main.Point[float32]" * %complit , i32 0 , i32 0
138- %.unpack = load float , float * %.elt , align 8
139- %15 = insertvalue %"main.Point[float32]" undef , float %.unpack , 0
140- %16 = insertvalue %"main.Point[float32]" %15 , float %14 , 1
141- ret %"main.Point[float32]" %16
72+ %7 = getelementptr inbounds nuw i8 , ptr %complit , i32 4
73+ %8 = fadd float %5 , %6
74+ store float %8 , ptr %7 , align 4
75+ %.unpack = load float , ptr %complit , align 4
76+ %9 = insertvalue %"main.Point[float32]" poison, float %.unpack , 0
77+ %10 = insertvalue %"main.Point[float32]" %9 , float %8 , 1
78+ ret %"main.Point[float32]" %10
14279
14380deref.throw: ; preds = %entry
14481 unreachable
@@ -159,81 +96,61 @@ store.throw7: ; preds = %store.next
15996 unreachable
16097}
16198
162- declare void @main.checkSize (i32 , i8* ) #0
99+ declare void @main.checkSize (i32 , ptr ) #1
163100
164- declare void @runtime.nilPanic (i8* ) #0
101+ declare void @runtime.nilPanic (ptr ) #1
165102
166103; Function Attrs: nounwind
167- define linkonce_odr hidden %"main.Point[int]" @"main.Add[int]" (i32 %a.X , i32 %a.Y , i32 %b.X , i32 %b.Y , i8* %context ) unnamed_addr #1 {
104+ define linkonce_odr hidden %"main.Point[int]" @"main.Add[int]" (i32 %a.X , i32 %a.Y , i32 %b.X , i32 %b.Y , ptr %context ) unnamed_addr #2 {
168105entry:
169- %complit = alloca %"main.Point[int]" , align 8
170- %b = alloca %"main.Point[int]" , align 8
171- %a = alloca %"main.Point[int]" , align 8
172- %a.repack = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %a , i32 0 , i32 0
173- store i32 0 , i32* %a.repack , align 8
174- %a.repack9 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %a , i32 0 , i32 1
175- store i32 0 , i32* %a.repack9 , align 4
176- %0 = bitcast %"main.Point[int]" * %a to i8*
177- call void @runtime.trackPointer (i8* nonnull %0 , i8* undef ) #2
178- %a.repack10 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %a , i32 0 , i32 0
179- store i32 %a.X , i32* %a.repack10 , align 8
180- %a.repack11 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %a , i32 0 , i32 1
181- store i32 %a.Y , i32* %a.repack11 , align 4
182- %b.repack = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %b , i32 0 , i32 0
183- store i32 0 , i32* %b.repack , align 8
184- %b.repack13 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %b , i32 0 , i32 1
185- store i32 0 , i32* %b.repack13 , align 4
186- %1 = bitcast %"main.Point[int]" * %b to i8*
187- call void @runtime.trackPointer (i8* nonnull %1 , i8* undef ) #2
188- %b.repack14 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %b , i32 0 , i32 0
189- store i32 %b.X , i32* %b.repack14 , align 8
190- %b.repack15 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %b , i32 0 , i32 1
191- store i32 %b.Y , i32* %b.repack15 , align 4
192- call void @main.checkSize (i32 4 , i8* undef ) #2
193- call void @main.checkSize (i32 8 , i8* undef ) #2
194- %complit.repack = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %complit , i32 0 , i32 0
195- store i32 0 , i32* %complit.repack , align 8
196- %complit.repack17 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %complit , i32 0 , i32 1
197- store i32 0 , i32* %complit.repack17 , align 4
198- %2 = bitcast %"main.Point[int]" * %complit to i8*
199- call void @runtime.trackPointer (i8* nonnull %2 , i8* undef ) #2
200- %3 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %complit , i32 0 , i32 0
106+ %stackalloc = alloca i8 , align 1
107+ %a = call align 4 dereferenceable (8 ) ptr @runtime.alloc (i32 8 , ptr nonnull inttoptr (i32 3 to ptr ), ptr undef ) #3
108+ call void @runtime.trackPointer (ptr nonnull %a , ptr nonnull %stackalloc , ptr undef ) #3
109+ store i32 %a.X , ptr %a , align 4
110+ %a.repack9 = getelementptr inbounds nuw i8 , ptr %a , i32 4
111+ store i32 %a.Y , ptr %a.repack9 , align 4
112+ %b = call align 4 dereferenceable (8 ) ptr @runtime.alloc (i32 8 , ptr nonnull inttoptr (i32 3 to ptr ), ptr undef ) #3
113+ call void @runtime.trackPointer (ptr nonnull %b , ptr nonnull %stackalloc , ptr undef ) #3
114+ store i32 %b.X , ptr %b , align 4
115+ %b.repack11 = getelementptr inbounds nuw i8 , ptr %b , i32 4
116+ store i32 %b.Y , ptr %b.repack11 , align 4
117+ call void @main.checkSize (i32 4 , ptr undef ) #3
118+ call void @main.checkSize (i32 8 , ptr undef ) #3
119+ %complit = call align 4 dereferenceable (8 ) ptr @runtime.alloc (i32 8 , ptr nonnull inttoptr (i32 3 to ptr ), ptr undef ) #3
120+ call void @runtime.trackPointer (ptr nonnull %complit , ptr nonnull %stackalloc , ptr undef ) #3
201121 br i1 false , label %deref.throw , label %deref.next
202122
203123deref.next: ; preds = %entry
204124 br i1 false , label %deref.throw1 , label %deref.next2
205125
206126deref.next2: ; preds = %deref.next
207- %4 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %b , i32 0 , i32 0
208- %5 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %a , i32 0 , i32 0
209- %6 = load i32 , i32* %5 , align 8
210- %7 = load i32 , i32* %4 , align 8
211- %8 = add i32 %6 , %7
127+ %0 = load i32 , ptr %a , align 4
128+ %1 = load i32 , ptr %b , align 4
129+ %2 = add i32 %0 , %1
212130 br i1 false , label %deref.throw3 , label %deref.next4
213131
214132deref.next4: ; preds = %deref.next2
215133 br i1 false , label %deref.throw5 , label %deref.next6
216134
217135deref.next6: ; preds = %deref.next4
218- %9 = getelementptr inbounds % "main.Point[int]" , % "main.Point[int]" * %b , i32 0 , i32 1
219- %10 = getelementptr inbounds % "main.Point[int]" , % "main.Point[int]" * %a , i32 0 , i32 1
220- %11 = load i32 , i32* %10 , align 4
221- %12 = load i32 , i32* %9 , align 4
136+ %3 = getelementptr inbounds nuw i8 , ptr %b , i32 4
137+ %4 = getelementptr inbounds nuw i8 , ptr %a , i32 4
138+ %5 = load i32 , ptr %4 , align 4
139+ %6 = load i32 , ptr %3 , align 4
222140 br i1 false , label %store.throw , label %store.next
223141
224142store .next: ; preds = %deref.next6
225- store i32 %8 , i32* %3 , align 8
143+ store i32 %2 , ptr %complit , align 4
226144 br i1 false , label %store.throw7 , label %store.next8
227145
228146store .next8: ; preds = %store.next
229- %13 = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %complit , i32 0 , i32 1
230- %14 = add i32 %11 , %12
231- store i32 %14 , i32* %13 , align 4
232- %.elt = getelementptr inbounds %"main.Point[int]" , %"main.Point[int]" * %complit , i32 0 , i32 0
233- %.unpack = load i32 , i32* %.elt , align 8
234- %15 = insertvalue %"main.Point[int]" undef , i32 %.unpack , 0
235- %16 = insertvalue %"main.Point[int]" %15 , i32 %14 , 1
236- ret %"main.Point[int]" %16
147+ %7 = getelementptr inbounds nuw i8 , ptr %complit , i32 4
148+ %8 = add i32 %5 , %6
149+ store i32 %8 , ptr %7 , align 4
150+ %.unpack = load i32 , ptr %complit , align 4
151+ %9 = insertvalue %"main.Point[int]" poison, i32 %.unpack , 0
152+ %10 = insertvalue %"main.Point[int]" %9 , i32 %8 , 1
153+ ret %"main.Point[int]" %10
237154
238155deref.throw: ; preds = %entry
239156 unreachable
@@ -254,6 +171,7 @@ store.throw7: ; preds = %store.next
254171 unreachable
255172}
256173
257- attributes #0 = { "target-features" ="+bulk-memory,+nontrapping-fptoint,+sign-ext" }
258- attributes #1 = { nounwind "target-features" ="+bulk-memory,+nontrapping-fptoint,+sign-ext" }
259- attributes #2 = { nounwind }
174+ attributes #0 = { allockind("alloc,zeroed" ) allocsize(0 ) "alloc-family" ="runtime.alloc" "target-features" ="+bulk-memory,+bulk-memory-opt,+call-indirect-overlong,+mutable-globals,+nontrapping-fptoint,+sign-ext,-multivalue,-reference-types" }
175+ attributes #1 = { "target-features" ="+bulk-memory,+bulk-memory-opt,+call-indirect-overlong,+mutable-globals,+nontrapping-fptoint,+sign-ext,-multivalue,-reference-types" }
176+ attributes #2 = { nounwind "target-features" ="+bulk-memory,+bulk-memory-opt,+call-indirect-overlong,+mutable-globals,+nontrapping-fptoint,+sign-ext,-multivalue,-reference-types" }
177+ attributes #3 = { nounwind }
0 commit comments