aboutsummaryrefslogtreecommitdiff
path: root/gcc/stmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r--gcc/stmt.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 7c4c67b..4df59f8 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -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);