33
44declare void @clobber1 ()
55declare 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 )
78
89; Do not try to sink the stores to the exit block, as this requires introducing
910; a select for the pointer operand. This is not allowed for swifterror pointers.
@@ -154,11 +155,11 @@ define swiftcc void @sink_call(i1 %c) {
154155; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
155156; CHECK: then:
156157; CHECK-NEXT: call void @clobber1()
157- ; CHECK-NEXT: call swiftcc void @swift_willThrow (ptr [[TMP2]])
158+ ; CHECK-NEXT: call swiftcc void @foo (ptr [[TMP2]])
158159; CHECK-NEXT: br label [[EXIT:%.*]]
159160; CHECK: else:
160161; CHECK-NEXT: call void @clobber2()
161- ; CHECK-NEXT: call swiftcc void @swift_willThrow (ptr [[TMP1]])
162+ ; CHECK-NEXT: call swiftcc void @foo (ptr [[TMP1]])
162163; CHECK-NEXT: br label [[EXIT]]
163164; CHECK: exit:
164165; CHECK-NEXT: ret void
@@ -169,12 +170,50 @@ define swiftcc void @sink_call(i1 %c) {
169170
170171then:
171172 call void @clobber1 ()
172- call swiftcc void @swift_willThrow (ptr %3 )
173+ call swiftcc void @foo (ptr %3 )
173174 br label %exit
174175
175176else:
176177 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 )
178217 br label %exit
179218
180219exit:
0 commit comments