Skip to content

Commit e9d78a7

Browse files
aykevldeadprogram
authored andcommitted
compiler: re-enable generics test
This seems to have been removed by accident, but it still seems useful to me.
1 parent 7ec9cfc commit e9d78a7

2 files changed

Lines changed: 78 additions & 159 deletions

File tree

compiler/compiler_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ func TestCompiler(t *testing.T) {
5050
{"channel.go", "", ""},
5151
{"gc.go", "", ""},
5252
{"zeromap.go", "", ""},
53+
{"generics.go", "", ""},
5354
}
5455
if goMinor >= 20 {
5556
tests = append(tests, testCase{"go1.20.go", "", ""})

compiler/testdata/generics.ll

Lines changed: 77 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -1,144 +1,81 @@
11
; ModuleID = 'generics.go'
22
source_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"
44
target 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 {
1516
entry:
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 {
2122
entry:
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 {
7330
entry:
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

10848
deref.next: ; preds = %entry
10949
br i1 false, label %deref.throw1, label %deref.next2
11050

11151
deref.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

11957
deref.next4: ; preds = %deref.next2
12058
br i1 false, label %deref.throw5, label %deref.next6
12159

12260
deref.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

12967
store.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

13371
store.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

14380
deref.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 {
168105
entry:
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

203123
deref.next: ; preds = %entry
204124
br i1 false, label %deref.throw1, label %deref.next2
205125

206126
deref.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

214132
deref.next4: ; preds = %deref.next2
215133
br i1 false, label %deref.throw5, label %deref.next6
216134

217135
deref.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

224142
store.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

228146
store.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

238155
deref.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

Comments
 (0)