[PATCH] D58260: [INLINER] allow inlining of address taken blocks
Nick Desaulniers via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 6 16:50:04 PST 2019
nickdesaulniers updated this revision to Diff 189619.
nickdesaulniers added a comment.
- undo one missed part from v1
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D58260/new/
https://reviews.llvm.org/D58260
Files:
llvm/lib/Analysis/InlineCost.cpp
llvm/test/Transforms/Inline/callbr.ll
Index: llvm/test/Transforms/Inline/callbr.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/Inline/callbr.ll
@@ -0,0 +1,54 @@
+; RUN: opt -inline -S < %s | FileCheck %s
+; RUN: opt -passes='cgscc(inline)' -S < %s | FileCheck %s
+
+define dso_local i32 @main() #0 {
+ %1 = alloca i32, align 4
+ store i32 0, i32* %1, align 4
+ %2 = call i32 @t32(i32 0)
+ ret i32 %2
+}
+
+define internal i32 @t32(i32) #0 {
+ %2 = alloca i32, align 4
+ %3 = alloca i32, align 4
+ store i32 %0, i32* %3, align 4
+ %4 = load i32, i32* %3, align 4
+ callbr void asm sideeffect "testl $0, $0; jne ${1:l};", "r,X,X,~{dirflag},~{fpsr},~{flags}"(i32 %4, i8* blockaddress(@t32, %7), i8* blockaddress(@t32, %6)) #1
+ to label %5 [label %7, label %6]
+
+; <label>:5: ; preds = %1
+ store i32 0, i32* %2, align 4
+ br label %8
+
+; <label>:6: ; preds = %1
+ store i32 1, i32* %2, align 4
+ br label %8
+
+; <label>:7: ; preds = %1
+ store i32 2, i32* %2, align 4
+ br label %8
+
+; <label>:8: ; preds = %7, %6, %5
+ %9 = load i32, i32* %2, align 4
+ ret i32 %9
+}
+
+; Check that @t32 no longer exists after inlining, as it has now been inlined
+; into @main.
+
+; CHECK-NOT: @t32
+; CHECK: define dso_local i32 @main
+; CHECK: callbr void asm sideeffect "testl $0, $0; jne ${1:l};", "r,X,X,~{dirflag},~{fpsr},~{flags}"(i32 %6, i8* blockaddress(@main, %9), i8* blockaddress(@main, %8))
+; CHECK: to label %7 [label %9, label %8]
+; CHECK: <label>:7:
+; CHECK-NEXT: store i32 0, i32* %1, align 4
+; CHECK-NEXT: br label %t32.exit
+; CHECK: <label>:8:
+; CHECK-NEXT: store i32 1, i32* %1, align 4
+; CHECK-NEXT: br label %t32.exit
+; CHECK: <label>:9:
+; CHECK-NEXT: store i32 2, i32* %1, align 4
+; CHECK-NEXT: br label %t32.exit
+; CHECK: t32.exit:
+; CHECK-NEXT: %10 = load i32, i32* %1, align 4
+; CHECK: ret i32 %10
Index: llvm/lib/Analysis/InlineCost.cpp
===================================================================
--- llvm/lib/Analysis/InlineCost.cpp
+++ llvm/lib/Analysis/InlineCost.cpp
@@ -1826,15 +1826,6 @@
if (BB->empty())
continue;
- // Disallow inlining a blockaddress. A blockaddress only has defined
- // behavior for an indirect branch in the same function, and we do not
- // currently support inlining indirect branches. But, the inliner may not
- // see an indirect branch that ends up being dead code at a particular call
- // site. If the blockaddress escapes the function, e.g., via a global
- // variable, inlining may lead to an invalid cross-function reference.
- if (BB->hasAddressTaken())
- return "blockaddress";
-
// Analyze the cost of this block. If we blow through the threshold, this
// returns false, and we can bail on out.
InlineResult IR = analyzeBlock(BB, EphValues);
@@ -2082,9 +2073,6 @@
if (isa<IndirectBrInst>(BI->getTerminator()))
return "contains indirect branches";
- if (BI->hasAddressTaken())
- return "uses block address";
-
for (auto &II : *BI) {
CallSite CS(&II);
if (!CS)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58260.189619.patch
Type: text/x-patch
Size: 3231 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190307/c13ce9cd/attachment.bin>
More information about the llvm-commits
mailing list