Skip to content

Commit 2d90dea

Browse files
committed
[SimplifyCFG][swifterror] Don't sink calls with swifterror params
1 parent e1ea86e commit 2d90dea

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2208,13 +2208,18 @@ static bool canSinkInstructions(
22082208
if (!I->isSameOperationAs(I0, Instruction::CompareUsingIntersectedAttrs))
22092209
return false;
22102210

2211-
// swifterror pointers can only be used by a load or store; sinking a load
2212-
// or store would require introducing a select for the pointer operand,
2213-
// which isn't allowed for swifterror pointers.
2211+
// swifterror pointers can only be used by a load, store, or as a swifterror
2212+
// argument; sinking a load, store, or call would require introducing a
2213+
// select for the pointer operand, which isn't allowed for swifterror
2214+
// pointers.
22142215
if (isa<StoreInst>(I) && I->getOperand(1)->isSwiftError())
22152216
return false;
22162217
if (isa<LoadInst>(I) && I->getOperand(0)->isSwiftError())
22172218
return false;
2219+
if (const auto *CB = dyn_cast<CallBase>(I))
2220+
for (const Use &Arg : CB->args())
2221+
if (Arg->isSwiftError())
2222+
return false;
22182223

22192224
// Treat MMRAs conservatively. This pass can be quite aggressive and
22202225
// could drop a lot of MMRAs otherwise.

llvm/test/Transforms/SimplifyCFG/hoist-sink-swifterror-store.ll

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
declare void @clobber1()
55
declare void @clobber2()
6+
declare swiftcc void @swift_willThrow(ptr swifterror)
67

78
; Do not try to sink the stores to the exit block, as this requires introducing
89
; a select for the pointer operand. This is not allowed for swifterror pointers.
@@ -76,6 +77,22 @@ exit:
7677
; introduces a select for the pointer operand. This is not allowed for
7778
; swifterror pointers.
7879
define swiftcc ptr @sink_load(ptr %arg, ptr swifterror %arg1, i1 %c) {
80+
; CHECK-LABEL: define swiftcc ptr @sink_load
81+
; CHECK-SAME: (ptr [[ARG:%.*]], ptr swifterror [[ARG1:%.*]], i1 [[C:%.*]]) {
82+
; CHECK-NEXT: bb:
83+
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
84+
; CHECK: then:
85+
; CHECK-NEXT: call void @clobber1()
86+
; CHECK-NEXT: [[L1:%.*]] = load ptr, ptr [[ARG]], align 8
87+
; CHECK-NEXT: br label [[EXIT:%.*]]
88+
; CHECK: else:
89+
; CHECK-NEXT: call void @clobber2()
90+
; CHECK-NEXT: [[L2:%.*]] = load ptr, ptr [[ARG1]], align 8
91+
; CHECK-NEXT: br label [[EXIT]]
92+
; CHECK: exit:
93+
; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[L1]], [[THEN]] ], [ [[L2]], [[ELSE]] ]
94+
; CHECK-NEXT: ret ptr [[P]]
95+
;
7996
bb:
8097
br i1 %c, label %then, label %else
8198

@@ -127,3 +144,39 @@ exit:
127144
%p = phi ptr [ %l1, %then ], [ %l2, %else ]
128145
ret ptr %p
129146
}
147+
148+
149+
define swiftcc void @sink_call(i1 %c) {
150+
; CHECK-LABEL: define swiftcc void @sink_call
151+
; CHECK-SAME: (i1 [[C:%.*]]) {
152+
; CHECK-NEXT: [[TMP1:%.*]] = alloca swifterror ptr, align 8
153+
; CHECK-NEXT: [[TMP2:%.*]] = alloca swifterror ptr, align 8
154+
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
155+
; CHECK: then:
156+
; CHECK-NEXT: call void @clobber1()
157+
; CHECK-NEXT: call swiftcc void @swift_willThrow(ptr [[TMP2]])
158+
; CHECK-NEXT: br label [[EXIT:%.*]]
159+
; CHECK: else:
160+
; CHECK-NEXT: call void @clobber2()
161+
; CHECK-NEXT: call swiftcc void @swift_willThrow(ptr [[TMP1]])
162+
; CHECK-NEXT: br label [[EXIT]]
163+
; CHECK: exit:
164+
; CHECK-NEXT: ret void
165+
;
166+
%2 = alloca swifterror ptr, align 8
167+
%3 = alloca swifterror ptr, align 8
168+
br i1 %c, label %then, label %else
169+
170+
then:
171+
call void @clobber1()
172+
call swiftcc void @swift_willThrow(ptr %3)
173+
br label %exit
174+
175+
else:
176+
call void @clobber2()
177+
call swiftcc void @swift_willThrow(ptr %2)
178+
br label %exit
179+
180+
exit:
181+
ret void
182+
}

0 commit comments

Comments
 (0)