Commit 2039d7aa by Richard Henderson Committed by Richard Henderson

alias.c (component_uses_parent_alias_set): Rename from can_address_p.

        * alias.c (component_uses_parent_alias_set): Rename from
        can_address_p.  Return bool.  Reverse the sense of the result.
        Reinstate the check for alias set zero.
        (get_alias_set): Update to match.
        * alias.h (component_uses_parent_alias_set): Likewise.
        * emit-rtl.c (set_mem_attributes_minus_bitpos): Likewise.
        * expr.c (expand_assignment): Likewise.
        * expr.h: Remove commented out prototypes that were moved to alias.h.

From-SVN: r91712
parent 1b68ae54
2004-12-03 Richard Henderson <rth@redhat.com> 2004-12-03 Richard Henderson <rth@redhat.com>
* alias.c (component_uses_parent_alias_set): Rename from
can_address_p. Return bool. Reverse the sense of the result.
Reinstate the check for alias set zero.
(get_alias_set): Update to match.
* alias.h (component_uses_parent_alias_set): Likewise.
* emit-rtl.c (set_mem_attributes_minus_bitpos): Likewise.
* expr.c (expand_assignment): Likewise.
* expr.h: Remove commented out prototypes that were moved to alias.h.
2004-12-03 Richard Henderson <rth@redhat.com>
* doc/tm.texi (TARGET_BUILD_BUILTIN_VA_LIST): New. * doc/tm.texi (TARGET_BUILD_BUILTIN_VA_LIST): New.
(TARGET_CANNOT_FORCE_CONST_MEM): New. (TARGET_CANNOT_FORCE_CONST_MEM): New.
......
...@@ -378,29 +378,36 @@ find_base_decl (tree t) ...@@ -378,29 +378,36 @@ find_base_decl (tree t)
} }
} }
/* Return 1 if all the nested component references handled by /* Return true if all nested component references handled by
get_inner_reference in T are such that we can address the object in T. */ get_inner_reference in T are such that we should use the alias set
provided by the object at the heart of T.
int This is true for non-addressable components (which don't have their
can_address_p (tree t) own alias set), as well as components of objects in alias set zero.
This later point is a special case wherein we wish to override the
alias set used by the component, but we don't have per-FIELD_DECL
assignable alias sets. */
bool
component_uses_parent_alias_set (tree t)
{ {
while (1) while (1)
{ {
/* If we're at the end, it is vacuously addressable. */ /* If we're at the end, it vacuously uses its own alias set. */
if (!handled_component_p (t)) if (!handled_component_p (t))
return true; return false;
switch (TREE_CODE (t)) switch (TREE_CODE (t))
{ {
case COMPONENT_REF: case COMPONENT_REF:
if (DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1))) if (DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1)))
return false; return true;
break; break;
case ARRAY_REF: case ARRAY_REF:
case ARRAY_RANGE_REF: case ARRAY_RANGE_REF:
if (TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0)))) if (TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0))))
return false; return true;
break; break;
case REALPART_EXPR: case REALPART_EXPR:
...@@ -409,10 +416,12 @@ can_address_p (tree t) ...@@ -409,10 +416,12 @@ can_address_p (tree t)
default: default:
/* Bitfields and casts are never addressable. */ /* Bitfields and casts are never addressable. */
return false; return true;
} }
t = TREE_OPERAND (t, 0); t = TREE_OPERAND (t, 0);
if (get_alias_set (TREE_TYPE (t)) == 0)
return true;
} }
} }
...@@ -515,7 +524,7 @@ get_alias_set (tree t) ...@@ -515,7 +524,7 @@ get_alias_set (tree t)
/* Otherwise, pick up the outermost object that we could have a pointer /* Otherwise, pick up the outermost object that we could have a pointer
to, processing conversions as above. */ to, processing conversions as above. */
while (handled_component_p (t) && ! can_address_p (t)) while (component_uses_parent_alias_set (t))
{ {
t = TREE_OPERAND (t, 0); t = TREE_OPERAND (t, 0);
STRIP_NOPS (t); STRIP_NOPS (t);
......
...@@ -25,6 +25,6 @@ extern HOST_WIDE_INT new_alias_set (void); ...@@ -25,6 +25,6 @@ extern HOST_WIDE_INT new_alias_set (void);
extern HOST_WIDE_INT get_varargs_alias_set (void); extern HOST_WIDE_INT get_varargs_alias_set (void);
extern HOST_WIDE_INT get_frame_alias_set (void); extern HOST_WIDE_INT get_frame_alias_set (void);
extern void record_base_value (unsigned int, rtx, int); extern void record_base_value (unsigned int, rtx, int);
extern int can_address_p (tree); extern bool component_uses_parent_alias_set (tree);
#endif /* GCC_ALIAS_H */ #endif /* GCC_ALIAS_H */
...@@ -1546,9 +1546,9 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, ...@@ -1546,9 +1546,9 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
|| TREE_CODE (t) == SAVE_EXPR) || TREE_CODE (t) == SAVE_EXPR)
t = TREE_OPERAND (t, 0); t = TREE_OPERAND (t, 0);
/* If this expression can't be addressed (e.g., it contains a reference /* If this expression uses it's parent's alias set, mark it such
to a non-addressable field), show we don't change its alias set. */ that we won't change it. */
if (! can_address_p (t)) if (component_uses_parent_alias_set (t))
MEM_KEEP_ALIAS_SET_P (ref) = 1; MEM_KEEP_ALIAS_SET_P (ref) = 1;
/* If this is a decl, set the attributes of the MEM from it. */ /* If this is a decl, set the attributes of the MEM from it. */
......
...@@ -3810,8 +3810,7 @@ expand_assignment (tree to, tree from) ...@@ -3810,8 +3810,7 @@ expand_assignment (tree to, tree from)
done for MEM. Also set MEM_KEEP_ALIAS_SET_P if needed. */ done for MEM. Also set MEM_KEEP_ALIAS_SET_P if needed. */
if (volatilep) if (volatilep)
MEM_VOLATILE_P (to_rtx) = 1; MEM_VOLATILE_P (to_rtx) = 1;
if (component_uses_parent_alias_set (to))
if (!can_address_p (to))
MEM_KEEP_ALIAS_SET_P (to_rtx) = 1; MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
} }
......
...@@ -530,11 +530,6 @@ extern unsigned int case_values_threshold (void); ...@@ -530,11 +530,6 @@ extern unsigned int case_values_threshold (void);
/* Functions from alias.c */ /* Functions from alias.c */
#include "alias.h" #include "alias.h"
/* extern HOST_WIDE_INT get_varargs_alias_set (void); */
/* extern HOST_WIDE_INT get_frame_alias_set (void); */
/* extern void record_base_value (unsigned int, rtx, int); */
/* extern HOST_WIDE_INT new_alias_set (void); */
/* extern int can_address_p (tree); */
/* rtl.h and tree.h were included. */ /* rtl.h and tree.h were included. */
......
/* { dg-do compile } */
/* { dg-options "-O2" } */
/* { dg-final { scan-assembler "dont_delete" } } */
typedef struct { int x; } __attribute__((may_alias)) S;
extern void dont_delete (void);
void f(S *s, float *f)
{
s->x = 1;
*f = 0;
if (s->x != 1)
dont_delete ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment