[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