This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: expand_expr tweaks to fix PR57134
- From: Alan Modra <amodra at gmail dot com>
- To: Richard Biener <richard dot guenther at gmail dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 14 Jun 2013 18:08:33 +0930
- Subject: Re: expand_expr tweaks to fix PR57134
- References: <20130612024834 dot GY6878 at bubble dot grove dot modra dot org> <CAFiYyc243r-89eAsAJtNwm3wX=_F4UFL2Y0DHBgopxVh1tuLrA at mail dot gmail dot com>
On Thu, Jun 13, 2013 at 10:45:38AM +0200, Richard Biener wrote:
> On Wed, Jun 12, 2013 at 4:48 AM, Alan Modra <amodra@gmail.com> wrote:
> > The following patch fixes PR57134 by
> > a) excluding bitfield expansion when EXPAND_MEMORY, and
> > b) passing down the EXPAND_MEMORY modifier in a couple of places where
> > this does not currently happen on recursive calls to expand_expr().
>
> I suppose it also fixes PR57586 which looks similar?
Not completely. It cures the ICE, but you still get "output number 0
not directly addressable". The reason being that expand_asm_operands
isn't asking for a mem. It should I guess, and also not specify
EXPAND_WRITE on an inout parameter. Bootstrapped and regression
tested powerpc64-linux.
PR middle-end/57586
* stmt.c (expand_asm_operands): Call expand_expr with
EXPAND_MEMORY for output operands that disallow regs. Don't
use EXPAND_WRITE on inout operands.
Index: gcc/stmt.c
===================================================================
--- gcc/stmt.c (revision 200083)
+++ gcc/stmt.c (working copy)
@@ -807,7 +807,10 @@ expand_asm_operands (tree string, tree outputs, tr
|| ! allows_reg
|| is_inout)
{
- op = expand_expr (val, NULL_RTX, VOIDmode, EXPAND_WRITE);
+ op = expand_expr (val, NULL_RTX, VOIDmode,
+ !allows_reg ? EXPAND_MEMORY
+ : !is_inout ? EXPAND_WRITE
+ : EXPAND_NORMAL);
if (MEM_P (op))
op = validize_mem (op);
> Ok with a testcase and mentioning PR57586 in the changelog.
gcc.dg/compile/pr57134.c added.
--
Alan Modra
Australia Development Lab, IBM