diff options
author | Florian Hahn <florian.hahn@arm.com> | 2018-03-10 14:53:44 +0000 |
---|---|---|
committer | Florian Hahn <florian.hahn@arm.com> | 2018-03-10 14:53:44 +0000 |
commit | a7dcfa746e8eab05e0750adc2c6dd1fabae5636d (patch) | |
tree | 8a48c67ed859c9c2486d6b2ad90954fa4478d0ac /llvm/test/Transforms/CodeExtractor | |
parent | c181b127c0e33ac5bbdab559de0ad1e6383737b1 (diff) | |
download | bcm5719-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.ll | 63 |
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 +} + |