@@ -43,7 +43,7 @@ declare void @escape_and_clobber(i32*)
43
43
declare void @escape_writeonly (i32* ) writeonly
44
44
declare void @clobber ()
45
45
46
- define i32 @test_not_captured_before_call_same_bb (i32** %in.ptr ) {
46
+ define i32 @test_not_captured_before_call_same_bb () {
47
47
; CHECK-LABEL: @test_not_captured_before_call_same_bb(
48
48
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
49
49
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -60,7 +60,7 @@ define i32 @test_not_captured_before_call_same_bb(i32** %in.ptr) {
60
60
ret i32 %r
61
61
}
62
62
63
- define i32 @test_not_captured_before_call_same_bb_escape_unreachable_block (i32** %in.ptr ) {
63
+ define i32 @test_not_captured_before_call_same_bb_escape_unreachable_block () {
64
64
; CHECK-LABEL: @test_not_captured_before_call_same_bb_escape_unreachable_block(
65
65
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
66
66
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -84,28 +84,26 @@ unreach:
84
84
ret i32 0
85
85
}
86
86
87
- define i32 @test_captured_and_clobbered_after_load_same_bb_2 (i32** %in.ptr ) {
87
+ define i32 @test_captured_and_clobbered_after_load_same_bb_2 () {
88
88
; CHECK-LABEL: @test_captured_and_clobbered_after_load_same_bb_2(
89
89
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
90
90
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
91
- ; CHECK-NEXT: [[IN_LV_1:%.*]] = load i32*, i32** [[IN_PTR:%.*]], align 2
92
- ; CHECK-NEXT: [[IN_LV_2:%.*]] = load i32, i32* [[IN_LV_1]], align 2
91
+ ; CHECK-NEXT: [[R:%.*]] = call i32 @getval()
93
92
; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
94
93
; CHECK-NEXT: store i32 99, i32* [[A]], align 4
95
94
; CHECK-NEXT: call void @clobber()
96
- ; CHECK-NEXT: ret i32 [[IN_LV_2 ]]
95
+ ; CHECK-NEXT: ret i32 [[R ]]
97
96
;
98
97
%a = alloca i32 , align 4
99
98
store i32 55 , i32* %a
100
- %in.lv.1 = load i32* , i32** %in.ptr , align 2
101
- %in.lv.2 = load i32 , i32* %in.lv.1 , align 2
99
+ %r = call i32 @getval ()
102
100
call void @escape_and_clobber (i32* %a )
103
101
store i32 99 , i32* %a , align 4
104
102
call void @clobber ()
105
- ret i32 %in.lv.2
103
+ ret i32 %r
106
104
}
107
105
108
- define i32 @test_captured_after_call_same_bb_2_clobbered_later (i32** %in.ptr ) {
106
+ define i32 @test_captured_after_call_same_bb_2_clobbered_later () {
109
107
; CHECK-LABEL: @test_captured_after_call_same_bb_2_clobbered_later(
110
108
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
111
109
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -124,7 +122,7 @@ define i32 @test_captured_after_call_same_bb_2_clobbered_later(i32** %in.ptr) {
124
122
ret i32 %r
125
123
}
126
124
127
- define i32 @test_captured_sibling_path_to_call_other_blocks_1 (i32** %in.ptr , i1 %c.1 ) {
125
+ define i32 @test_captured_sibling_path_to_call_other_blocks_1 (i1 %c.1 ) {
128
126
; CHECK-LABEL: @test_captured_sibling_path_to_call_other_blocks_1(
129
127
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
130
128
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -160,7 +158,7 @@ exit:
160
158
ret i32 %p
161
159
}
162
160
163
- define i32 @test_captured_before_call_other_blocks_2 (i32** %in.ptr , i1 %c.1 ) {
161
+ define i32 @test_captured_before_call_other_blocks_2 (i1 %c.1 ) {
164
162
; CHECK-LABEL: @test_captured_before_call_other_blocks_2(
165
163
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
166
164
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -196,7 +194,7 @@ exit:
196
194
ret i32 %p
197
195
}
198
196
199
- define i32 @test_captured_before_call_other_blocks_4 (i32** %in.ptr , i1 %c.1 ) {
197
+ define i32 @test_captured_before_call_other_blocks_4 (i1 %c.1 ) {
200
198
; CHECK-LABEL: @test_captured_before_call_other_blocks_4(
201
199
; CHECK-NEXT: entry:
202
200
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -231,7 +229,7 @@ exit:
231
229
ret i32 %p
232
230
}
233
231
234
- define i32 @test_captured_before_call_other_blocks_5 (i32** %in.ptr , i1 %c.1 ) {
232
+ define i32 @test_captured_before_call_other_blocks_5 (i1 %c.1 ) {
235
233
; CHECK-LABEL: @test_captured_before_call_other_blocks_5(
236
234
; CHECK-NEXT: entry:
237
235
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -262,7 +260,7 @@ exit:
262
260
ret i32 %r
263
261
}
264
262
265
- define i32 @test_captured_before_call_other_blocks_6 (i32** %in.ptr , i1 %c.1 ) {
263
+ define i32 @test_captured_before_call_other_blocks_6 (i1 %c.1 ) {
266
264
; CHECK-LABEL: @test_captured_before_call_other_blocks_6(
267
265
; CHECK-NEXT: entry:
268
266
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -295,7 +293,7 @@ exit:
295
293
ret i32 %r
296
294
}
297
295
298
- define i32 @test_not_captured_before_call_other_blocks_1 (i32** %in.ptr , i1 %c.1 ) {
296
+ define i32 @test_not_captured_before_call_other_blocks_1 (i1 %c.1 ) {
299
297
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_1(
300
298
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
301
299
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -327,7 +325,7 @@ exit:
327
325
ret i32 %r
328
326
}
329
327
330
- define i32 @test_not_captured_before_call_other_blocks_2 (i32** %in.ptr , i1 %c.1 ) {
328
+ define i32 @test_not_captured_before_call_other_blocks_2 (i1 %c.1 ) {
331
329
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_2(
332
330
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
333
331
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -361,7 +359,7 @@ exit:
361
359
ret i32 %r
362
360
}
363
361
364
- define i32 @test_not_captured_before_call_other_blocks_3 (i32** %in.ptr , i1 %c.1 ) {
362
+ define i32 @test_not_captured_before_call_other_blocks_3 (i1 %c.1 ) {
365
363
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_3(
366
364
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
367
365
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -393,7 +391,7 @@ exit:
393
391
ret i32 %r
394
392
}
395
393
396
- define i32 @test_not_captured_before_call_other_blocks_4 (i32** %in.ptr , i1 %c.1 ) {
394
+ define i32 @test_not_captured_before_call_other_blocks_4 (i1 %c.1 ) {
397
395
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_4(
398
396
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
399
397
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -429,7 +427,7 @@ exit:
429
427
ret i32 %p
430
428
}
431
429
432
- define i32 @test_not_captured_before_call_other_blocks_5 (i32** %in.ptr , i1 %c.1 ) {
430
+ define i32 @test_not_captured_before_call_other_blocks_5 (i1 %c.1 ) {
433
431
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_5(
434
432
; CHECK-NEXT: entry:
435
433
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -462,7 +460,7 @@ exit:
462
460
ret i32 %p
463
461
}
464
462
465
- define i32 @test_not_captured_before_call_other_blocks_6 (i32** %in.ptr , i1 %c.1 ) {
463
+ define i32 @test_not_captured_before_call_other_blocks_6 (i1 %c.1 ) {
466
464
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_6(
467
465
; CHECK-NEXT: entry:
468
466
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -497,7 +495,7 @@ exit:
497
495
ret i32 %p
498
496
}
499
497
500
- define i32 @test_not_captured_before_call_other_blocks_7 (i32** %in.ptr , i1 %c.1 ) {
498
+ define i32 @test_not_captured_before_call_other_blocks_7 (i1 %c.1 ) {
501
499
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_7(
502
500
; CHECK-NEXT: entry:
503
501
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -532,7 +530,7 @@ exit:
532
530
ret i32 %p
533
531
}
534
532
535
- define i32 @test_not_captured_before_call_same_bb_but_read (i32** %in.ptr ) {
533
+ define i32 @test_not_captured_before_call_same_bb_but_read () {
536
534
; CHECK-LABEL: @test_not_captured_before_call_same_bb_but_read(
537
535
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
538
536
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -553,64 +551,60 @@ define i32 @test_not_captured_before_call_same_bb_but_read(i32** %in.ptr) {
553
551
ret i32 %res
554
552
}
555
553
556
- define i32 @test_captured_after_loop (i32** %in.ptr , i1 %c.1 ) {
554
+ define i32 @test_captured_after_loop (i1 %c.1 ) {
557
555
; CHECK-LABEL: @test_captured_after_loop(
558
556
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
559
557
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
560
558
; CHECK-NEXT: br label [[LOOP:%.*]]
561
559
; CHECK: loop:
562
- ; CHECK-NEXT: [[IN_LV_1:%.*]] = load i32*, i32** [[IN_PTR:%.*]], align 2
563
- ; CHECK-NEXT: [[IN_LV_2:%.*]] = load i32, i32* [[IN_LV_1]], align 2
560
+ ; CHECK-NEXT: [[R:%.*]] = call i32 @getval()
564
561
; CHECK-NEXT: store i32 99, i32* [[A]], align 4
565
562
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[LOOP]], label [[EXIT:%.*]]
566
563
; CHECK: exit:
567
564
; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
568
- ; CHECK-NEXT: ret i32 [[IN_LV_2 ]]
565
+ ; CHECK-NEXT: ret i32 [[R ]]
569
566
;
570
567
%a = alloca i32 , align 4
571
568
store i32 55 , i32* %a
572
569
br label %loop
573
570
574
571
loop:
575
- %in.lv.1 = load i32* , i32** %in.ptr , align 2
576
- %in.lv.2 = load i32 , i32* %in.lv.1 , align 2
572
+ %r = call i32 @getval ()
577
573
store i32 99 , i32* %a , align 4
578
574
br i1 %c.1 , label %loop , label %exit
579
575
580
576
exit:
581
577
call void @escape_and_clobber (i32* %a )
582
- ret i32 %in.lv.2
578
+ ret i32 %r
583
579
}
584
580
585
- define i32 @test_captured_in_loop (i32** %in.ptr , i1 %c.1 ) {
581
+ define i32 @test_captured_in_loop (i1 %c.1 ) {
586
582
; CHECK-LABEL: @test_captured_in_loop(
587
583
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
588
584
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
589
585
; CHECK-NEXT: br label [[LOOP:%.*]]
590
586
; CHECK: loop:
591
- ; CHECK-NEXT: [[IN_LV_1:%.*]] = load i32*, i32** [[IN_PTR:%.*]], align 2
592
- ; CHECK-NEXT: [[IN_LV_2:%.*]] = load i32, i32* [[IN_LV_1]], align 2
587
+ ; CHECK-NEXT: [[R:%.*]] = call i32 @getval()
593
588
; CHECK-NEXT: call void @escape_writeonly(i32* [[A]])
594
589
; CHECK-NEXT: store i32 99, i32* [[A]], align 4
595
590
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[LOOP]], label [[EXIT:%.*]]
596
591
; CHECK: exit:
597
592
; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
598
- ; CHECK-NEXT: ret i32 [[IN_LV_2 ]]
593
+ ; CHECK-NEXT: ret i32 [[R ]]
599
594
;
600
595
%a = alloca i32 , align 4
601
596
store i32 55 , i32* %a
602
597
br label %loop
603
598
604
599
loop:
605
- %in.lv.1 = load i32* , i32** %in.ptr , align 2
606
- %in.lv.2 = load i32 , i32* %in.lv.1 , align 2
600
+ %r = call i32 @getval ()
607
601
call void @escape_writeonly (i32* %a )
608
602
store i32 99 , i32* %a , align 4
609
603
br i1 %c.1 , label %loop , label %exit
610
604
611
605
exit:
612
606
call void @escape_and_clobber (i32* %a )
613
- ret i32 %in.lv.2
607
+ ret i32 %r
614
608
}
615
609
616
610
declare void @llvm.memcpy.p0i8.p0i8.i64 (i8* , i8* , i64 , i1 )
641
635
call void @clobber ()
642
636
ret void
643
637
}
638
+
639
+
640
+ define void @test_invoke_captures () personality i8* undef {
641
+ ; CHECK-LABEL: @test_invoke_captures(
642
+ ; CHECK-NEXT: bb:
643
+ ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
644
+ ; CHECK-NEXT: store i32 99, i32* [[A]], align 4
645
+ ; CHECK-NEXT: invoke void @clobber()
646
+ ; CHECK-NEXT: to label [[BB2:%.*]] unwind label [[BB5:%.*]]
647
+ ; CHECK: bb2:
648
+ ; CHECK-NEXT: store i32 0, i32* [[A]], align 8
649
+ ; CHECK-NEXT: invoke void @escape(i32* [[A]])
650
+ ; CHECK-NEXT: to label [[BB9:%.*]] unwind label [[BB10:%.*]]
651
+ ; CHECK: bb4:
652
+ ; CHECK-NEXT: ret void
653
+ ; CHECK: bb5:
654
+ ; CHECK-NEXT: [[LP_1:%.*]] = landingpad { i8*, i32 }
655
+ ; CHECK-NEXT: cleanup
656
+ ; CHECK-NEXT: ret void
657
+ ; CHECK: bb9:
658
+ ; CHECK-NEXT: ret void
659
+ ; CHECK: bb10:
660
+ ; CHECK-NEXT: [[LP_2:%.*]] = landingpad { i8*, i32 }
661
+ ; CHECK-NEXT: cleanup
662
+ ; CHECK-NEXT: unreachable
663
+ ;
664
+ bb:
665
+ %a = alloca i32
666
+ store i32 99 , i32* %a
667
+ invoke void @clobber ()
668
+ to label %bb2 unwind label %bb5
669
+
670
+ bb2:
671
+ store i32 0 , i32* %a , align 8
672
+ invoke void @escape (i32* %a )
673
+ to label %bb9 unwind label %bb10
674
+
675
+ bb4:
676
+ ret void
677
+
678
+ bb5:
679
+ %lp.1 = landingpad { i8* , i32 }
680
+ cleanup
681
+ ret void
682
+
683
+ bb9:
684
+ ret void
685
+
686
+ bb10:
687
+ %lp.2 = landingpad { i8* , i32 }
688
+ cleanup
689
+ unreachable
690
+ }
691
+
692
+ declare noalias i32* @alloc () nounwind
693
+ declare i32 @getval_nounwind () nounwind
694
+
695
+ define i32 @test_not_captured_before_load_same_bb_noalias_call () {
696
+ ; CHECK-LABEL: @test_not_captured_before_load_same_bb_noalias_call(
697
+ ; CHECK-NEXT: [[A:%.*]] = call i32* @alloc()
698
+ ; CHECK-NEXT: store i32 55, i32* [[A]], align 4
699
+ ; CHECK-NEXT: [[R:%.*]] = call i32 @getval_nounwind()
700
+ ; CHECK-NEXT: store i32 99, i32* [[A]], align 4
701
+ ; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
702
+ ; CHECK-NEXT: ret i32 [[R]]
703
+ ;
704
+ %a = call i32* @alloc ()
705
+ store i32 55 , i32* %a
706
+ %r = call i32 @getval_nounwind ()
707
+ store i32 99 , i32* %a , align 4
708
+ call void @escape_and_clobber (i32* %a )
709
+ ret i32 %r
710
+ }
711
+
712
+ define i32 @test_not_captured_before_load_same_bb_noalias_arg (i32* noalias %a ) {
713
+ ; CHECK-LABEL: @test_not_captured_before_load_same_bb_noalias_arg(
714
+ ; CHECK-NEXT: store i32 55, i32* [[A:%.*]], align 4
715
+ ; CHECK-NEXT: [[R:%.*]] = call i32 @getval_nounwind()
716
+ ; CHECK-NEXT: store i32 99, i32* [[A]], align 4
717
+ ; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
718
+ ; CHECK-NEXT: ret i32 [[R]]
719
+ ;
720
+ store i32 55 , i32* %a
721
+ %r = call i32 @getval_nounwind ()
722
+ store i32 99 , i32* %a , align 4
723
+ call void @escape_and_clobber (i32* %a )
724
+ ret i32 %r
725
+ }
0 commit comments