xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/unreachable-eliminate-on-ret.ll (revision a58dcc5e08665f2d58a28c9d4510cf94de6ed3bf)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S < %s | FileCheck %s
3
4define noundef i32 @test_ret_noundef(i1 %cond) {
5; CHECK-LABEL: @test_ret_noundef(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    ret i32 1
8;
9entry:
10  br i1 %cond, label %bb1, label %bb2
11
12bb1:
13  br label %bb2
14
15bb2:
16  %r = phi i32 [ undef, %entry ], [ 1, %bb1 ]
17  ret i32 %r
18}
19
20define i32 @test_ret(i1 %cond) {
21; CHECK-LABEL: @test_ret(
22; CHECK-NEXT:  entry:
23; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], i32 1, i32 undef
24; CHECK-NEXT:    ret i32 [[SPEC_SELECT]]
25;
26entry:
27  br i1 %cond, label %bb1, label %bb2
28
29bb1:
30  br label %bb2
31
32bb2:
33  %r = phi i32 [ undef, %entry ], [ 1, %bb1 ]
34  ret i32 %r
35}
36
37define nonnull noundef ptr @test_ret_ptr_nonnull_noundef(i1 %cond, ptr %x) {
38; CHECK-LABEL: @test_ret_ptr_nonnull_noundef(
39; CHECK-NEXT:  entry:
40; CHECK-NEXT:    call void @llvm.assume(i1 [[COND:%.*]])
41; CHECK-NEXT:    ret ptr [[X:%.*]]
42;
43entry:
44  br i1 %cond, label %bb1, label %bb2
45
46bb1:
47  br label %bb2
48
49bb2:
50  %r = phi ptr [ null, %entry ], [ %x, %bb1 ]
51  ret ptr %r
52}
53
54define nonnull noundef ptr @test_ret_ptr_nonnull_noundef_gep_nonzero(i1 %cond, ptr %x) {
55; CHECK-LABEL: @test_ret_ptr_nonnull_noundef_gep_nonzero(
56; CHECK-NEXT:  entry:
57; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], ptr [[X:%.*]], ptr null
58; CHECK-NEXT:    [[GEP:%.*]] = getelementptr ptr, ptr [[SPEC_SELECT]], i64 12
59; CHECK-NEXT:    ret ptr [[GEP]]
60;
61entry:
62  br i1 %cond, label %bb1, label %bb2
63
64bb1:
65  br label %bb2
66
67bb2:
68  %phi = phi ptr [ null, %entry ], [ %x, %bb1 ]
69  %gep = getelementptr ptr, ptr %phi, i64 12
70  ret ptr %gep
71}
72
73define nonnull noundef ptr @test_ret_ptr_nonnull_noundef_gep_inbounds_nonzero(i1 %cond, ptr %x) {
74; CHECK-LABEL: @test_ret_ptr_nonnull_noundef_gep_inbounds_nonzero(
75; CHECK-NEXT:  entry:
76; CHECK-NEXT:    call void @llvm.assume(i1 [[COND:%.*]])
77; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds ptr, ptr [[X:%.*]], i64 12
78; CHECK-NEXT:    ret ptr [[GEP]]
79;
80entry:
81  br i1 %cond, label %bb1, label %bb2
82
83bb1:
84  br label %bb2
85
86bb2:
87  %phi = phi ptr [ null, %entry ], [ %x, %bb1 ]
88  %gep = getelementptr inbounds ptr, ptr %phi, i64 12
89  ret ptr %gep
90}
91
92define nonnull ptr @test_ret_ptr_nonnull(i1 %cond, ptr %x) {
93; CHECK-LABEL: @test_ret_ptr_nonnull(
94; CHECK-NEXT:  entry:
95; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], ptr [[X:%.*]], ptr null
96; CHECK-NEXT:    ret ptr [[SPEC_SELECT]]
97;
98entry:
99  br i1 %cond, label %bb1, label %bb2
100
101bb1:
102  br label %bb2
103
104bb2:
105  %r = phi ptr [ null, %entry ], [ %x, %bb1 ]
106  ret ptr %r
107}
108
109define noundef ptr @test_ret_ptr_noundef(i1 %cond, ptr %x) {
110; CHECK-LABEL: @test_ret_ptr_noundef(
111; CHECK-NEXT:  entry:
112; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], ptr [[X:%.*]], ptr null
113; CHECK-NEXT:    ret ptr [[SPEC_SELECT]]
114;
115entry:
116  br i1 %cond, label %bb1, label %bb2
117
118bb1:
119  br label %bb2
120
121bb2:
122  %r = phi ptr [ null, %entry ], [ %x, %bb1 ]
123  ret ptr %r
124}
125
126define ptr @test_ret_ptr(i1 %cond, ptr %x) {
127; CHECK-LABEL: @test_ret_ptr(
128; CHECK-NEXT:  entry:
129; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], ptr [[X:%.*]], ptr null
130; CHECK-NEXT:    ret ptr [[SPEC_SELECT]]
131;
132entry:
133  br i1 %cond, label %bb1, label %bb2
134
135bb1:
136  br label %bb2
137
138bb2:
139  %r = phi ptr [ null, %entry ], [ %x, %bb1 ]
140  ret ptr %r
141}
142