2010-12-09 Martin Jambor <mjambor@suse.cz>
+ * ipa-prop.h (struct ipa_parm_adjustment): New field alias_ptr_type.
+ * ipa-prop.c (ipa_modify_call_arguments): Use it.
+ * tree-sra.c (splice_param_accesses): Test that all accesses have the
+ same alias reference type.
+ (turn_representatives_into_adjustments): Set alias_ptr_type of the
+ adjustment.
+
+2010-12-09 Martin Jambor <mjambor@suse.cz>
+
PR middle-end/46734
* tree-sra.c (splice_param_accesses): Check that there are not
multiple ADDRESSABLE types.
base = gimple_call_arg (stmt, adj->base_index);
loc = EXPR_LOCATION (base);
- if (TREE_CODE (base) == ADDR_EXPR
- && DECL_P (TREE_OPERAND (base, 0)))
- off = build_int_cst (TREE_TYPE (base),
+ if (TREE_CODE (base) != ADDR_EXPR
+ && POINTER_TYPE_P (TREE_TYPE (base)))
+ off = build_int_cst (adj->alias_ptr_type,
adj->offset / BITS_PER_UNIT);
- else if (TREE_CODE (base) != ADDR_EXPR
- && POINTER_TYPE_P (TREE_TYPE (base)))
- off = build_int_cst (TREE_TYPE (base), adj->offset / BITS_PER_UNIT);
else
{
HOST_WIDE_INT base_offset;
if (!base)
{
base = build_fold_addr_expr (prev_base);
- off = build_int_cst (reference_alias_ptr_type (prev_base),
+ off = build_int_cst (adj->alias_ptr_type,
adj->offset / BITS_PER_UNIT);
}
else if (TREE_CODE (base) == MEM_REF)
{
- off = build_int_cst (TREE_TYPE (TREE_OPERAND (base, 1)),
+ off = build_int_cst (adj->alias_ptr_type,
base_offset
+ adj->offset / BITS_PER_UNIT);
off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
}
else
{
- off = build_int_cst (reference_alias_ptr_type (prev_base),
+ off = build_int_cst (adj->alias_ptr_type,
base_offset
+ adj->offset / BITS_PER_UNIT);
base = build_fold_addr_expr (base);
while (i < access_count)
{
bool modification;
+ tree a1_alias_type;
access = VEC_index (access_p, access_vec, i);
modification = access->write;
if (access_precludes_ipa_sra_p (access))
return NULL;
+ a1_alias_type = reference_alias_ptr_type (access->expr);
/* Access is about to become group representative unless we find some
nasty overlap which would preclude us from breaking this parameter
if (access_precludes_ipa_sra_p (ac2)
|| (ac2->type != access->type
&& (TREE_ADDRESSABLE (ac2->type)
- || TREE_ADDRESSABLE (access->type))))
+ || TREE_ADDRESSABLE (access->type)))
+ || (reference_alias_ptr_type (ac2->expr) != a1_alias_type))
return NULL;
modification |= ac2->write;
adj->base_index = index;
adj->base = repr->base;
adj->type = repr->type;
+ adj->alias_ptr_type = reference_alias_ptr_type (repr->expr);
adj->offset = repr->offset;
adj->by_ref = (POINTER_TYPE_P (TREE_TYPE (repr->base))
&& (repr->grp_maybe_modified