[llvm] c79a671 - [Inline] Add test for PR52660 (NFC)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 20 03:59:23 PST 2021


Author: Nikita Popov
Date: 2021-12-20T12:59:12+01:00
New Revision: c79a671968288c433002864c9c98ababba956111

URL: https://github.com/llvm/llvm-project/commit/c79a671968288c433002864c9c98ababba956111
DIFF: https://github.com/llvm/llvm-project/commit/c79a671968288c433002864c9c98ababba956111.diff

LOG: [Inline] Add test for PR52660 (NFC)

Added: 
    llvm/test/Transforms/Inline/X86/call-abi-compatibility.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/Inline/X86/call-abi-compatibility.ll b/llvm/test/Transforms/Inline/X86/call-abi-compatibility.ll
new file mode 100644
index 0000000000000..0254de9df4119
--- /dev/null
+++ b/llvm/test/Transforms/Inline/X86/call-abi-compatibility.ll
@@ -0,0 +1,89 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
+; RUN: opt < %s -mtriple=x86_64-unknown-linux-gnu -S -inline | FileCheck %s
+
+; Test for PR52660.
+
+; This call should not get inlined, because it would make the callee_not_avx
+; call ABI incompatible.
+; TODO: Currently gets inlined.
+define void @caller_avx() "target-features"="+avx" {
+; CHECK-LABEL: define {{[^@]+}}@caller_avx
+; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @callee_not_avx(<4 x i64> <i64 0, i64 1, i64 2, i64 3>)
+; CHECK-NEXT:    ret void
+;
+  call void @caller_not_avx()
+  ret void
+}
+
+define internal void @caller_not_avx() {
+  call i64 @callee_not_avx(<4 x i64> <i64 0, i64 1, i64 2, i64 3>)
+  ret void
+}
+
+define i64 @callee_not_avx(<4 x i64> %arg) noinline {
+; CHECK-LABEL: define {{[^@]+}}@callee_not_avx
+; CHECK-SAME: (<4 x i64> [[ARG:%.*]]) #[[ATTR1:[0-9]+]] {
+; CHECK-NEXT:    [[V:%.*]] = extractelement <4 x i64> [[ARG]], i64 2
+; CHECK-NEXT:    ret i64 [[V]]
+;
+  %v = extractelement <4 x i64> %arg, i64 2
+  ret i64 %v
+}
+
+; This call also shouldn't be inlined, as we don't know whether callee_unknown
+; is ABI compatible or not.
+; TODO: Currently gets inlined.
+define void @caller_avx2() "target-features"="+avx" {
+; CHECK-LABEL: define {{[^@]+}}@caller_avx2
+; CHECK-SAME: () #[[ATTR0]] {
+; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @callee_unknown(<4 x i64> <i64 0, i64 1, i64 2, i64 3>)
+; CHECK-NEXT:    ret void
+;
+  call void @caller_not_avx2()
+  ret void
+}
+
+define internal void @caller_not_avx2() {
+  call i64 @callee_unknown(<4 x i64> <i64 0, i64 1, i64 2, i64 3>)
+  ret void
+}
+
+declare i64 @callee_unknown(<4 x i64>)
+
+; This call should get inlined, because we assume that intrinsics are always
+; ABI compatible.
+define void @caller_avx3() "target-features"="+avx" {
+; CHECK-LABEL: define {{[^@]+}}@caller_avx3
+; CHECK-SAME: () #[[ATTR0]] {
+; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.some_intrinsic(<4 x i64> <i64 0, i64 1, i64 2, i64 3>)
+; CHECK-NEXT:    ret void
+;
+  call void @caller_not_avx3()
+  ret void
+}
+
+define internal void @caller_not_avx3() {
+  call i64 @llvm.some_intrinsic(<4 x i64> <i64 0, i64 1, i64 2, i64 3>)
+  ret void
+}
+
+declare i64 @llvm.some_intrinsic(<4 x i64>)
+
+; This call should get inlined, because only simple types are involved.
+define void @caller_avx4() "target-features"="+avx" {
+; CHECK-LABEL: define {{[^@]+}}@caller_avx4
+; CHECK-SAME: () #[[ATTR0]] {
+; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @caller_unknown_simple(i64 0)
+; CHECK-NEXT:    ret void
+;
+  call void @caller_not_avx4()
+  ret void
+}
+
+define internal void @caller_not_avx4() {
+  call i64 @caller_unknown_simple(i64 0)
+  ret void
+}
+
+declare i64 @caller_unknown_simple(i64)


        


More information about the llvm-commits mailing list