Skip to content

Commit c829ca3

Browse files
committed
[DSE] Add additional tests to cover review comments.
Adds additional tests following comments from D109844. Also removes unusued in.ptr arguments and places in the call tests that used loads instead of a getval call. (cherry-picked from 963d3a2)
1 parent aea4f14 commit c829ca3

File tree

2 files changed

+392
-37
lines changed

2 files changed

+392
-37
lines changed

llvm/test/Transforms/DeadStoreElimination/captures-before-call.ll

Lines changed: 119 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ declare void @escape_and_clobber(i32*)
4343
declare void @escape_writeonly(i32*) writeonly
4444
declare void @clobber()
4545

46-
define i32 @test_not_captured_before_call_same_bb(i32** %in.ptr) {
46+
define i32 @test_not_captured_before_call_same_bb() {
4747
; CHECK-LABEL: @test_not_captured_before_call_same_bb(
4848
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
4949
; 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) {
6060
ret i32 %r
6161
}
6262

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() {
6464
; CHECK-LABEL: @test_not_captured_before_call_same_bb_escape_unreachable_block(
6565
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
6666
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -84,28 +84,26 @@ unreach:
8484
ret i32 0
8585
}
8686

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() {
8888
; CHECK-LABEL: @test_captured_and_clobbered_after_load_same_bb_2(
8989
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
9090
; 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()
9392
; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
9493
; CHECK-NEXT: store i32 99, i32* [[A]], align 4
9594
; CHECK-NEXT: call void @clobber()
96-
; CHECK-NEXT: ret i32 [[IN_LV_2]]
95+
; CHECK-NEXT: ret i32 [[R]]
9796
;
9897
%a = alloca i32, align 4
9998
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()
102100
call void @escape_and_clobber(i32* %a)
103101
store i32 99, i32* %a, align 4
104102
call void @clobber()
105-
ret i32 %in.lv.2
103+
ret i32 %r
106104
}
107105

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() {
109107
; CHECK-LABEL: @test_captured_after_call_same_bb_2_clobbered_later(
110108
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
111109
; 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) {
124122
ret i32 %r
125123
}
126124

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) {
128126
; CHECK-LABEL: @test_captured_sibling_path_to_call_other_blocks_1(
129127
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
130128
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -160,7 +158,7 @@ exit:
160158
ret i32 %p
161159
}
162160

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) {
164162
; CHECK-LABEL: @test_captured_before_call_other_blocks_2(
165163
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
166164
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -196,7 +194,7 @@ exit:
196194
ret i32 %p
197195
}
198196

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) {
200198
; CHECK-LABEL: @test_captured_before_call_other_blocks_4(
201199
; CHECK-NEXT: entry:
202200
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -231,7 +229,7 @@ exit:
231229
ret i32 %p
232230
}
233231

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) {
235233
; CHECK-LABEL: @test_captured_before_call_other_blocks_5(
236234
; CHECK-NEXT: entry:
237235
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -262,7 +260,7 @@ exit:
262260
ret i32 %r
263261
}
264262

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) {
266264
; CHECK-LABEL: @test_captured_before_call_other_blocks_6(
267265
; CHECK-NEXT: entry:
268266
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -295,7 +293,7 @@ exit:
295293
ret i32 %r
296294
}
297295

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) {
299297
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_1(
300298
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
301299
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -327,7 +325,7 @@ exit:
327325
ret i32 %r
328326
}
329327

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) {
331329
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_2(
332330
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
333331
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -361,7 +359,7 @@ exit:
361359
ret i32 %r
362360
}
363361

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) {
365363
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_3(
366364
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
367365
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -393,7 +391,7 @@ exit:
393391
ret i32 %r
394392
}
395393

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) {
397395
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_4(
398396
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
399397
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
@@ -429,7 +427,7 @@ exit:
429427
ret i32 %p
430428
}
431429

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) {
433431
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_5(
434432
; CHECK-NEXT: entry:
435433
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -462,7 +460,7 @@ exit:
462460
ret i32 %p
463461
}
464462

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) {
466464
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_6(
467465
; CHECK-NEXT: entry:
468466
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -497,7 +495,7 @@ exit:
497495
ret i32 %p
498496
}
499497

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) {
501499
; CHECK-LABEL: @test_not_captured_before_call_other_blocks_7(
502500
; CHECK-NEXT: entry:
503501
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
@@ -532,7 +530,7 @@ exit:
532530
ret i32 %p
533531
}
534532

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() {
536534
; CHECK-LABEL: @test_not_captured_before_call_same_bb_but_read(
537535
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
538536
; 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) {
553551
ret i32 %res
554552
}
555553

556-
define i32 @test_captured_after_loop(i32** %in.ptr, i1 %c.1) {
554+
define i32 @test_captured_after_loop(i1 %c.1) {
557555
; CHECK-LABEL: @test_captured_after_loop(
558556
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
559557
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
560558
; CHECK-NEXT: br label [[LOOP:%.*]]
561559
; 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()
564561
; CHECK-NEXT: store i32 99, i32* [[A]], align 4
565562
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[LOOP]], label [[EXIT:%.*]]
566563
; CHECK: exit:
567564
; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
568-
; CHECK-NEXT: ret i32 [[IN_LV_2]]
565+
; CHECK-NEXT: ret i32 [[R]]
569566
;
570567
%a = alloca i32, align 4
571568
store i32 55, i32* %a
572569
br label %loop
573570

574571
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()
577573
store i32 99, i32* %a, align 4
578574
br i1 %c.1, label %loop, label %exit
579575

580576
exit:
581577
call void @escape_and_clobber(i32* %a)
582-
ret i32 %in.lv.2
578+
ret i32 %r
583579
}
584580

585-
define i32 @test_captured_in_loop(i32** %in.ptr, i1 %c.1) {
581+
define i32 @test_captured_in_loop(i1 %c.1) {
586582
; CHECK-LABEL: @test_captured_in_loop(
587583
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
588584
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
589585
; CHECK-NEXT: br label [[LOOP:%.*]]
590586
; 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()
593588
; CHECK-NEXT: call void @escape_writeonly(i32* [[A]])
594589
; CHECK-NEXT: store i32 99, i32* [[A]], align 4
595590
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[LOOP]], label [[EXIT:%.*]]
596591
; CHECK: exit:
597592
; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
598-
; CHECK-NEXT: ret i32 [[IN_LV_2]]
593+
; CHECK-NEXT: ret i32 [[R]]
599594
;
600595
%a = alloca i32, align 4
601596
store i32 55, i32* %a
602597
br label %loop
603598

604599
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()
607601
call void @escape_writeonly(i32* %a)
608602
store i32 99, i32* %a, align 4
609603
br i1 %c.1, label %loop, label %exit
610604

611605
exit:
612606
call void @escape_and_clobber(i32* %a)
613-
ret i32 %in.lv.2
607+
ret i32 %r
614608
}
615609

616610
declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i1)
@@ -641,3 +635,91 @@ bb:
641635
call void @clobber()
642636
ret void
643637
}
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

Comments
 (0)