@@ -57,3 +57,141 @@ bb50: ; preds = %bb43
57
57
bb53: ; preds = %bb53, %bb50, %bb22, %bb
58
58
br label %bb53
59
59
}
60
+
61
+ declare void @exit ()
62
+
63
+ define void @unreachable_exit_with_no_call (i64* noalias %ptr , i1 %c.1 ) {
64
+ ; CHECK-LABEL: @unreachable_exit_with_no_call(
65
+ ; CHECK-NEXT: entry:
66
+ ; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
67
+ ; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
68
+ ; CHECK: if.then:
69
+ ; CHECK-NEXT: unreachable
70
+ ; CHECK: if.end:
71
+ ; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
72
+ ; CHECK-NEXT: ret void
73
+ ;
74
+ entry:
75
+ store i64 1 , i64* %ptr , align 8
76
+ br i1 %c.1 , label %if.then , label %if.end
77
+
78
+ if.then:
79
+ unreachable
80
+
81
+ if.end:
82
+ store i64 0 , i64* %ptr , align 8
83
+ ret void
84
+ }
85
+
86
+ ; Test for PR53800.
87
+ define void @unreachable_exit_with_nounwind_call_pr53800 (i64* noalias %ptr , i1 %c.1 ) {
88
+ ; CHECK-LABEL: @unreachable_exit_with_nounwind_call_pr53800(
89
+ ; CHECK-NEXT: entry:
90
+ ; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
91
+ ; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
92
+ ; CHECK: if.then:
93
+ ; CHECK-NEXT: tail call void @exit() #[[ATTR0:[0-9]+]]
94
+ ; CHECK-NEXT: unreachable
95
+ ; CHECK: if.end:
96
+ ; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
97
+ ; CHECK-NEXT: ret void
98
+ ;
99
+ entry:
100
+ store i64 1 , i64* %ptr , align 8
101
+ br i1 %c.1 , label %if.then , label %if.end
102
+
103
+ if.then:
104
+ tail call void @exit () nounwind
105
+ unreachable
106
+
107
+ if.end:
108
+ store i64 0 , i64* %ptr , align 8
109
+ ret void
110
+ }
111
+
112
+ ; The call @exit may read %ptr as it is not marked as noalias
113
+ define void @unreachable_exit_and_call_may_read (i64* %ptr , i1 %c.1 ) {
114
+ ; CHECK-LABEL: @unreachable_exit_and_call_may_read(
115
+ ; CHECK-NEXT: entry:
116
+ ; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
117
+ ; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
118
+ ; CHECK: if.then:
119
+ ; CHECK-NEXT: tail call void @exit() #[[ATTR0]]
120
+ ; CHECK-NEXT: unreachable
121
+ ; CHECK: if.end:
122
+ ; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
123
+ ; CHECK-NEXT: ret void
124
+ ;
125
+ entry:
126
+ store i64 1 , i64* %ptr , align 8
127
+ br i1 %c.1 , label %if.then , label %if.end
128
+
129
+ if.then:
130
+ tail call void @exit () nounwind
131
+ unreachable
132
+
133
+ if.end:
134
+ store i64 0 , i64* %ptr , align 8
135
+ ret void
136
+ }
137
+
138
+ define void @unreachable_exit_with_may_unwind_call (i64* noalias %ptr , i1 %c.1 ) {
139
+ ; CHECK-LABEL: @unreachable_exit_with_may_unwind_call(
140
+ ; CHECK-NEXT: entry:
141
+ ; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
142
+ ; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
143
+ ; CHECK: if.then:
144
+ ; CHECK-NEXT: tail call void @exit()
145
+ ; CHECK-NEXT: unreachable
146
+ ; CHECK: if.end:
147
+ ; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
148
+ ; CHECK-NEXT: ret void
149
+ ;
150
+ entry:
151
+ store i64 1 , i64* %ptr , align 8
152
+ br i1 %c.1 , label %if.then , label %if.end
153
+
154
+ if.then:
155
+ tail call void @exit ()
156
+ unreachable
157
+
158
+ if.end:
159
+ store i64 0 , i64* %ptr , align 8
160
+ ret void
161
+ }
162
+
163
+ ; Cannot remove the store in entry, because it is not dead on the path to e.1
164
+ define void @unreachable_exit_but_another_exit (i64* noalias %ptr , i1 %c.1 , i32 %s , i1 %c.2 ) {
165
+ ; CHECK-LABEL: @unreachable_exit_but_another_exit(
166
+ ; CHECK-NEXT: entry:
167
+ ; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
168
+ ; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
169
+ ; CHECK: if.then:
170
+ ; CHECK-NEXT: br i1 [[C_2:%.*]], label [[E_0:%.*]], label [[E_1:%.*]]
171
+ ; CHECK: e.0:
172
+ ; CHECK-NEXT: tail call void @exit() #[[ATTR0]]
173
+ ; CHECK-NEXT: unreachable
174
+ ; CHECK: e.1:
175
+ ; CHECK-NEXT: ret void
176
+ ; CHECK: if.end:
177
+ ; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
178
+ ; CHECK-NEXT: ret void
179
+ ;
180
+ entry:
181
+ store i64 1 , i64* %ptr , align 8
182
+ br i1 %c.1 , label %if.then , label %if.end
183
+
184
+ if.then:
185
+ br i1 %c.2 , label %e.0 , label %e.1
186
+
187
+ e.0 :
188
+ tail call void @exit () nounwind
189
+ unreachable
190
+
191
+ e.1 :
192
+ ret void
193
+
194
+ if.end:
195
+ store i64 0 , i64* %ptr , align 8
196
+ ret void
197
+ }
0 commit comments