diff options
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r-- | gcc/stmt.c | 19 |
1 files changed, 14 insertions, 5 deletions
@@ -3422,12 +3422,21 @@ expand_decl (tree decl) SET_DECL_RTL (decl, gen_reg_rtx (reg_mode)); + /* Note if the object is a user variable. */ if (!DECL_ARTIFICIAL (decl)) - mark_user_reg (DECL_RTL (decl)); - - if (POINTER_TYPE_P (type)) - mark_reg_pointer (DECL_RTL (decl), - TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl)))); + { + mark_user_reg (DECL_RTL (decl)); + + /* Trust user variables which have a pointer type to really + be pointers. Do not trust compiler generated temporaries + as our type system is totally busted as it relates to + pointer arithmetic which translates into lots of compiler + generated objects with pointer types, but which are not really + pointers. */ + if (POINTER_TYPE_P (type)) + mark_reg_pointer (DECL_RTL (decl), + TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl)))); + } maybe_set_unchanging (DECL_RTL (decl), decl); |