ipa-inline: Add target info into fn summary [PR102059]
authorKewen Lin <linkw@linux.ibm.com>
Wed, 5 Jan 2022 02:27:18 +0000 (20:27 -0600)
committerKewen Lin <linkw@linux.ibm.com>
Wed, 5 Jan 2022 02:27:18 +0000 (20:27 -0600)
commit0fc60c183358be2f2003b94226ab49e21c585b13
tree67baf78775915c9046b8cea2d96a05731d114674
parenta0239f852591d368a42ce3b6c9f85cfba6a3aeff
ipa-inline: Add target info into fn summary [PR102059]

Power ISA 2.07 (Power8) introduces transactional memory
feature but ISA3.1 (Power10) removes it.  It exposes one
troublesome issue as PR102059 shows.  Users define some
function with target pragma cpu=power10 then it calls one
function with attribute always_inline which inherits
command line option -mcpu=power8 which enables HTM
implicitly.  The current isa_flags check doesn't allow this
inlining due to "target specific option mismatch" and error
mesasge is emitted.

Normally, the callee function isn't intended to exploit HTM
feature, but the default flag setting make it look it has.
As Richi raised in the PR, we have fp_expressions flag in
function summary, and allow us to check the function
actually contains any floating point expressions to avoid
overkill.  So this patch follows the similar idea but is
more target specific, for this rs6000 port specific
requirement on HTM feature check, we would like to check
rs6000 specific HTM built-in functions and inline assembly,
it allows targets to do their own customized checks and
updates.

It introduces two target hooks need_ipa_fn_target_info and
update_ipa_fn_target_info.  The former allows target to do
some previous check and decides to collect target specific
information for this function or not.  For some special
case, it can predict the analysis result and set it early
without any scannings.  The latter allows the
analyze_function_body to pass gimple stmts down just like
fp_expressions handlings, target can do its own tricks.
I put them together as one hook initially with one boolean
to indicate whether it's initial time, but the code looks a
bit ugly, to separate them seems to have better readability.

gcc/ChangeLog:

PR ipa/102059
* config/rs6000/rs6000.c (TARGET_NEED_IPA_FN_TARGET_INFO): New macro.
(TARGET_UPDATE_IPA_FN_TARGET_INFO): Likewise.
(rs6000_need_ipa_fn_target_info): New function.
(rs6000_update_ipa_fn_target_info): Likewise.
(rs6000_can_inline_p): Adjust for ipa function summary target info.
* config/rs6000/rs6000.h (RS6000_FN_TARGET_INFO_HTM): New macro.
* ipa-fnsummary.c (ipa_dump_fn_summary): Adjust for ipa function
summary target info.
(analyze_function_body): Adjust for ipa function summary target info
and call hook rs6000_need_ipa_fn_target_info and
rs6000_update_ipa_fn_target_info.
(ipa_merge_fn_summary_after_inlining): Adjust for ipa function summary
target info.
(inline_read_section): Likewise.
(ipa_fn_summary_write): Likewise.
* ipa-fnsummary.h (ipa_fn_summary::target_info): New member.
* doc/tm.texi: Regenerate.
* doc/tm.texi.in (TARGET_UPDATE_IPA_FN_TARGET_INFO): Document new hook.
(TARGET_NEED_IPA_FN_TARGET_INFO): Likewise.
* target.def (update_ipa_fn_target_info): New hook.
(need_ipa_fn_target_info): Likewise.
* targhooks.c (default_need_ipa_fn_target_info): New function.
(default_update_ipa_fn_target_info): Likewise.
* targhooks.h (default_update_ipa_fn_target_info): New declare.
(default_need_ipa_fn_target_info): Likewise.

gcc/testsuite/ChangeLog:

PR ipa/102059
* gcc.dg/lto/pr102059-1_0.c: New test.
* gcc.dg/lto/pr102059-1_1.c: New test.
* gcc.dg/lto/pr102059-1_2.c: New test.
* gcc.dg/lto/pr102059-2_0.c: New test.
* gcc.dg/lto/pr102059-2_1.c: New test.
* gcc.dg/lto/pr102059-2_2.c: New test.
* gcc.target/powerpc/pr102059-1.c: New test.
* gcc.target/powerpc/pr102059-2.c: New test.
* gcc.target/powerpc/pr102059-3.c: New test.
18 files changed:
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/ipa-fnsummary.c
gcc/ipa-fnsummary.h
gcc/target.def
gcc/targhooks.c
gcc/targhooks.h
gcc/testsuite/gcc.dg/lto/pr102059-1_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr102059-1_1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr102059-1_2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr102059-2_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr102059-2_1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr102059-2_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr102059-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr102059-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr102059-3.c [new file with mode: 0644]