From: Jason Merrill Date: Tue, 6 Jun 2000 03:37:50 +0000 (+0000) Subject: explow.c (maybe_set_unchanging): New function, broken out from... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=258a120bab5d85ac9541551620ff0fc24de1c354;p=gcc.git explow.c (maybe_set_unchanging): New function, broken out from... * explow.c (maybe_set_unchanging): New function, broken out from... (set_mem_attributes): Here. * expr.h: Declare it. * stmt.c (expand_decl): Call it. From-SVN: r34421 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c0040dd6205..bb74239d12a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2000-06-05 Jason Merrill + + * explow.c (maybe_set_unchanging): New function, broken out from... + (set_mem_attributes): Here. + * expr.h: Declare it. + * stmt.c (expand_decl): Call it. + 2000-06-05 Richard Henderson * reload1.c (choose_reload_regs): Mind CLASS_CANNOT_CHANGE_SIZE diff --git a/gcc/explow.c b/gcc/explow.c index 6ca93bcbffb..9f7eada363e 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -628,6 +628,27 @@ validize_mem (ref) return change_address (ref, GET_MODE (ref), XEXP (ref, 0)); } +/* Given REF, either a MEM or a REG, and T, either the type of X or + the expression corresponding to REF, set RTX_UNCHANGING_P if + appropriate. */ + +void +maybe_set_unchanging (ref, t) + rtx ref; + tree t; +{ + /* We can set RTX_UNCHANGING_P from TREE_READONLY for decls whose + initialization is only executed once, or whose initializer always + has the same value. Currently we simplify this to PARM_DECLs in the + first case, and decls with TREE_CONSTANT initializers in the second. */ + if ((TREE_READONLY (t) && DECL_P (t) + && (TREE_CODE (t) == PARM_DECL + || DECL_INITIAL (t) == NULL_TREE + || TREE_CONSTANT (DECL_INITIAL (t)))) + || TREE_CODE_CLASS (TREE_CODE (t)) == 'c') + RTX_UNCHANGING_P (ref) = 1; +} + /* Given REF, a MEM, and T, either the type of X or the expression corresponding to REF, set the memory attributes. OBJECTP is nonzero if we are making a new object of this type. */ @@ -642,8 +663,12 @@ set_mem_attributes (ref, t, objectp) /* Get the alias set from the expression or type (perhaps using a front-end routine) and then copy bits from the type. */ + + /* It is incorrect to set RTX_UNCHANGING_P from TREE_READONLY (type) + here, because, in C and C++, the fact that a location is accessed + through a const expression does not mean that the value there can + never change. */ MEM_ALIAS_SET (ref) = get_alias_set (t); - RTX_UNCHANGING_P (ref) = TYPE_READONLY (type); MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type); MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type); @@ -657,8 +682,7 @@ set_mem_attributes (ref, t, objectp) if (TYPE_P (t)) return; - if (TREE_READONLY (t) || TREE_CODE_CLASS (TREE_CODE (t)) == 'c') - RTX_UNCHANGING_P (ref) = 1; + maybe_set_unchanging (ref, t); if (TREE_THIS_VOLATILE (t)) MEM_VOLATILE_P (ref) = 1; diff --git a/gcc/expr.h b/gcc/expr.h index 852b6c0efe6..b822ea24815 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -1150,6 +1150,11 @@ extern rtx change_address PARAMS ((rtx, enum machine_mode, rtx)); extern rtx validize_mem PARAMS ((rtx)); #ifdef TREE_CODE +/* Given REF, either a MEM or a REG, and T, either the type of X or + the expression corresponding to REF, set RTX_UNCHANGING_P if + appropriate. */ +extern void maybe_set_unchanging PARAMS ((rtx, tree)); + /* Given REF, a MEM, and T, either the type of X or the expression corresponding to REF, set the memory attributes. OBJECTP is nonzero if we are making a new object of this type. */ diff --git a/gcc/stmt.c b/gcc/stmt.c index 5016e67c9f2..fe0d58e9a49 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -3817,9 +3817,8 @@ expand_decl (decl) if (POINTER_TYPE_P (type)) mark_reg_pointer (DECL_RTL (decl), TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl)))); - - if (TREE_READONLY (decl)) - RTX_UNCHANGING_P (DECL_RTL (decl)) = 1; + + maybe_set_unchanging (DECL_RTL (decl), decl); } else if (TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST