This is the mail archive of the
mailing list for the GCC project.
Re: How do I set a hard register in gimple
- From: Steven Bosscher <stevenb dot gcc at gmail dot com>
- To: Steve Ellcey <sellcey at imgtec dot com>
- Cc: GCC Mailing List <gcc at gcc dot gnu dot org>
- Date: Wed, 22 Apr 2015 12:28:21 +0200
- Subject: Re: How do I set a hard register in gimple
- Authentication-results: sourceware.org; auth=none
- References: <b48d7c9a-319b-4f4c-aa34-f15634189d80 at BAMAIL02 dot ba dot imgtec dot org>
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.