3
3
4
4
declare void @clobber1 ()
5
5
declare void @clobber2 ()
6
- declare swiftcc void @swift_willThrow (ptr swifterror )
6
+ declare swiftcc void @foo (ptr swifterror )
7
+ declare swiftcc void @bar (ptr swifterror , ptr )
7
8
8
9
; Do not try to sink the stores to the exit block, as this requires introducing
9
10
; a select for the pointer operand. This is not allowed for swifterror pointers.
@@ -154,11 +155,11 @@ define swiftcc void @sink_call(i1 %c) {
154
155
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
155
156
; CHECK: then:
156
157
; CHECK-NEXT: call void @clobber1()
157
- ; CHECK-NEXT: call swiftcc void @swift_willThrow (ptr [[TMP2]])
158
+ ; CHECK-NEXT: call swiftcc void @foo (ptr [[TMP2]])
158
159
; CHECK-NEXT: br label [[EXIT:%.*]]
159
160
; CHECK: else:
160
161
; CHECK-NEXT: call void @clobber2()
161
- ; CHECK-NEXT: call swiftcc void @swift_willThrow (ptr [[TMP1]])
162
+ ; CHECK-NEXT: call swiftcc void @foo (ptr [[TMP1]])
162
163
; CHECK-NEXT: br label [[EXIT]]
163
164
; CHECK: exit:
164
165
; CHECK-NEXT: ret void
@@ -169,12 +170,50 @@ define swiftcc void @sink_call(i1 %c) {
169
170
170
171
then:
171
172
call void @clobber1 ()
172
- call swiftcc void @swift_willThrow (ptr %3 )
173
+ call swiftcc void @foo (ptr %3 )
173
174
br label %exit
174
175
175
176
else:
176
177
call void @clobber2 ()
177
- call swiftcc void @swift_willThrow (ptr %2 )
178
+ call swiftcc void @foo (ptr %2 )
179
+ br label %exit
180
+
181
+ exit:
182
+ ret void
183
+ }
184
+
185
+
186
+ define swiftcc void @safe_sink_call (i1 %c ) {
187
+ ; CHECK-LABEL: define swiftcc void @safe_sink_call
188
+ ; CHECK-SAME: (i1 [[C:%.*]]) {
189
+ ; CHECK-NEXT: [[ERR:%.*]] = alloca swifterror ptr, align 8
190
+ ; CHECK-NEXT: [[A:%.*]] = alloca ptr, align 8
191
+ ; CHECK-NEXT: [[B:%.*]] = alloca ptr, align 8
192
+ ; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
193
+ ; CHECK: then:
194
+ ; CHECK-NEXT: call void @clobber1()
195
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
196
+ ; CHECK: else:
197
+ ; CHECK-NEXT: call void @clobber2()
198
+ ; CHECK-NEXT: br label [[EXIT]]
199
+ ; CHECK: exit:
200
+ ; CHECK-NEXT: [[B_SINK:%.*]] = phi ptr [ [[B]], [[ELSE]] ], [ [[A]], [[THEN]] ]
201
+ ; CHECK-NEXT: call swiftcc void @bar(ptr [[ERR]], ptr [[B_SINK]])
202
+ ; CHECK-NEXT: ret void
203
+ ;
204
+ %err = alloca swifterror ptr , align 8
205
+ %a = alloca ptr , align 8
206
+ %b = alloca ptr , align 8
207
+ br i1 %c , label %then , label %else
208
+
209
+ then:
210
+ call void @clobber1 ()
211
+ call swiftcc void @bar (ptr %err , ptr %a )
212
+ br label %exit
213
+
214
+ else:
215
+ call void @clobber2 ()
216
+ call swiftcc void @bar (ptr %err , ptr %b )
178
217
br label %exit
179
218
180
219
exit:
0 commit comments