Skip to content

Commit ce62ee0

Browse files
committed
[SimplifyCFG][swifterror] Don't sink calls with swifterror params
1 parent 25fc52e commit ce62ee0

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
@@ -2190,13 +2190,18 @@ static bool canSinkInstructions(
21902190
if (!I->isSameOperationAs(I0, Instruction::CompareUsingIntersectedAttrs))
21912191
return false;
21922192

2193-
// swifterror pointers can only be used by a load or store; sinking a load
2194-
// or store would require introducing a select for the pointer operand,
2195-
// which isn't allowed for swifterror pointers.
2193+
// swifterror pointers can only be used by a load, store, or as a swifterror
2194+
// argument; sinking a load, store, or call would require introducing a
2195+
// select for the pointer operand, which isn't allowed for swifterror
2196+
// pointers.
21962197
if (isa<StoreInst>(I) && I->getOperand(1)->isSwiftError())
21972198
return false;
21982199
if (isa<LoadInst>(I) && I->getOperand(0)->isSwiftError())
21992200
return false;
2201+
if (const auto *CB = dyn_cast<CallBase>(I))
2202+
for (const Use &Arg : CB->args())
2203+
if (Arg->isSwiftError())
2204+
return false;
22002205

22012206
// Treat MMRAs conservatively. This pass can be quite aggressive and
22022207
// 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)