This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Don't expand *MEM_REF using extract_bit_field or movmisalign for EXPAND_MEMORY (PR inline-asm/56405)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Jeff Law <law at redhat dot com>, Eric Botcazou <ebotcazou at adacore dot com>, gcc-patches at gcc dot gnu dot org
- Date: Thu, 21 Feb 2013 10:07:08 +0100 (CET)
- Subject: Re: [PATCH] Don't expand *MEM_REF using extract_bit_field or movmisalign for EXPAND_MEMORY (PR inline-asm/56405)
- References: <20130221062842.GU1215@tucnak.zalov.cz>
On Thu, 21 Feb 2013, Jakub Jelinek wrote:
> Hi!
>
> If an input operand of inline-asm doesn't allow registers, but allows
> memory, we expand it with EXPAND_MEMORY modifier (the only case of using
> that modifier). But the movmisalign code added for 4.6 and especially
> the extract_bit_field code added for 4.8 results in getting a REG from
> expand_expr called with a *MEM_REF with EXPAND_MEMORY, instead of MEM the
> caller expects and can only handle, therefore we ICE.
>
> This patch fixes it by honoring EXPAND_MEMORY in these cases, it is the sole
> responsibility of the inline asm writer to do the right thing in there for
> misaligned mems (e.g. gcc could pessimistically expect it might be
> misaligned, but user knows it will not).
>
> Bootstrapped/regtested on {x86_64,i686,armv7hl,ppc,ppc64,s390,s390x}-linux,
> ok for trunk?
Ok.
Thanks,
Richard.
> 2013-02-21 Jakub Jelinek <jakub@redhat.com>
>
> PR inline-asm/56405
> * expr.c (expand_expr_real_1) <case TARGET_MEM_REF, MEM_REF>: Don't
> use movmisalign or extract_bit_field for EXPAND_MEMORY modifier.
>
> * gcc.c-torture/compile/pr56405.c: New test.
>
> --- gcc/expr.c.jj 2013-01-18 18:09:40.000000000 +0100
> +++ gcc/expr.c 2013-02-20 10:29:34.513143634 +0100
> @@ -9551,6 +9551,7 @@ expand_expr_real_1 (tree exp, rtx target
> set_mem_addr_space (temp, as);
> align = get_object_alignment (exp);
> if (modifier != EXPAND_WRITE
> + && modifier != EXPAND_MEMORY
> && mode != BLKmode
> && align < GET_MODE_ALIGNMENT (mode)
> /* If the target does not have special handling for unaligned
> @@ -9639,6 +9640,7 @@ expand_expr_real_1 (tree exp, rtx target
> if (TREE_THIS_VOLATILE (exp))
> MEM_VOLATILE_P (temp) = 1;
> if (modifier != EXPAND_WRITE
> + && modifier != EXPAND_MEMORY
> && mode != BLKmode
> && align < GET_MODE_ALIGNMENT (mode))
> {
> --- gcc/testsuite/gcc.c-torture/compile/pr56405.c.jj 2013-02-20 10:32:17.807250979 +0100
> +++ gcc/testsuite/gcc.c-torture/compile/pr56405.c 2013-02-20 10:32:46.963090873 +0100
> @@ -0,0 +1,7 @@
> +/* PR inline-asm/56405 */
> +
> +void
> +foo (void)
> +{
> + asm volatile ("" : "+m" (*(volatile unsigned short *) 0x1001UL));
> +}
>
> Jakub
>
>
--
Richard Biener <rguenther@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend