summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/GlobalOpt
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2018-08-09 17:29:26 +0000
committerReid Kleckner <rnk@google.com>2018-08-09 17:29:26 +0000
commit80c6ec11d9a32a6c34adf478a91ab7d794cdba10 (patch)
treeec7f2d021e61b0acb81f9e32c0600043acd22707 /llvm/test/Transforms/GlobalOpt
parent15d1501aaefc0d8c86bf90e0abe6cb8d315031f2 (diff)
downloadbcm5719-llvm-80c6ec11d9a32a6c34adf478a91ab7d794cdba10.tar.gz
bcm5719-llvm-80c6ec11d9a32a6c34adf478a91ab7d794cdba10.zip
[GlobalOpt] Don't apply fastcc if it would break inalloca invariants
The inalloca parameter has to be the only parameter passed in memory. Changing the convention to fastcc can break that. At some point we should teach global opt how to optimize ABI attributes like inalloca and maybe byval. These attributes are mainly used to match C ABIs. They are harder for LLVM to optimize and they don't always generate the best code. Fixes PR38487 llvm-svn: 339360
Diffstat (limited to 'llvm/test/Transforms/GlobalOpt')
-rw-r--r--llvm/test/Transforms/GlobalOpt/fastcc.ll9
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/test/Transforms/GlobalOpt/fastcc.ll b/llvm/test/Transforms/GlobalOpt/fastcc.ll
index 26398d2bb90..64c4a268ff3 100644
--- a/llvm/test/Transforms/GlobalOpt/fastcc.ll
+++ b/llvm/test/Transforms/GlobalOpt/fastcc.ll
@@ -26,12 +26,20 @@ define internal i32 @j(i32* %m) {
ret i32 %v
}
+define internal i32 @inalloca(i32* inalloca %p) {
+; CHECK-LABEL: define internal i32 @inalloca(i32* inalloca %p)
+ %rv = load i32, i32* %p
+ ret i32 %rv
+}
+
define void @call_things() {
%m = alloca i32
call i32 @f(i32* %m)
call x86_thiscallcc i32 @g(i32* %m)
call coldcc i32 @h(i32* %m)
call i32 @j(i32* %m)
+ %args = alloca inalloca i32
+ call i32 @inalloca(i32* inalloca %args)
ret void
}
@@ -44,3 +52,4 @@ define void @call_things() {
; CHECK: call fastcc i32 @g
; CHECK: call coldcc i32 @h
; CHECK: call i32 @j
+; CHECK: call i32 @inalloca(i32* inalloca %args)
OpenPOWER on IntegriCloud