[PING][Patch]Fix ICE for gcc.dg/noncompile/920507-1.c

Tony Wang tony.wang@arm.com
Tue Aug 5 01:35:00 GMT 2014


Ping, any comment and suggestion on this bug fix?

> -----Original Message-----
> From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches-
> owner@gcc.gnu.org] On Behalf Of Tony Wang
> Sent: Tuesday, July 29, 2014 10:31 AM
> To: gcc-patches@gcc.gnu.org; 'Richard Biener'; 'Jakub Jelinek'
> Subject: [Patch]Fix ICE for gcc.dg/noncompile/920507-1.c
> 
> Hi there,
> 
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61330.
> There will be an ICE in gcc trunk for targets support section anchor
> optimization when compiling this case(like arm and mips). This looks like
an

The target should be aarch64, arm, powerpc, alpha

> old bug which is exposed by recent patch.
> 
> In make_decl_rtl, when you declare register type incorrectly like
"register int
> *a asm("unknown register");", the compiler will raise an error messge but
> doesn't return directly. It will continue to run into the rtx generation
code for
> general variable declaration and generate a wrong rtx:(symbol_ref:SI...).
So I
> just remove the else condition which used to be the rtx generation part
for
> correctly declared register type, and let all the register type
declaration(no
> matter it declared correct or not) go through it and generate the same
type
> of rtx:(reg:SI...).
> 
> gcc/ChangeLog:
> 
> 2014-07-29  Tony Wang  tony.wang@arm.com
> 
>         * gcc/varasm.c (make_decl_rtl): Remove the else condition
>           for properly declared static register variables.
> 
> diff --git a/gcc/varasm.c b/gcc/varasm.c index 819ec26..a6fae0c 100644
> --- a/gcc/varasm.c
> +++ b/gcc/varasm.c
> @@ -1333,45 +1333,42 @@ make_decl_rtl (tree decl)
>                error ("register specified for %q+D isn%'t suitable for
data type",
>                 decl);
>        /* Now handle properly declared static register variables.  */
> -      else
> -              {
> -                int nregs;
> +      int nregs;
> 
> -                if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
> -                  {
> -                    DECL_INITIAL (decl) = 0;
> -                    error ("global register variable has initial value");
> -                  }
> -                if (TREE_THIS_VOLATILE (decl))
> -                  warning (OPT_Wvolatile_register_var,
> -                                   "optimization may eliminate reads
and/or
> "
> -                                   "writes to register variables");
> +      if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
> +        {
> +           DECL_INITIAL (decl) = 0;
> +           error ("global register variable has initial value");
> +        }
> +      if (TREE_THIS_VOLATILE (decl))
> +        warning (OPT_Wvolatile_register_var,
> +                 "optimization may eliminate reads and/or "
> +                      "writes to register variables");
> 
> -                /* If the user specified one of the eliminables registers
> here,
> -                   e.g., FRAME_POINTER_REGNUM, we don't want to get this
> variable
> -                   confused with that register and be eliminated.  This
> usage is
> -                   somewhat suspect...  */
> +      /* If the user specified one of the eliminables registers here,
> +         e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
> +         confused with that register and be eliminated.  This usage is
> +         somewhat suspect...  */
> 
> -                SET_DECL_RTL (decl, gen_rtx_raw_REG (mode, reg_number));
> -                ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
> -                REG_USERVAR_P (DECL_RTL (decl)) = 1;
> +      SET_DECL_RTL (decl, gen_rtx_raw_REG (mode, reg_number));
> +      ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
> +      REG_USERVAR_P (DECL_RTL (decl)) = 1;
> 
> -                if (TREE_STATIC (decl))
> -                  {
> -                    /* Make this register global, so not usable for
> anything
> -                              else.  */
> +      if (TREE_STATIC (decl))
> +        {
> +          /* Make this register global, so not usable for anything
> +             else.  */
> #ifdef ASM_DECLARE_REGISTER_GLOBAL
> -                    name = IDENTIFIER_POINTER (DECL_NAME (decl));
> -                    ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl,
> reg_number, name);
> +          name = IDENTIFIER_POINTER (DECL_NAME (decl));
> +          ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number,
> + name);
> #endif
> -                    nregs = hard_regno_nregs[reg_number][mode];
> -                    while (nregs > 0)
> -                              globalize_reg (decl, reg_number + --nregs);
> -                  }
> +          nregs = hard_regno_nregs[reg_number][mode];
> +          while (nregs > 0)
> +            globalize_reg (decl, reg_number + --nregs);
> +        }
> 
> -                /* As a register variable, it has no section.  */
> -                return;
> -              }
> +      /* As a register variable, it has no section.  */
> +      return;
>      }
>    /* Now handle ordinary static variables and functions (in memory).
>       Also handle vars declared register invalidly.  */
> 
> BR,
> Tony




More information about the Gcc-patches mailing list