[PATCH] D42846: [PartialInlining] Use isInlineViable to detect constructs preventing inlining.

Florian Hahn via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 2 07:20:08 PST 2018


fhahn updated this revision to Diff 136746.
fhahn edited the summary of this revision.
fhahn added a comment.

Update to use isInlineViable only when cost analysis is skipped.

> I think CodeExtractor is not only used to extract code for partial inlining, but also used by LoopExtractor. I suppose this is why they do not check the same thing, but I think it would make sense to check for non-inlinable blocks in CodeExtractor too. Maybe we should add an isInlineableBlock function and use them in isBlockValidForExtraction?

After having another look, the difference between isBlockValidForExtraction and isInlineViable is that isBlockValidForExtraction checks loops that are going to be outlined, rather than inlined.


https://reviews.llvm.org/D42846

Files:
  lib/Transforms/IPO/PartialInlining.cpp
  test/Transforms/CodeExtractor/PartialInlineNotViable.ll


Index: test/Transforms/CodeExtractor/PartialInlineNotViable.ll
===================================================================
--- /dev/null
+++ test/Transforms/CodeExtractor/PartialInlineNotViable.ll
@@ -0,0 +1,63 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck %s
+;
+
+define i32 @callee_indr_branch(i32 %v) {
+entry:
+  %cmp = icmp sgt i32 %v, 2000
+  %addr = select i1 %cmp, i8* blockaddress(@callee_indr_branch, %if.then), i8* blockaddress(@callee_indr_branch, %if.end)
+  indirectbr i8* %addr, [ label %if.then, label %if.end]
+
+if.then:                                          ; preds = %entry
+  %mul = mul nsw i32 %v, 10
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %entry
+  %v2 = phi i32 [ %v, %entry ], [ %mul, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+
+declare void @use_fp(i8 *)
+declare void @llvm.localescape(...)
+declare i8* @llvm.frameaddress(i32)
+declare i8* @llvm.localrecover(i8*, i8*, i32)
+
+
+
+define i32 @callee_frameescape(i32 %v) {
+entry:
+  %a = alloca i32
+  call void (...) @llvm.localescape(i32* %a)
+  %cmp = icmp sgt i32 %v, 2000
+  br i1 %cmp, label %if.then, label %if.end
+
+if.then:                                          ; preds = %entry
+  %mul = mul nsw i32 %v, 10
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %entry
+  %v2 = phi i32 [ %v, %entry ], [ %mul, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+
+
+; CHECK-LABEL: @caller
+; CHECK: %r1 = call i32 @callee_indr_branch(i32 %v)
+; CHECK-NEXT: %r2 = call i32 @callee_frameescape(i32 %v)
+define i32 @caller(i32 %v) {
+entry:
+  %r1 = call i32 @callee_indr_branch(i32 %v)
+  %r2 = call i32 @callee_frameescape(i32 %v)
+  %res = add i32 %r1, %r2
+  ret i32 %res
+}
+
Index: lib/Transforms/IPO/PartialInlining.cpp
===================================================================
--- lib/Transforms/IPO/PartialInlining.cpp
+++ lib/Transforms/IPO/PartialInlining.cpp
@@ -769,13 +769,13 @@
     BlockFrequency WeightedOutliningRcost) {
   using namespace ore;
 
-  if (SkipCostAnalysis)
-    return true;
-
   Instruction *Call = CS.getInstruction();
   Function *Callee = CS.getCalledFunction();
   assert(Callee == Cloner.ClonedFunc);
 
+  if (SkipCostAnalysis)
+    return isInlineViable(*Callee);
+
   Function *Caller = CS.getCaller();
   auto &CalleeTTI = (*GetTTI)(*Callee);
   auto &ORE = (*GetORE)(*Caller);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42846.136746.patch
Type: text/x-patch
Size: 2618 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180302/6d0b721d/attachment.bin>


More information about the llvm-commits mailing list