Skip to content

Commit 0db24ce

Browse files
committed
move logic to canReplaceOperandWithVariable
1 parent ce62ee0 commit 0db24ce

File tree

3 files changed

+52
-18
lines changed

3 files changed

+52
-18
lines changed

llvm/lib/Transforms/Utils/Local.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4224,6 +4224,14 @@ bool llvm::canReplaceOperandWithVariable(const Instruction *I, unsigned OpIdx) {
42244224
if (I->getOperand(OpIdx)->getType()->isMetadataTy())
42254225
return false;
42264226

4227+
// swifterror pointers can only be used by a load, store, or as a swifterror
4228+
// argument; swifterror pointers are not allowed to be used in select or phi
4229+
// instructions.
4230+
if ((OpIdx == 1 && isa<StoreInst>(I)) || (OpIdx == 0 && isa<LoadInst>(I)) ||
4231+
(OpIdx < I->getNumOperands() && isa<CallBase>(I)))
4232+
if (I->getOperand(OpIdx)->isSwiftError())
4233+
return false;
4234+
42274235
// Early exit.
42284236
if (!isa<Constant>(I->getOperand(OpIdx)))
42294237
return true;

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,19 +2190,6 @@ static bool canSinkInstructions(
21902190
if (!I->isSameOperationAs(I0, Instruction::CompareUsingIntersectedAttrs))
21912191
return false;
21922192

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.
2197-
if (isa<StoreInst>(I) && I->getOperand(1)->isSwiftError())
2198-
return false;
2199-
if (isa<LoadInst>(I) && I->getOperand(0)->isSwiftError())
2200-
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;
2205-
22062193
// Treat MMRAs conservatively. This pass can be quite aggressive and
22072194
// could drop a lot of MMRAs otherwise.
22082195
if (MMRAMetadata(*I) != I0MMRA)

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

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
declare void @clobber1()
55
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)
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

170171
then:
171172
call void @clobber1()
172-
call swiftcc void @swift_willThrow(ptr %3)
173+
call swiftcc void @foo(ptr %3)
173174
br label %exit
174175

175176
else:
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

180219
exit:

0 commit comments

Comments
 (0)