diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-23 18:51:18 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-23 18:51:18 +0000 |
commit | 2a631e19bed8b13c3856eff9576b6b9bd1c576e7 (patch) | |
tree | 4f314d9fb9d201416fb3ebce0a67307306ae796f /gcc/alias.c | |
parent | bd08a4e696f9fc58eb5a47250566867849a358e4 (diff) | |
download | gcc-2a631e19bed8b13c3856eff9576b6b9bd1c576e7.tar.gz |
* alias.c (can_address_p): Compnonents are not addressable if
the containing type has alias set 0.
(get_alias_set): Rework to use STRIP_NOPS.
Only call front-end routine on object, type, or object with
NOPs stripped, not inner values.
Use language hook to call front-end routine.
* builtins.c (get_memory_rtx): Always call set_mem_attributes.
(expand_builtin_apply): Call set_mem_align on MEMs we make.
Don't pass alignment to emit_block_move.
(expand_builtin_memcpy, expand_builtin_va_copy): Likewise.
(expand_builtin_memset): Likewise, but for clear_storage.
* c-common.c (lang_get_alias_set): Renamed to c_common_alias_set
and remove C++ specific parts.
* c-common.h (c_common_get_alias_set): Add declaration.
* c-lang.c (LANG_HOOKS_GET_ALIAS_SET): New macro.
* calls.c (emit_call_1): Fix typo in sibcall_pop case.
(save_fixed_argument_area): Call set_mem_align.
Remove alignment in call to emit_block_move.
(emit_library_call_value_1, store_one_arg): Likewise.
(target_for_arg): Remove; disabled long ago.
* emit-rtl.c (set_mem_attributes): Rework to only call get_mem_attrs
once and similar cleanups.
(offset_address): Use proper introductory comment.
* expr.c (emit_block_move): Use alignment from that of MEM args, not
from explicit operand; all callers changed.
(clear_storage): Likewise.
(expand_assignment): Don't call set_mem_alias_set on to_rtx.
(store_field): Remove kludge on alias set used for to_rtx.
(highest_pow2_factor, case *_DIV_EXPR): Never return 0.
(expand_expr_unaligned): Call set_mem_attributes instead of
set_mem_alias_set.
* expr.h (emit_block_move, clear_storage): Remove ALIGN argument.
* function.c (assign_stack_temp_for_type): Set MEM alignment.
(expand_function_end): Track MEM attributes of trampolines.
* ifcvt.c (noce_try_cmove_arith): Set alignment of new MEM.
* integrate.c (copy_rtx_and_substitute, case CALL): Copy memory
attributes from original.
* langhooks.c (lang_hook_default_get_alias_set): New function.
(hook_get_alias_set_0): New function.
* langhooks.h (hook_get_alias_set_0): New declaration.
(lang_hook_default_get_alias_set): Likewise.
(LANG_HOOKS_GET_ALIAS_SET): New macro; add to initializer.
* reload1.c (alter_reg): Use adjust_address_nv.
* rtl.c (get_mode_alignment): Moved to here.
* rtl.h (MEM_ALIGN): Take default from mode, if not BLKmode, and
change default if unknown from 1 to BITS_PER_UNIT.
* stor-layout.c (get_mode_alignment): Remove from here.
* toplev.h (struct lang_hoks): Add get_alias_set field.
* tree.h (lang_get_alias_set): Delete declaration.
* config/arc/arc.c (arc_setup_incoming_varags): Set MEM alignment.
* config/i386/i386.c (ix86_setup_incoming_varargs): Likewise.
(ix86_va_arg): Likewise.
* config/i960/i960.c (i960_setup_incoming_varargs): Likewise.
* config/pa/pa.c (hppa_builtin_saveregs): Likewise.
* config/sparc/sparc.c (sparc_va_arg): Likewise.
* config/rs6000/rs6000.c (setup_incoming_varargs): Likewise.
(expand_block_move_mem): Remove dead code.
* cp/cp-lang.c (cxx_get_alias_set): New function.
Point LANG_HOOKS_GET_ALIAS_SET to it.
* f/com.c (LANG_HOOKS_GET_ALIAS_SET): New macro.
(lang_get_alias_set): Delete.
* java/lang.c (lang_get_alias_set): Deleted.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46440 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/alias.c')
-rw-r--r-- | gcc/alias.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/gcc/alias.c b/gcc/alias.c index af0141f8cb3..3de48b2973b 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -438,13 +438,18 @@ can_address_p (t) else if (TREE_CODE (t) == BIT_FIELD_REF) return 0; + /* Fields are addressable unless they are marked as nonaddressable or + the containing type has alias set 0. */ else if (TREE_CODE (t) == COMPONENT_REF && ! DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1)) + && get_alias_set (TREE_TYPE (TREE_OPERAND (t, 0))) != 0 && can_address_p (TREE_OPERAND (t, 0))) return 1; + /* Likewise for arrays. */ else if ((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF) && ! TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0))) + && get_alias_set (TREE_TYPE (TREE_OPERAND (t, 0))) != 0 && can_address_p (TREE_OPERAND (t, 0))) return 1; @@ -478,22 +483,25 @@ get_alias_set (t) tree inner = t; tree placeholder_ptr = 0; + /* Remove any nops, then give the language a chance to do + something with this tree before we look at it. */ + STRIP_NOPS (t); + set = (*lang_hooks.get_alias_set) (t); + if (set != -1) + return set; + /* First see if the actual object referenced is an INDIRECT_REF from a - restrict-qualified pointer or a "void *". Start by removing nops - since we care only about the actual object. Also replace + restrict-qualified pointer or a "void *". Replace PLACEHOLDER_EXPRs. */ - while (((TREE_CODE (inner) == NOP_EXPR - || TREE_CODE (inner) == CONVERT_EXPR) - && (TYPE_MODE (TREE_TYPE (inner)) - == TYPE_MODE (TREE_TYPE (TREE_OPERAND (inner, 0))))) - || TREE_CODE (inner) == NON_LVALUE_EXPR - || TREE_CODE (inner) == PLACEHOLDER_EXPR + while (TREE_CODE (inner) == PLACEHOLDER_EXPR || handled_component_p (inner)) { if (TREE_CODE (inner) == PLACEHOLDER_EXPR) inner = find_placeholder (inner, &placeholder_ptr); else inner = TREE_OPERAND (inner, 0); + + STRIP_NOPS (inner); } /* Check for accesses through restrict-qualified pointers. */ @@ -540,27 +548,16 @@ get_alias_set (t) /* Otherwise, pick up the outermost object that we could have a pointer to, processing conversion and PLACEHOLDER_EXPR as above. */ placeholder_ptr = 0; - while (((TREE_CODE (t) == NOP_EXPR || TREE_CODE (t) == CONVERT_EXPR) - && (TYPE_MODE (TREE_TYPE (t)) - == TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 0))))) - || TREE_CODE (t) == NON_LVALUE_EXPR - || TREE_CODE (t) == PLACEHOLDER_EXPR + while (TREE_CODE (t) == PLACEHOLDER_EXPR || (handled_component_p (t) && ! can_address_p (t))) { - /* Give the language a chance to do something with this tree - before we go inside it. */ - if ((set = lang_get_alias_set (t)) != -1) - return set; - if (TREE_CODE (t) == PLACEHOLDER_EXPR) t = find_placeholder (t, &placeholder_ptr); else t = TREE_OPERAND (t, 0); - } - /* Give the language another chance to do something. */ - if ((set = lang_get_alias_set (t)) != -1) - return set; + STRIP_NOPS (t); + } /* If we've already determined the alias set for a decl, just return it. This is necessary for C++ anonymous unions, whose component @@ -580,7 +577,8 @@ get_alias_set (t) return TYPE_ALIAS_SET (t); /* See if the language has special handling for this type. */ - if ((set = lang_get_alias_set (t)) != -1) + set = (*lang_hooks.get_alias_set) (t); + if (set != -1) return set; /* There are no objects of FUNCTION_TYPE, so there's no point in |