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);

  stmt = gimple_build_assign (ptr_var, build_fold_addr_expr (array_var));
  e = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (fun));
  gsi_insert_on_edge_immediate (e, stmt);

And I see the code during the rtl expansion, but during the first CSE
pass the set of $16 goes away.  How do I mark this variable as 'volatile'
so that the assignment to it does not go away?  It must be possible because
the set does not go away in my small example program but I can't figure
out what it is setting that I am not.

Steve Ellcey
sell...@imgtec.com

Reply via email to