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