@@ -326,63 +326,79 @@ done:
326
326
327
327
; Check self recursive functions
328
328
329
- ; CHECK-NOT: @recursive1(
329
+ ; CHECK-LABEL: define internal void @recursive1(i32 %x, i32 %y)
330
+ ; CHECK: tail call void @recursive1_merged(i32 %x, i32 %y, i32* @g1, void (i32, i32)* @recursive1)
331
+ ; CHECK: ret void
330
332
define internal void @recursive1 (i32 %x , i32 %y ) {
331
333
br i1 undef , label %bb1 , label %bb2
332
334
333
335
bb1:
336
+ %l = load i32 , i32* @g1 , align 4
334
337
call void @recursive1 (i32 %x , i32 %y )
335
338
br label %bb2
336
339
337
340
bb2:
338
341
ret void
339
342
}
340
343
341
- ; CHECK-LABEL: define internal void @recursive1_merged (i32, i32)
342
- ; CHECK: call void @recursive1_merged(i32 %0 , i32 %1 )
344
+ ; CHECK-LABEL: define internal void @recursive2 (i32 %x , i32 %y )
345
+ ; CHECK: tail call void @recursive1_merged(i32 %x , i32 %y, i32* @g2, void (i32, i32)* @recursive2 )
343
346
; CHECK: ret void
344
347
define internal void @recursive2 (i32 %x , i32 %y ) {
345
348
br i1 undef , label %bb1 , label %bb2
346
349
347
350
bb1:
351
+ %l = load i32 , i32* @g2 , align 4
348
352
call void @recursive2 (i32 %x , i32 %y )
349
353
br label %bb2
350
354
351
355
bb2:
352
356
ret void
353
357
}
358
+ ; CHECK-LABEL: define internal void @recursive1_merged(i32, i32, i32*, void (i32, i32)*)
359
+ ; CHECK: load i32, i32* %2
360
+ ; CHECK: call void %3(i32 %0, i32 %1)
361
+ ; CHECK: ret void
362
+
354
363
355
- ; CHECK-LABEL: define internal void @another_recursive_func_merged (i32, void (i32)* )
356
- ; CHECK: call void %1 (i32 %0 )
364
+ ; CHECK-LABEL: define internal void @another_recursive_func (i32 %x )
365
+ ; CHECK: tail call void @another_recursive_func_merged (i32 %x, i32* @g1, void (i32)* @another_recursive_func )
357
366
; CHECK: ret void
358
367
define internal void @another_recursive_func (i32 %x ) {
359
368
br i1 undef , label %bb1 , label %bb2
360
369
361
370
bb1:
371
+ store i32 %x , i32 *@g1 , align 4
362
372
call void @another_recursive_func (i32 %x )
363
373
br label %bb2
364
374
365
375
bb2:
366
376
ret void
367
377
}
368
-
369
378
; CHECK-NOT: @not_really_recursive(
379
+
380
+ ; CHECK-LABEL: define internal void @another_recursive_func_merged(i32, i32*, void (i32)*)
381
+ ; CHECK: store i32 %0, i32* %1
382
+ ; CHECK: call void %2(i32 %0)
383
+ ; CHECK: ret void
370
384
define internal void @not_really_recursive (i32 %x ) {
371
385
br i1 undef , label %bb1 , label %bb2
372
386
373
387
bb1:
388
+ store i32 %x , i32 *@g2 , align 4
374
389
call void @callee1 (i32 %x )
375
390
br label %bb2
376
391
377
392
bb2:
378
393
ret void
379
394
}
395
+ ; CHECK-NOT: @not_really_recursive(
380
396
381
397
; CHECK-LABEL: define void @call_recursive_funcs(i32 %x)
382
- ; CHECK: call void @recursive1_merged (i32 %x, i32 %x)
383
- ; CHECK: call void @recursive1_merged (i32 %x, i32 %x)
384
- ; CHECK: call void bitcast (void (i32, void (i32)*)* @another_recursive_func_merged to void (i32, void (i32, void (i32)*)*)*)(i32 %x, void (i32, void (i32)*)* @another_recursive_func_merged )
385
- ; CHECK: call void @another_recursive_func_merged(i32 %x, void (i32)* @callee1)
398
+ ; CHECK: call void @recursive1 (i32 %x, i32 %x)
399
+ ; CHECK: call void @recursive2 (i32 %x, i32 %x)
400
+ ; CHECK: call void @another_recursive_func (i32 %x )
401
+ ; CHECK: call void @another_recursive_func_merged(i32 %x, i32* @g2, void (i32)* @callee1)
386
402
; CHECK: ret void
387
403
define void @call_recursive_funcs (i32 %x ) {
388
404
call void @recursive1 (i32 %x , i32 %x )
0 commit comments