[PATCH] D121217: InstCombine: Can't fold a phi arg load into the phi if the load is from a swifterror address
Arnold Schwaighofer via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 8 07:30:31 PST 2022
aschwaighofer created this revision.
aschwaighofer added a reviewer: t.p.northover.
Herald added a subscriber: hiraditya.
Herald added a project: All.
aschwaighofer requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
`swifterror` addresses are only allowed as operands to load, store, and
calls.
The following transformation is not allowed. It would create a phi with a
`swifterror` address operand.
%addr = alloca swifterror i8*
br %cond, label %bb1, label %b22
bb1:
%val1 = load i8*, i8** %addr
br exit
bb2:
%val2 = load i8*, i8** %addr
br exit
exit:
%val = phi [%val1, %bb1] [%val2, %bb2]
>
=
%addr = alloca swifterror i8*
br %cond, label %bb1, label %b22
bb1:
br exit
bb2:
br exit
exit:
%val_addr = phi [%addr, %bb1] [%addr, %bb2]
%val2 = load i8*, i8** %val_addr
rdar://89865485
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D121217
Files:
llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
llvm/test/Transforms/InstCombine/phi-equal-incoming-pointers.ll
Index: llvm/test/Transforms/InstCombine/phi-equal-incoming-pointers.ll
===================================================================
--- llvm/test/Transforms/InstCombine/phi-equal-incoming-pointers.ll
+++ llvm/test/Transforms/InstCombine/phi-equal-incoming-pointers.ll
@@ -573,3 +573,44 @@
%res = select i1 %cond2, i8 %res.phi, i8 %res.load
ret i8 %res
}
+
+; `swifterror` addresses are restricted to load and stores and call arguments.
+declare void @takeAddress(i8** swifterror)
+
+define i8* @test_dont_optimize_swifterror(i1 %cond, i1 %cond2, i8* %ptr) {
+; INSTCOMBINE-LABEL: @test_dont_optimize_swifterror
+; INSTCOMBINE: entry:
+; INSTCOMBINE: br i1 %cond, label %bb1, label %bb2
+
+; INSTCOMBINE: bb1:
+; INSTCOMBINE: load i8*
+; INSTCOMBINE: br label %exit
+
+; INSTCOMBINE: bb2:
+; INSTCOMBINE: load i8*
+; INSTCOMBINE: br label %exit
+
+; INSTCOMBINE: exit:
+; INSTCOMBINE: ret
+entry:
+ %obj = alloca swifterror i8*, align 8
+ %obj2 = alloca swifterror i8*, align 8
+ call void @takeAddress(i8** swifterror %obj)
+ call void @takeAddress(i8** swifterror %obj2)
+ store i8* %ptr, i8** %obj, align 8
+ br i1 %cond, label %bb1, label %bb2
+
+bb1: ; preds = %entry
+ %res1 = load i8*, i8** %obj, align 8
+ br label %exit
+
+bb2: ; preds = %entry
+ %res2 = load i8*, i8** %obj2, align 8
+ br label %exit
+
+exit: ; preds = %bb2, %bb1
+ %res.phi = phi i8* [ %res1, %bb1 ], [ %res2, %bb2 ]
+ store i8* null, i8** %obj, align 8
+ %res = select i1 %cond2, i8* %res.phi, i8* null
+ ret i8* %res
+}
Index: llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
@@ -658,6 +658,10 @@
Instruction *InstCombinerImpl::foldPHIArgLoadIntoPHI(PHINode &PN) {
LoadInst *FirstLI = cast<LoadInst>(PN.getIncomingValue(0));
+ // Can't forward swifterror through a phi.
+ if (FirstLI->getOperand(0)->isSwiftError())
+ return nullptr;
+
// FIXME: This is overconservative; this transform is allowed in some cases
// for atomic operations.
if (FirstLI->isAtomic())
@@ -694,6 +698,10 @@
LI->getPointerAddressSpace() != LoadAddrSpace)
return nullptr;
+ // Can't forward swifterror through a phi.
+ if (LI->getOperand(0)->isSwiftError())
+ return nullptr;
+
// We can't sink the load if the loaded value could be modified between
// the load and the PHI.
if (LI->getParent() != InBB || !isSafeAndProfitableToSinkLoad(LI))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D121217.413802.patch
Type: text/x-patch
Size: 2712 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220308/17ee6aad/attachment.bin>
More information about the llvm-commits
mailing list