summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/CodeExtractor
diff options
context:
space:
mode:
authorFlorian Hahn <florian.hahn@arm.com>2018-03-10 14:53:44 +0000
committerFlorian Hahn <florian.hahn@arm.com>2018-03-10 14:53:44 +0000
commita7dcfa746e8eab05e0750adc2c6dd1fabae5636d (patch)
tree8a48c67ed859c9c2486d6b2ad90954fa4478d0ac /llvm/test/Transforms/CodeExtractor
parentc181b127c0e33ac5bbdab559de0ad1e6383737b1 (diff)
downloadbcm5719-llvm-a7dcfa746e8eab05e0750adc2c6dd1fabae5636d.tar.gz
bcm5719-llvm-a7dcfa746e8eab05e0750adc2c6dd1fabae5636d.zip
[PartialInlining] Use isInlineViable to detect constructs preventing inlining.
Use isInlineViable to prevent inlining of functions with non-inlinable constructs, in case cost analysis is skipped. Reviewers: efriedma, sfertile, davide, davidxl Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D42846 llvm-svn: 327207
Diffstat (limited to 'llvm/test/Transforms/CodeExtractor')
-rw-r--r--llvm/test/Transforms/CodeExtractor/PartialInlineNotViable.ll63
1 files changed, 63 insertions, 0 deletions
diff --git a/llvm/test/Transforms/CodeExtractor/PartialInlineNotViable.ll b/llvm/test/Transforms/CodeExtractor/PartialInlineNotViable.ll
new file mode 100644
index 00000000000..010d677e5dc
--- /dev/null
+++ b/llvm/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
+}
+
OpenPOWER on IntegriCloud