diff options
author | Florian Hahn <florian.hahn@arm.com> | 2017-06-27 22:27:32 +0000 |
---|---|---|
committer | Florian Hahn <florian.hahn@arm.com> | 2017-06-27 22:27:32 +0000 |
commit | 2665febb54dc5381370ec42c12e29ba4fa545dbd (patch) | |
tree | 0f7e7942a567a4d4b7e8ff6421851833ab301273 /llvm/test/Transforms | |
parent | 2573a19fe6ef3a68d504aac8c887a77163ea9c74 (diff) | |
download | bcm5719-llvm-2665febb54dc5381370ec42c12e29ba4fa545dbd.tar.gz bcm5719-llvm-2665febb54dc5381370ec42c12e29ba4fa545dbd.zip |
[AArch64] Inline callee if its target-features are a subset of the caller
Summary:
Similar to X86, it should be safe to inline callees if their target-features
are a subset of the caller. This change matches GCC's inlining behavior
with respect to attributes [1].
[1] https://gcc.gnu.org/onlinedocs/gcc/AArch64-Function-Attributes.html#AArch64-Function-Attributes
Reviewers: kristof.beyls, javed.absar, rengolin, t.p.northover
Reviewed By: t.p.northover
Subscribers: aemerson, eraman, llvm-commits
Differential Revision: https://reviews.llvm.org/D34698
llvm-svn: 306478
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r-- | llvm/test/Transforms/Inline/AArch64/inline-target-attr.ll | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/test/Transforms/Inline/AArch64/inline-target-attr.ll b/llvm/test/Transforms/Inline/AArch64/inline-target-attr.ll new file mode 100644 index 00000000000..af87ff6e740 --- /dev/null +++ b/llvm/test/Transforms/Inline/AArch64/inline-target-attr.ll @@ -0,0 +1,40 @@ +; RUN: opt < %s -mtriple=aarch64-unknown-linux-gnu -S -inline | FileCheck %s +; RUN: opt < %s -mtriple=aarch64-unknown-linux-gnu -S -passes='cgscc(inline)' | FileCheck %s +; Check that we only inline when we have compatible target attributes. + +define i32 @foo() #0 { +entry: + %call = call i32 (...) @baz() + ret i32 %call +; CHECK-LABEL: foo +; CHECK: call i32 (...) @baz() +} +declare i32 @baz(...) #0 + +define i32 @bar() #1 { +entry: + %call = call i32 @foo() + ret i32 %call +; CHECK-LABEL: bar +; CHECK: call i32 (...) @baz() +} + +define i32 @qux() #0 { +entry: + %call = call i32 @bar() + ret i32 %call +; CHECK-LABEL: qux +; CHECK: call i32 @bar() +} + +define i32 @strict_align() #2 { +entry: + %call = call i32 @foo() + ret i32 %call +; CHECK-LABEL: strict_align +; CHECK: call i32 (...) @baz() +} + +attributes #0 = { "target-cpu"="generic" "target-features"="+crc,+neon" } +attributes #1 = { "target-cpu"="generic" "target-features"="+crc,+neon,+crypto" } +attributes #2 = { "target-cpu"="generic" "target-features"="+crc,+neon,+strict-align" } |