Following up to my own email, I think I found the missing magic.  I
needed to set global_regs[16] to 1.  Once global_regs was set for the
register, the assignment stopped getting optimized out.

Steve Ellcey
sell...@imgtec.com


On Wed, 2015-04-22 at 12:27 -0700, Steve Ellcey wrote:
> 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