diff options
Diffstat (limited to 'gcc/tree-flow-inline.h')
| -rw-r--r-- | gcc/tree-flow-inline.h | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h index e1c19fc6dd4..ddfa77a7c0c 100644 --- a/gcc/tree-flow-inline.h +++ b/gcc/tree-flow-inline.h @@ -845,13 +845,12 @@ is_call_clobbered (tree var) static inline void mark_call_clobbered (tree var) { - var_ann_t ann = var_ann (var); /* If VAR is a memory tag, then we need to consider it a global variable. This is because the pointer that VAR represents has been found to point to either an arbitrary location or to a known location in global memory. */ - if (ann->mem_tag_kind != NOT_A_TAG && ann->mem_tag_kind != STRUCT_FIELD) - DECL_EXTERNAL (var) = 1; + if (MTAG_P (var) && TREE_CODE (var) != STRUCT_FIELD_TAG) + MTAG_GLOBAL (var) = 1; bitmap_set_bit (call_clobbered_vars, DECL_UID (var)); ssa_call_clobbered_cache_valid = false; ssa_ro_call_cache_valid = false; @@ -861,9 +860,8 @@ mark_call_clobbered (tree var) static inline void clear_call_clobbered (tree var) { - var_ann_t ann = var_ann (var); - if (ann->mem_tag_kind != NOT_A_TAG && ann->mem_tag_kind != STRUCT_FIELD) - DECL_EXTERNAL (var) = 0; + if (MTAG_P (var) && TREE_CODE (var) != STRUCT_FIELD_TAG) + MTAG_GLOBAL (var) = 0; bitmap_clear_bit (call_clobbered_vars, DECL_UID (var)); ssa_call_clobbered_cache_valid = false; ssa_ro_call_cache_valid = false; @@ -1404,6 +1402,10 @@ unmodifiable_var_p (tree var) { if (TREE_CODE (var) == SSA_NAME) var = SSA_NAME_VAR (var); + + if (MTAG_P (var)) + return TREE_READONLY (var) && (TREE_STATIC (var) || MTAG_GLOBAL (var)); + return TREE_READONLY (var) && (TREE_STATIC (var) || DECL_EXTERNAL (var)); } |

