Commit 6e7e772d by Diego Novillo Committed by Diego Novillo

tree-ssa-structalias.c (could_have_pointers): Tidy.


	* tree-ssa-structalias.c (could_have_pointers): Tidy.
	(get_constraint_for): Likewise.
	(do_structure_copy): Likewise.
	(find_func_aliases): Fix references to MODIFY_EXPR.
	(intra_create_variable_infos): Tidy.
	* tree-ssa-operands.c (add_virtual_operand): Add argument
	IS_CALL_SITE.
	When adding members of alias sets, if IS_CALL_SITE is true and
	the symbol is not call-clobbered, skip it.
	Adjust all callers.


testsuite/ChangeLog

	* gcc.dg/tree-ssa/20070302-1.c: New test.

From-SVN: r122484
parent 0618281a
2007-03-02 Diego Novillo <dnovillo@redhat.com>
* tree-ssa-structalias.c (could_have_pointers): Tidy.
(get_constraint_for): Likewise.
(do_structure_copy): Likewise.
(find_func_aliases): Fix references to MODIFY_EXPR.
(intra_create_variable_infos): Tidy.
* tree-ssa-operands.c (add_virtual_operand): Add argument
IS_CALL_SITE.
When adding members of alias sets, if IS_CALL_SITE is true and
the symbol is not call-clobbered, skip it.
Adjust all callers.
2007-03-02 Eric Botcazou <ebotcazou@adacore.com>
* config/alpha/alpha.c (alpha_gp_save_rtx): Insert the insns at the
......
2007-03-02 Diego Novillo <dnovillo@redhat.com>
* gcc.dg/tree-ssa/20070302-1.c: New test.
2007-03-02 Joseph Myers <joseph@codesourcery.com>
* gcc.target/powerpc/spe-unwind-1.c, g++.dg/eh/simd-5.C: New
/* { dg-do link } */
/* { dg-options "-O2" } */
struct A
{
int x;
float y;
};
volatile float X, Y;
int baz (struct A *z, struct A *y)
{
z->x = (int) X;
z->y = Y;
y->x = (int) X;
y->y = Y;
}
struct A B;
float foo (int i)
{
struct A *p, x, y, z;
p = (i > 10) ? &x : &z;
x.y = 3.0;
p->x += baz (&z, &y);
X = z.y;
Y = p->y;
/* This predicate should always evaluate to false. The call to
baz() is not a clobbering site for x.y. The operand scanner was
considering it a clobbering site for x.y because x.y is in the
alias set of a call-clobbered memory tag. */
if (x.y != 3.0)
link_error ();
}
main(int argc, char **argv)
{
foo (argc);
}
......@@ -142,6 +142,7 @@ static VEC(tree,heap) *build_vuses;
/* Bitmap obstack for our datastructures that needs to survive across
compilations of multiple functions. */
static bitmap_obstack operands_bitmap_obstack;
/* Set for building all the loaded symbols. */
static bitmap build_loads;
......@@ -1433,12 +1434,13 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
get_expr_operands. FULL_REF is a tree that contains the entire
pointer dereference expression, if available, or NULL otherwise.
OFFSET and SIZE come from the memory access expression that
generated this virtual operand. */
generated this virtual operand. IS_CALL_SITE is true if the
affected statement is a call site. */
static void
add_virtual_operand (tree var, stmt_ann_t s_ann, int flags,
tree full_ref, HOST_WIDE_INT offset,
HOST_WIDE_INT size)
HOST_WIDE_INT size, bool is_call_site)
{
bitmap aliases = NULL;
tree sym;
......@@ -1480,10 +1482,12 @@ add_virtual_operand (tree var, stmt_ann_t s_ann, int flags,
if (MTAG_P (var))
aliases = MTAG_ALIASES (var);
if (aliases == NULL)
{
if (s_ann && !gimple_aliases_computed_p (cfun))
s_ann->has_volatile_ops = true;
/* The variable is not aliased or it is an alias tag. */
if (flags & opf_def)
append_vdef (var);
......@@ -1508,7 +1512,13 @@ add_virtual_operand (tree var, stmt_ann_t s_ann, int flags,
al = referenced_var (i);
if (!access_can_touch_variable (full_ref, al, offset, size))
continue;
/* Call-clobbered tags may have non-call-clobbered
symbols in their alias sets. Ignore them if we are
adding VOPs for a call site. */
if (is_call_site && !is_call_clobbered (al))
continue;
none_added = false;
append_vdef (al);
}
......@@ -1529,6 +1539,13 @@ add_virtual_operand (tree var, stmt_ann_t s_ann, int flags,
al = referenced_var (i);
if (!access_can_touch_variable (full_ref, al, offset, size))
continue;
/* Call-clobbered tags may have non-call-clobbered
symbols in their alias sets. Ignore them if we are
adding VOPs for a call site. */
if (is_call_site && !is_call_clobbered (al))
continue;
none_added = false;
append_vuse (al);
}
......@@ -1575,7 +1592,7 @@ add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags)
append_use (var_p);
}
else
add_virtual_operand (var, s_ann, flags, NULL_TREE, 0, -1);
add_virtual_operand (var, s_ann, flags, NULL_TREE, 0, -1, false);
}
......@@ -1622,7 +1639,7 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags,
{
/* PTR has its own memory tag. Use it. */
add_virtual_operand (pi->name_mem_tag, s_ann, flags,
full_ref, offset, size);
full_ref, offset, size, false);
}
else
{
......@@ -1651,10 +1668,12 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags,
if (v_ann->symbol_mem_tag)
add_virtual_operand (v_ann->symbol_mem_tag, s_ann, flags,
full_ref, offset, size);
/* Aliasing information is missing; mark statement as volatile so we
won't optimize it out too actively. */
else if (s_ann && !gimple_aliases_computed_p (cfun)
full_ref, offset, size, false);
/* Aliasing information is missing; mark statement as
volatile so we won't optimize it out too actively. */
else if (s_ann
&& !gimple_aliases_computed_p (cfun)
&& (flags & opf_def))
s_ann->has_volatile_ops = true;
}
......@@ -1743,12 +1762,11 @@ add_call_clobber_ops (tree stmt, tree callee)
if (s_ann)
s_ann->makes_clobbering_call = true;
/* If we created .GLOBAL_VAR earlier, just use it. See compute_may_aliases
for the heuristic used to decide whether to create .GLOBAL_VAR or not. */
/* If we created .GLOBAL_VAR earlier, just use it. */
if (gimple_global_var (cfun))
{
tree var = gimple_global_var (cfun);
add_stmt_operand (&var, s_ann, opf_def);
add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1, true);
return;
}
......@@ -1772,10 +1790,13 @@ add_call_clobber_ops (tree stmt, tree callee)
if (TREE_CODE (var) == STRUCT_FIELD_TAG)
real_var = SFT_PARENT_VAR (var);
not_read = not_read_b ? bitmap_bit_p (not_read_b,
DECL_UID (real_var)) : false;
not_written = not_written_b ? bitmap_bit_p (not_written_b,
DECL_UID (real_var)) : false;
not_read = not_read_b
? bitmap_bit_p (not_read_b, DECL_UID (real_var))
: false;
not_written = not_written_b
? bitmap_bit_p (not_written_b, DECL_UID (real_var))
: false;
gcc_assert (!unmodifiable_var_p (var));
clobber_stats.clobbered_vars++;
......@@ -1789,7 +1810,7 @@ add_call_clobber_ops (tree stmt, tree callee)
tree call = get_call_expr_in (stmt);
if (call_expr_flags (call) & (ECF_CONST | ECF_PURE))
{
add_stmt_operand (&var, s_ann, opf_use);
add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
clobber_stats.unescapable_clobbers_avoided++;
continue;
}
......@@ -1804,12 +1825,12 @@ add_call_clobber_ops (tree stmt, tree callee)
{
clobber_stats.static_write_clobbers_avoided++;
if (!not_read)
add_stmt_operand (&var, s_ann, opf_use);
add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
else
clobber_stats.static_read_clobbers_avoided++;
}
else
add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1);
add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1, true);
}
}
......@@ -1831,7 +1852,7 @@ add_call_read_ops (tree stmt, tree callee)
if (gimple_global_var (cfun))
{
tree var = gimple_global_var (cfun);
add_stmt_operand (&var, s_ann, opf_use);
add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
return;
}
......@@ -1861,7 +1882,7 @@ add_call_read_ops (tree stmt, tree callee)
continue;
}
add_stmt_operand (&var, s_ann, opf_use | opf_implicit);
add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
}
}
......
......@@ -2312,9 +2312,11 @@ could_have_pointers (tree t)
{
tree type = TREE_TYPE (t);
if (POINTER_TYPE_P (type) || AGGREGATE_TYPE_P (type)
if (POINTER_TYPE_P (type)
|| AGGREGATE_TYPE_P (type)
|| TREE_CODE (type) == COMPLEX_TYPE)
return true;
return false;
}
......@@ -2524,6 +2526,7 @@ get_constraint_for (tree t, VEC (ce_s, heap) **results)
tree pttype = TREE_TYPE (TREE_TYPE (t));
get_constraint_for (exp, results);
/* Make sure we capture constraints to all elements
of an array. */
if ((handled_component_p (exp)
......@@ -3001,6 +3004,7 @@ do_structure_copy (tree lhsop, tree rhsop)
}
}
/* Update related alias information kept in AI. This is used when
building name tags, alias sets and deciding grouping heuristics.
STMT is the statement to process. This function also updates
......@@ -3326,9 +3330,9 @@ find_func_aliases (tree origt)
}
}
/* In IPA mode, we need to generate constraints to pass call
arguments through their calls. There are two case, either a
modify_expr when we are returning a value, or just a plain
call_expr when we are not. */
arguments through their calls. There are two cases, either a
GIMPLE_MODIFY_STMT when we are returning a value, or just a plain
CALL_EXPR when we are not. */
else if (in_ipa_mode
&& ((TREE_CODE (t) == GIMPLE_MODIFY_STMT
&& TREE_CODE (GIMPLE_STMT_OPERAND (t, 1)) == CALL_EXPR
......@@ -3399,6 +3403,7 @@ find_func_aliases (tree origt)
}
i++;
}
/* If we are returning a value, assign it to the result. */
if (lhsop)
{
......@@ -4099,8 +4104,8 @@ intra_create_variable_infos (void)
tree t;
struct constraint_expr lhs, rhs;
/* For each incoming pointer argument arg, ARG = ANYTHING or a
dummy variable if flag_argument_noalias > 2. */
/* For each incoming pointer argument arg, create the constraint ARG
= ANYTHING or a dummy variable if flag_argument_noalias is set. */
for (t = DECL_ARGUMENTS (current_function_decl); t; t = TREE_CHAIN (t))
{
varinfo_t p;
......
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