[PATCH] D117509: [PartialInline] Bail out on asm-goto/callbr

Wenlei He via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 19 10:33:37 PST 2022


wenlei added inline comments.


================
Comment at: llvm/lib/Transforms/IPO/PartialInlining.cpp:1420
+    // Don't bother with BlockAddress used by CallBr for asm goto.
+    if (isa<BlockAddress>(User))
+      continue;
----------------
hoy wrote:
> davidxl wrote:
> > wenlei wrote:
> > > hoy wrote:
> > > > davidxl wrote:
> > > > > hoy wrote:
> > > > > > davidxl wrote:
> > > > > > > Is it legal to partial inline in case when the function's block address is taken?
> > > > > > I think so. The non-inlined callsites will still call the original version, while the inlined callsites will pull in the new version. The new version has some context-irrelevant code outlined, but both versions should be semantically equal. Please correct me if I'm missing anything?
> > > > > what if the labels and references from asm goto are in different regions -- one in inlined region, and the other in the outllined region?
> > > > If internal blocks of an inlinee are address taken, the inlining should be disabled during the cost analysis: https://github.com/llvm/llvm-project/blob/main/llvm/lib/Analysis/InlineCost.cpp#L2656
> > > > 
> > > > what if the labels and references from asm goto are in different regions -- one in inlined region, and the other in the outllined region? 
> > > 
> > > Is this concerning side entrance into the outlined region through asm goto? The outlining for partial inline requires single entry single exit region, so asm goto should not introduce side entrance. 
> > > 
> > > > If internal blocks of an inlinee are address taken, the inlining should be disabled during the cost analysis: https://github.com/llvm/llvm-project/blob/main/llvm/lib/Analysis/InlineCost.cpp#L2656
> > > 
> > > The code you linked still allow callbr/asm-goto, it disables inlining if address taken blocks are used outside of asm-goto.
> > In general, the legality check should be done earlier otherwise we may end up with situation where function outlining happens but partial inlining is disabled -- resulting in less efficient code.  
> > 
> > However as Wenlei mentioned, cross region jumps may not be an issue.
> > The code you linked still allow callbr/asm-goto, it disables inlining if address taken blocks are used outside of asm-goto.
> 
> Is asm-goto equivalent to callbr? I thought callbr can only deal with function entry but not internal blocks.
>> The code you linked still allow callbr/asm-goto, it disables inlining if address taken blocks are used outside of asm-goto.
> Is asm-goto equivalent to callbr? I thought callbr can only deal with function entry but not internal blocks. 

The only use of callbr is for asm-goto, so yes in practice they're equivalent. 

But the code you linked only bails out when the use of block address is *not* callbr. So it doesn't block callbr, which means this statement below isn't true.

> If internal blocks of an inlinee are address taken, the inlining should be disabled during the cost analysis

```
if (BB->hasAddressTaken())
      for (User *U : BlockAddress::get(&*BB)->users())
        if (!isa<CallBrInst>(*U))
          return InlineResult::failure("blockaddress used outside of callbr");
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D117509/new/

https://reviews.llvm.org/D117509



More information about the llvm-commits mailing list