On Wed, 2015-04-22 at 12:28 +0200, Steven Bosscher wrote:

> 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

Thanks for the advice, I switched to DECL_HARD_REGISTER and
DECL_ASSEMBLER_NAME but I am still having the same problem, which is
that the assignment to this global (register) variable is getting
optimized away.

If I have:

  ptr_type = build_pointer_type (char_type_node);
  id = get_identifier ("X");
  ptr_var = build_decl (UNKNOWN_LOCATION, VAR_DECL, id, ptr_type);
  TREE_PUBLIC (ptr_var) = 1;
  DECL_EXTERNAL (ptr_var) = 1;
  varpool_node::finalize_decl (ptr_var);

The the assignment to this global variable is not removed by the
optimizer, which makes sense because someone outside the function could
access the value of the global variable.

But if I change it to:

  ptr_type = build_pointer_type (char_type_node);
  id = get_identifier ("*$16");
  ptr_var = build_decl (UNKNOWN_LOCATION, VAR_DECL, id, ptr_type);
  TREE_PUBLIC (ptr_var) = 1;
  DECL_EXTERNAL (ptr_var) = 1;
  DECL_REGISTER (ptr_var) = 1;
  DECL_HARD_REGISTER (ptr_var) = 1;
  SET_DECL_ASSEMBLER_NAME (ptr_var, id);
  varpool_node::finalize_decl (ptr_var);

Then the assignment to this variable is optimized away by the cse1
optimization phase.

Steve Ellcey
sell...@imgtec.com

Reply via email to