]> git.ipfire.org Git - thirdparty/gcc.git/commit
aarch64: Enforce inlining restrictions for SME
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 5 Dec 2023 10:11:30 +0000 (10:11 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 5 Dec 2023 10:11:30 +0000 (10:11 +0000)
commit0e9aa05df6c643610a3821af52eda642a525a886
treea25d0425b3d3d98e1201ab5ddcfcc1025bb57716
parent275706fc59b5fdcc26d46d9f19951fc86b40c515
aarch64: Enforce inlining restrictions for SME

A function that has local ZA state cannot be inlined into its caller,
since we only support managing ZA switches at function scope.

A function whose body directly clobbers ZA state cannot be inlined into
a function with ZA state.

A function whose body requires a particular PSTATE.SM setting can only
be inlined into a function body that guarantees that PSTATE.SM setting.
The callee's function type doesn't matter here: one locally-streaming
function can be inlined into another.

gcc/
* config/aarch64/aarch64.cc: Include symbol-summary.h, ipa-prop.h,
and ipa-fnsummary.h
(aarch64_function_attribute_inlinable_p): New function.
(AARCH64_IPA_SM_FIXED, AARCH64_IPA_CLOBBERS_ZA): New constants.
(aarch64_need_ipa_fn_target_info): New function.
(aarch64_update_ipa_fn_target_info): Likewise.
(aarch64_can_inline_p): Restrict the previous ISA flag checks
to non-modal features.  Prevent callees that require a particular
PSTATE.SM state from being inlined into callers that can't guarantee
that state.  Also prevent callees that have ZA state from being
inlined into callers that don't.  Finally, prevent callees that
clobber ZA from being inlined into callers that have ZA state.
(TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P): Define.
(TARGET_NEED_IPA_FN_TARGET_INFO): Likewise.
(TARGET_UPDATE_IPA_FN_TARGET_INFO): Likewise.

gcc/testsuite/
* gcc.target/aarch64/sme/inlining_1.c: New test.
* gcc.target/aarch64/sme/inlining_2.c: Likewise.
* gcc.target/aarch64/sme/inlining_3.c: Likewise.
* gcc.target/aarch64/sme/inlining_4.c: Likewise.
* gcc.target/aarch64/sme/inlining_5.c: Likewise.
* gcc.target/aarch64/sme/inlining_6.c: Likewise.
* gcc.target/aarch64/sme/inlining_7.c: Likewise.
* gcc.target/aarch64/sme/inlining_8.c: Likewise.
16 files changed:
gcc/config/aarch64/aarch64.cc
gcc/testsuite/gcc.target/aarch64/sme/inlining_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_15.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/inlining_9.c [new file with mode: 0644]