45
45
%task.current = bitcast i8* %parentHandle to %"internal/task.Task" *
46
46
%ret.ptr = call i8* @"(*internal/task.Task).getReturnPtr" (%"internal/task.Task" * %task.current , i8* undef , i8* undef )
47
47
%ret.ptr.bitcast = bitcast i8* %ret.ptr to i32*
48
- store i32 %0 , i32* %ret.ptr.bitcast
48
+ store i32 %0 , i32* %ret.ptr.bitcast , align 4
49
49
call void @sleep (i64 %1 , i8* undef , i8* %parentHandle )
50
50
ret i32 undef
51
51
}
84
84
%task.current = bitcast i8* %parentHandle to %"internal/task.Task" *
85
85
%ret.ptr = call i8* @"(*internal/task.Task).getReturnPtr" (%"internal/task.Task" * %task.current , i8* undef , i8* undef )
86
86
%ret.ptr.bitcast = bitcast i8* %ret.ptr to i32*
87
- store i32 %0 , i32* %ret.ptr.bitcast
87
+ store i32 %0 , i32* %ret.ptr.bitcast , align 4
88
88
%ret.alternate = call i8* @runtime.alloc (i32 4 , i8* undef , i8* undef )
89
89
call void @"(*internal/task.Task).setReturnPtr" (%"internal/task.Task" * %task.current , i8* %ret.alternate , i8* undef , i8* undef )
90
90
%4 = call i32 @delayedValue (i32 %1 , i64 %2 , i8* undef , i8* %parentHandle )
93
93
94
94
define i1 @coroutine (i32 %0 , i64 %1 , i8* %2 , i8* %parentHandle ) {
95
95
entry:
96
- %call.return = alloca i32
96
+ %call.return = alloca i32 , align 4
97
97
%coro.id = call token @llvm.coro.id (i32 0 , i8* null , i8* null , i8* null )
98
98
%coro.size = call i32 @llvm.coro.size.i32 ()
99
99
%coro.alloc = call i8* @runtime.alloc (i32 %coro.size , i8* undef , i8* undef )
@@ -116,10 +116,10 @@ entry:
116
116
]
117
117
118
118
wakeup: ; preds = %entry
119
- %4 = load i32 , i32* %call.return
119
+ %4 = load i32 , i32* %call.return , align 4
120
120
call void @llvm.lifetime.end.p0i8 (i64 4 , i8* %call.return.bitcast )
121
121
%5 = icmp eq i32 %4 , 0
122
- store i1 %5 , i1* %task.retPtr.bitcast
122
+ store i1 %5 , i1* %task.retPtr.bitcast , align 1
123
123
call void @"(*internal/task.Task).returnTo" (%"internal/task.Task" * %task.current2 , i8* %task.state.parent , i8* undef , i8* undef )
124
124
br label %cleanup
125
125
@@ -133,11 +133,127 @@ cleanup: ; preds = %entry, %wakeup
133
133
br label %suspend
134
134
}
135
135
136
- define void @doNothing (i8* %0 , i8* %1 ) {
136
+ define void @doNothing (i8* %0 , i8* %parentHandle ) {
137
137
entry:
138
138
ret void
139
139
}
140
140
141
+ define i8 @coroutineTailRegression (i8* %0 , i8* %parentHandle ) {
142
+ entry:
143
+ %a = alloca i8 , align 1
144
+ %coro.id = call token @llvm.coro.id (i32 0 , i8* null , i8* null , i8* null )
145
+ %coro.size = call i32 @llvm.coro.size.i32 ()
146
+ %coro.alloc = call i8* @runtime.alloc (i32 %coro.size , i8* undef , i8* undef )
147
+ %coro.state = call i8* @llvm.coro.begin (token %coro.id , i8* %coro.alloc )
148
+ %task.current = bitcast i8* %parentHandle to %"internal/task.Task" *
149
+ %task.state.parent = call i8* @"(*internal/task.Task).setState" (%"internal/task.Task" * %task.current , i8* %coro.state , i8* undef , i8* undef )
150
+ %task.retPtr = call i8* @"(*internal/task.Task).getReturnPtr" (%"internal/task.Task" * %task.current , i8* undef , i8* undef )
151
+ store i8 5 , i8* %a , align 1
152
+ %coro.state.restore = call i8* @"(*internal/task.Task).setState" (%"internal/task.Task" * %task.current , i8* %task.state.parent , i8* undef , i8* undef )
153
+ call void @"(*internal/task.Task).setReturnPtr" (%"internal/task.Task" * %task.current , i8* %task.retPtr , i8* undef , i8* undef )
154
+ %val = call i8 @usePtr (i8* %a , i8* undef , i8* %parentHandle )
155
+ br label %post.tail
156
+
157
+ suspend: ; preds = %post.tail, %cleanup
158
+ %unused = call i1 @llvm.coro.end (i8* %coro.state , i1 false )
159
+ ret i8 undef
160
+
161
+ cleanup: ; preds = %post.tail
162
+ %coro.memFree = call i8* @llvm.coro.free (token %coro.id , i8* %coro.state )
163
+ call void @runtime.free (i8* %coro.memFree , i8* undef , i8* undef )
164
+ br label %suspend
165
+
166
+ post.tail: ; preds = %entry
167
+ %coro.save = call token @llvm.coro.save (i8* %coro.state )
168
+ %call.suspend = call i8 @llvm.coro.suspend (token %coro.save , i1 false )
169
+ switch i8 %call.suspend , label %suspend [
170
+ i8 0 , label %unreachable
171
+ i8 1 , label %cleanup
172
+ ]
173
+
174
+ unreachable: ; preds = %post.tail
175
+ unreachable
176
+ }
177
+
178
+ define i8 @allocaTailRegression (i8* %0 , i8* %parentHandle ) {
179
+ entry:
180
+ %a = alloca i8 , align 1
181
+ %coro.id = call token @llvm.coro.id (i32 0 , i8* null , i8* null , i8* null )
182
+ %coro.size = call i32 @llvm.coro.size.i32 ()
183
+ %coro.alloc = call i8* @runtime.alloc (i32 %coro.size , i8* undef , i8* undef )
184
+ %coro.state = call i8* @llvm.coro.begin (token %coro.id , i8* %coro.alloc )
185
+ %task.current = bitcast i8* %parentHandle to %"internal/task.Task" *
186
+ %task.state.parent = call i8* @"(*internal/task.Task).setState" (%"internal/task.Task" * %task.current , i8* %coro.state , i8* undef , i8* undef )
187
+ %task.retPtr = call i8* @"(*internal/task.Task).getReturnPtr" (%"internal/task.Task" * %task.current , i8* undef , i8* undef )
188
+ call void @sleep (i64 1000000 , i8* undef , i8* %parentHandle )
189
+ %coro.save1 = call token @llvm.coro.save (i8* %coro.state )
190
+ %call.suspend2 = call i8 @llvm.coro.suspend (token %coro.save1 , i1 false )
191
+ switch i8 %call.suspend2 , label %suspend [
192
+ i8 0 , label %wakeup
193
+ i8 1 , label %cleanup
194
+ ]
195
+
196
+ wakeup: ; preds = %entry
197
+ store i8 5 , i8* %a , align 1
198
+ %1 = call i8* @"(*internal/task.Task).setState" (%"internal/task.Task" * %task.current , i8* %task.state.parent , i8* undef , i8* undef )
199
+ call void @"(*internal/task.Task).setReturnPtr" (%"internal/task.Task" * %task.current , i8* %task.retPtr , i8* undef , i8* undef )
200
+ %2 = call i8 @usePtr (i8* %a , i8* undef , i8* %parentHandle )
201
+ br label %post.tail
202
+
203
+ suspend: ; preds = %entry, %post.tail, %cleanup
204
+ %unused = call i1 @llvm.coro.end (i8* %coro.state , i1 false )
205
+ ret i8 undef
206
+
207
+ cleanup: ; preds = %entry, %post.tail
208
+ %coro.memFree = call i8* @llvm.coro.free (token %coro.id , i8* %coro.state )
209
+ call void @runtime.free (i8* %coro.memFree , i8* undef , i8* undef )
210
+ br label %suspend
211
+
212
+ post.tail: ; preds = %wakeup
213
+ %coro.save = call token @llvm.coro.save (i8* %coro.state )
214
+ %call.suspend = call i8 @llvm.coro.suspend (token %coro.save , i1 false )
215
+ switch i8 %call.suspend , label %suspend [
216
+ i8 0 , label %unreachable
217
+ i8 1 , label %cleanup
218
+ ]
219
+
220
+ unreachable: ; preds = %post.tail
221
+ unreachable
222
+ }
223
+
224
+ define i8 @usePtr (i8* %0 , i8* %1 , i8* %parentHandle ) {
225
+ entry:
226
+ %coro.id = call token @llvm.coro.id (i32 0 , i8* null , i8* null , i8* null )
227
+ %coro.size = call i32 @llvm.coro.size.i32 ()
228
+ %coro.alloc = call i8* @runtime.alloc (i32 %coro.size , i8* undef , i8* undef )
229
+ %coro.state = call i8* @llvm.coro.begin (token %coro.id , i8* %coro.alloc )
230
+ %task.current = bitcast i8* %parentHandle to %"internal/task.Task" *
231
+ %task.state.parent = call i8* @"(*internal/task.Task).setState" (%"internal/task.Task" * %task.current , i8* %coro.state , i8* undef , i8* undef )
232
+ %task.retPtr = call i8* @"(*internal/task.Task).getReturnPtr" (%"internal/task.Task" * %task.current , i8* undef , i8* undef )
233
+ call void @sleep (i64 1000000 , i8* undef , i8* %parentHandle )
234
+ %coro.save = call token @llvm.coro.save (i8* %coro.state )
235
+ %call.suspend = call i8 @llvm.coro.suspend (token %coro.save , i1 false )
236
+ switch i8 %call.suspend , label %suspend [
237
+ i8 0 , label %wakeup
238
+ i8 1 , label %cleanup
239
+ ]
240
+
241
+ wakeup: ; preds = %entry
242
+ %2 = load i8 , i8* %0 , align 1
243
+ store i8 %2 , i8* %task.retPtr , align 1
244
+ call void @"(*internal/task.Task).returnTo" (%"internal/task.Task" * %task.current , i8* %task.state.parent , i8* undef , i8* undef )
245
+ br label %cleanup
246
+
247
+ suspend: ; preds = %entry, %cleanup
248
+ %unused = call i1 @llvm.coro.end (i8* %coro.state , i1 false )
249
+ ret i8 undef
250
+
251
+ cleanup: ; preds = %entry, %wakeup
252
+ %coro.memFree = call i8* @llvm.coro.free (token %coro.id , i8* %coro.state )
253
+ call void @runtime.free (i8* %coro.memFree , i8* undef , i8* undef )
254
+ br label %suspend
255
+ }
256
+
141
257
define void @sleepGoroutine (i8* %0 , i8* %parentHandle ) {
142
258
%task.current = bitcast i8* %parentHandle to %"internal/task.Task" *
143
259
call void @sleep (i64 1000000 , i8* undef , i8* %parentHandle )
0 commit comments