On Wed, Apr 22, 2015 at 1:45 AM, Steve Ellcey wrote:
> I have a question about inserting code into a function being compiled by
> GCC.  Basically I want to set a hard register at the beginning of a
> function like is being done below.  If I compile the program below on MIPS
> the $16 register gets set to the result of alloca and even if I optimize
> the routine and nothing else uses p ($16), the set of $16 gets done.
>
> register void *p asm ("$16");
> void *foo(void *a)
> {
>         p = alloca(64);
>         /* Rest of function.  */
> }
>
> But if I try to insert this code myself from inside GCC the setting of $16
> keeps getting optimized away and I cannot figure out how to stop it.
> My code to set the register does this:
>
>   ptr_var = build_decl (UNKNOWN_LOCATION, VAR_DECL,
>                         get_identifier ("__alloca_reg"), ptr_type);
>   TREE_PUBLIC (ptr_var) = 1;
>   DECL_EXTERNAL (ptr_var) = 1;
>   SET_DECL_RTL (ptr_var, gen_raw_REG (Pmode, 16));
>   DECL_REGISTER (ptr_var) = 1;
>   DECL_HARD_REGISTER (ptr_var) = 1;
>   TREE_THIS_VOLATILE (ptr_var) = 1;
>   TREE_USED (ptr_var) = 1;
>   varpool_node::finalize_decl (ptr_var);

This is wrong for sure. You can't have DECL_RTL in GIMPLE.

You will want to set has_local_explicit_reg_vars, DECL_HARD_REGISTER,
and DECL_ASSEMBLER_NAME, and leave it to the middle end to take care
of everything else.

Ciao!
Steven

Reply via email to