From: Bill Schmidt <wschmidt@linux.ibm.com>
To: "Kewen.Lin" <linkw@linux.ibm.com>, GCC Patches <gcc-patches@gcc.gnu.org>
Cc: "Richard Biener" <richard.guenther@gmail.com>,
"Jan Hubicka" <hubicka@ucw.cz>, "Martin Liška" <mliska@suse.cz>,
"Segher Boessenkool" <segher@kernel.crashing.org>,
fweimer@redhat.com, mjambor@suse.cz
Subject: Re: [PATCH v2] ipa-inline: Add target info into fn summary [PR102059]
Date: Sun, 12 Sep 2021 11:34:50 -0500 [thread overview]
Message-ID: <e96e5150-3f1b-55c5-6326-63ad12f08e9a@linux.ibm.com> (raw)
In-Reply-To: <0d10e5a2-a966-3b26-2e59-b6fd98d703a2@linux.ibm.com>
Hi Kewen,
I'll leave the continued review of the back-end parts of this to Segher,
but I do have one long-term comment. The rs6000_builtin_info[code].mask
field that you're relying on is going away as part of the built-in
function rewrite. There will be a "bifattrs" field that replaces this
in the table-driven data structures. I'm including those below. Please
think about whether what you're building will easily translate to using
these data structures in the near future. I don't think there are any
show-stoppers here, but if the new table needs adjustment to make your
changes easier, let's discuss.
Thanks,
Bill
#define PPC_MAXRESTROPNDS 3
struct GTY((user)) bifdata
{
const char *bifname;
bif_enable enable;
tree fntype;
insn_code icode;
int nargs;
int bifattrs;
int restr_opnd[PPC_MAXRESTROPNDS];
restriction restr[PPC_MAXRESTROPNDS];
int restr_val1[PPC_MAXRESTROPNDS];
int restr_val2[PPC_MAXRESTROPNDS];
const char *attr_string;
rs6000_gen_builtins assoc_bif;
};
#define bif_init_bit (0x00000001)
#define bif_set_bit (0x00000002)
#define bif_extract_bit (0x00000004)
#define bif_nosoft_bit (0x00000008)
#define bif_ldvec_bit (0x00000010)
#define bif_stvec_bit (0x00000020)
#define bif_reve_bit (0x00000040)
#define bif_pred_bit (0x00000080)
#define bif_htm_bit (0x00000100)
#define bif_htmspr_bit (0x00000200)
#define bif_htmcr_bit (0x00000400)
#define bif_mma_bit (0x00000800)
#define bif_quad_bit (0x00001000)
#define bif_pair_bit (0x00002000)
#define bif_mmaint_bit (0x00004000)
#define bif_no32bit_bit (0x00008000)
#define bif_32bit_bit (0x00010000)
#define bif_cpu_bit (0x00020000)
#define bif_ldstmask_bit (0x00040000)
#define bif_lxvrse_bit (0x00080000)
#define bif_lxvrze_bit (0x00100000)
#define bif_endian_bit (0x00200000)
#define bif_is_init(x) ((x).bifattrs & bif_init_bit)
#define bif_is_set(x) ((x).bifattrs & bif_set_bit)
#define bif_is_extract(x) ((x).bifattrs & bif_extract_bit)
#define bif_is_nosoft(x) ((x).bifattrs & bif_nosoft_bit)
#define bif_is_ldvec(x) ((x).bifattrs & bif_ldvec_bit)
#define bif_is_stvec(x) ((x).bifattrs & bif_stvec_bit)
#define bif_is_reve(x) ((x).bifattrs & bif_reve_bit)
#define bif_is_predicate(x) ((x).bifattrs & bif_pred_bit)
#define bif_is_htm(x) ((x).bifattrs & bif_htm_bit)
#define bif_is_htmspr(x) ((x).bifattrs & bif_htmspr_bit)
#define bif_is_htmcr(x) ((x).bifattrs & bif_htmcr_bit)
#define bif_is_mma(x) ((x).bifattrs & bif_mma_bit)
#define bif_is_quad(x) ((x).bifattrs & bif_quad_bit)
#define bif_is_pair(x) ((x).bifattrs & bif_pair_bit)
#define bif_is_mmaint(x) ((x).bifattrs & bif_mmaint_bit)
#define bif_is_no32bit(x) ((x).bifattrs & bif_no32bit_bit)
#define bif_is_32bit(x) ((x).bifattrs & bif_32bit_bit)
#define bif_is_cpu(x) ((x).bifattrs & bif_cpu_bit)
#define bif_is_ldstmask(x) ((x).bifattrs & bif_ldstmask_bit)
#define bif_is_lxvrse(x) ((x).bifattrs & bif_lxvrse_bit)
#define bif_is_lxvrze(x) ((x).bifattrs & bif_lxvrze_bit)
#define bif_is_endian(x) ((x).bifattrs & bif_endian_bit)
extern bifdata rs6000_builtin_info_x[RS6000_BIF_MAX];
On 9/8/21 2:43 AM, Kewen.Lin wrote:
> Hi!
>
> 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
> cpu=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 push 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 as one hook initially
> with one boolean to indicates whether it's initial time, but
> the code looks a bit ugly, to separate them seems to have
> better readability.
>
> To make it simple, this patch uses HOST_WIDE_INT to record the
> flags just like what we use for isa_flags. For rs6000's HTM
> need, one HOST_WIDE_INT variable is quite enough, but it seems
> good to have one auto_vec for scalability as I noticed some
> targets have more than one HOST_WIDE_INT flag.
>
> Against v1 [1], this v2 addressed Richi's and Segher's review
> comments, mainly consists of:
> - Extend it to cover non always_inline.
> - Exclude the case for offload streaming.
> - Some function naming and formatting issues.
> - Adjust rs6000_can_inline_p.
> - Add new cases.
>
> The patch has been bootstrapped and regress-tested on
> powerpc64le-linux-gnu Power9.
>
> Any comments are highly appreciated!
>
> [1] https://gcc.gnu.org/pipermail/gcc-patches/2021-September/578555.html
>
> BR,
> Kewen
> -----
> gcc/ChangeLog:
>
> PR ipa/102059
> * config/rs6000/rs6000-call.c (rs6000_fn_has_any_of_these_mask_bits):
> New function.
> * config/rs6000/rs6000-internal.h
> (rs6000_fn_has_any_of_these_mask_bits): New declare.
> * 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.
> * 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-5.c: New test.
> * gcc.target/powerpc/pr102059-6.c: New test.
> * gcc.target/powerpc/pr102059-7.c: New test.
next prev parent reply other threads:[~2021-09-12 16:34 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-08 7:43 Kewen.Lin
2021-09-12 16:34 ` Bill Schmidt [this message]
2021-09-14 6:40 ` Kewen.Lin
2021-09-15 12:51 ` Martin Jambor
2021-09-16 3:44 ` Kewen.Lin
2021-09-16 13:19 ` Martin Jambor
2021-09-17 9:50 ` Kewen.Lin
2021-09-17 11:26 ` Martin Jambor
2021-09-21 2:16 ` Kewen.Lin
2021-09-21 9:31 ` Martin Jambor
2021-09-21 9:39 ` Richard Biener
2021-09-22 5:33 ` Kewen.Lin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e96e5150-3f1b-55c5-6326-63ad12f08e9a@linux.ibm.com \
--to=wschmidt@linux.ibm.com \
--cc=fweimer@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=hubicka@ucw.cz \
--cc=linkw@linux.ibm.com \
--cc=mjambor@suse.cz \
--cc=mliska@suse.cz \
--cc=richard.guenther@gmail.com \
--cc=segher@kernel.crashing.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).