public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: HAO CHEN GUI <guihaoc@linux.ibm.com>
Cc: gcc-patches <gcc-patches@gcc.gnu.org>,
	 Segher Boessenkool <segher@kernel.crashing.org>,
	David <dje.gcc@gmail.com>,  "Kewen.Lin" <linkw@linux.ibm.com>
Subject: Re: [PATCH, expand] Call misaligned memory reference in expand_builtin_return [PR112417]
Date: Thu, 9 Nov 2023 12:41:22 +0100	[thread overview]
Message-ID: <CAFiYyc3Ft+vOKzAtUviogqvteiAo6J_joLMYrA383xXwHnBj+w@mail.gmail.com> (raw)
In-Reply-To: <d8fef393-68f9-4ea8-8903-fb280e0f46d3@linux.ibm.com>

On Thu, Nov 9, 2023 at 6:43 AM HAO CHEN GUI <guihaoc@linux.ibm.com> wrote:
>
> Hi,
>   This patch modifies expand_builtin_return and make it call
> expand_misaligned_mem_ref to load unaligned memory.  The memory reference
> pointed by void* pointer might be unaligned, so expanding it with
> unaligned move optabs is safe.
>
>   The new test case illustrates the problem. rs6000 doesn't have
> unaligned vector load instruction with VSX disabled. When calling
> builtin_return, it shouldn't load the memory to vector register by
> unaligned load instruction directly. It should store it to an on stack
> variable by extract_bit_field then load to return register from stack
> by aligned load instruction.
>
>   Bootstrapped and tested on x86 and powerpc64-linux BE and LE with no
> regressions. Is this OK for trunk?

I'm not sure if the testcase is valid though?

@defbuiltin{{void} __builtin_return (void *@var{result})}
This built-in function returns the value described by @var{result} from
the containing function.  You should specify, for @var{result}, a value
returned by @code{__builtin_apply}.
@enddefbuiltin

I don't see __builtin_apply being used here?

Richard.

> Thanks
> Gui Haochen
>
> ChangeLog
> expand: Call misaligned memory reference in expand_builtin_return
>
> expand_builtin_return loads memory to return registers.  The memory might
> be unaligned compared to the mode of the registers.  So it should be
> expanded by unaligned move optabs if the memory reference is unaligned.
>
> gcc/
>         PR target/112417
>         * builtins.cc (expand_builtin_return): Call
>         expand_misaligned_mem_ref for loading unaligned memory reference.
>         * builtins.h (expand_misaligned_mem_ref): Declare.
>         * expr.cc (expand_misaligned_mem_ref): No longer static.
>
> gcc/testsuite/
>         PR target/112417
>         * gcc.target/powerpc/pr112417.c: New.
>
> patch.diff
> diff --git a/gcc/builtins.cc b/gcc/builtins.cc
> index cb90bd03b3e..b879eb88b7c 100644
> --- a/gcc/builtins.cc
> +++ b/gcc/builtins.cc
> @@ -1816,7 +1816,12 @@ expand_builtin_return (rtx result)
>         if (size % align != 0)
>           size = CEIL (size, align) * align;
>         reg = gen_rtx_REG (mode, INCOMING_REGNO (regno));
> -       emit_move_insn (reg, adjust_address (result, mode, size));
> +       rtx tmp = adjust_address (result, mode, size);
> +       unsigned int align = MEM_ALIGN (tmp);
> +       if (align < GET_MODE_ALIGNMENT (mode))
> +         tmp = expand_misaligned_mem_ref (tmp, mode, 1, align,
> +                                          NULL, NULL);
> +       emit_move_insn (reg, tmp);
>
>         push_to_sequence (call_fusage);
>         emit_use (reg);
> diff --git a/gcc/builtins.h b/gcc/builtins.h
> index 88a26d70cd5..a3d7954ee6e 100644
> --- a/gcc/builtins.h
> +++ b/gcc/builtins.h
> @@ -157,5 +157,7 @@ extern internal_fn replacement_internal_fn (gcall *);
>
>  extern bool builtin_with_linkage_p (tree);
>  extern int type_to_class (tree);
> +extern rtx expand_misaligned_mem_ref (rtx, machine_mode, int, unsigned int,
> +                                     rtx, rtx *);
>
>  #endif /* GCC_BUILTINS_H */
> diff --git a/gcc/expr.cc b/gcc/expr.cc
> index ed4dbb13d89..b0adb35a095 100644
> --- a/gcc/expr.cc
> +++ b/gcc/expr.cc
> @@ -9156,7 +9156,7 @@ expand_cond_expr_using_cmove (tree treeop0 ATTRIBUTE_UNUSED,
>     If the result can be stored at TARGET, and ALT_RTL is non-NULL,
>     then *ALT_RTL is set to TARGET (before legitimziation).  */
>
> -static rtx
> +rtx
>  expand_misaligned_mem_ref (rtx temp, machine_mode mode, int unsignedp,
>                            unsigned int align, rtx target, rtx *alt_rtl)
>  {
> diff --git a/gcc/testsuite/gcc.target/powerpc/pr112417.c b/gcc/testsuite/gcc.target/powerpc/pr112417.c
> new file mode 100644
> index 00000000000..ef82fc82033
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/pr112417.c
> @@ -0,0 +1,12 @@
> +/* { dg-do compile { target { has_arch_pwr7 } } } */
> +/* { dg-options "-mno-vsx -maltivec -O2" } */
> +
> +void * foo (void * p)
> +{
> +  if (p)
> +    __builtin_return (p);
> +}
> +
> +/* Ensure that unaligned load is generated via stack load/store.  */
> +/* { dg-final { scan-assembler {\mstw\M} { target { ! has_arch_ppc64 } } } } */
> +/* { dg-final { scan-assembler {\mstd\M} { target has_arch_ppc64 } } } */

  reply	other threads:[~2023-11-09 11:44 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-09  5:41 HAO CHEN GUI
2023-11-09 11:41 ` Richard Biener [this message]
2023-11-10  7:52   ` HAO CHEN GUI
2023-11-10  9:06     ` Richard Biener
2023-11-10 10:09       ` HAO CHEN GUI
2023-11-10 13:39         ` Richard Biener
     [not found]           ` <e8bfd189-5c8b-4a1b-bc84-d3fe0cb1a032@linux.ibm.com>
2023-11-13  8:09             ` Fwd: " HAO CHEN GUI
2023-11-13  9:38               ` Richard Biener

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=CAFiYyc3Ft+vOKzAtUviogqvteiAo6J_joLMYrA383xXwHnBj+w@mail.gmail.com \
    --to=richard.guenther@gmail.com \
    --cc=dje.gcc@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=guihaoc@linux.ibm.com \
    --cc=linkw@linux.ibm.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).