summaryrefslogtreecommitdiff
path: root/gcc/tree-sra.c
diff options
context:
space:
mode:
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2010-01-04 18:25:14 +0000
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2010-01-04 18:25:14 +0000
commit95feb4d6040b4bf54ebe564b2e7fed301b578165 (patch)
tree2bd5e799a71fd4bad1be6baf56c1c08859e98e2e /gcc/tree-sra.c
parent7103fda3ffe6c2ca02dc7e19a457be1e3a594adb (diff)
downloadgcc-95feb4d6040b4bf54ebe564b2e7fed301b578165.tar.gz
2010-01-04 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/42398 * tree-sra.c (struct access): Removed flag grp_different_types. (dump_access): Do not dump the removed flag. (sort_and_splice_var_accesses): Do not set the removed flag. (sra_modify_expr): Check for type compatibility directly. * testsuite/gcc.c-torture/compile/pr42398.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155631 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r--gcc/tree-sra.c26
1 files changed, 6 insertions, 20 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 65d270ff2d1..f45169277e7 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -199,10 +199,6 @@ struct access
BIT_FIELD_REF? */
unsigned grp_partial_lhs : 1;
- /* Does this group contain accesses to different types? (I.e. through a union
- or a similar mechanism). */
- unsigned grp_different_types : 1;
-
/* Set when a scalar replacement should be created for this variable. We do
the decision and creation at different places because create_tmp_var
cannot be called from within FOR_EACH_REFERENCED_VAR. */
@@ -343,14 +339,12 @@ dump_access (FILE *f, struct access *access, bool grp)
fprintf (f, ", grp_write = %d, grp_read = %d, grp_hint = %d, "
"grp_covered = %d, grp_unscalarizable_region = %d, "
"grp_unscalarized_data = %d, grp_partial_lhs = %d, "
- "grp_different_types = %d, grp_to_be_replaced = %d, "
- "grp_maybe_modified = %d, "
+ "grp_to_be_replaced = %d, grp_maybe_modified = %d, "
"grp_not_necessarilly_dereferenced = %d\n",
access->grp_write, access->grp_read, access->grp_hint,
access->grp_covered, access->grp_unscalarizable_region,
access->grp_unscalarized_data, access->grp_partial_lhs,
- access->grp_different_types, access->grp_to_be_replaced,
- access->grp_maybe_modified,
+ access->grp_to_be_replaced, access->grp_maybe_modified,
access->grp_not_necessarilly_dereferenced);
else
fprintf (f, ", write = %d, grp_partial_lhs = %d\n", access->write,
@@ -1434,7 +1428,6 @@ sort_and_splice_var_accesses (tree var)
bool grp_read = !access->write;
bool multiple_reads = false;
bool grp_partial_lhs = access->grp_partial_lhs;
- bool grp_different_types = false;
bool first_scalar = is_gimple_reg_type (access->type);
bool unscalarizable_region = access->grp_unscalarizable_region;
@@ -1466,7 +1459,6 @@ sort_and_splice_var_accesses (tree var)
grp_read = true;
}
grp_partial_lhs |= ac2->grp_partial_lhs;
- grp_different_types |= !types_compatible_p (access->type, ac2->type);
unscalarizable_region |= ac2->grp_unscalarizable_region;
relink_to_new_repr (access, ac2);
@@ -1485,7 +1477,6 @@ sort_and_splice_var_accesses (tree var)
access->grp_read = grp_read;
access->grp_hint = multiple_reads;
access->grp_partial_lhs = grp_partial_lhs;
- access->grp_different_types = grp_different_types;
access->grp_unscalarizable_region = unscalarizable_region;
if (access->first_link)
add_access_to_work_queue (access);
@@ -2141,11 +2132,9 @@ sra_modify_expr (tree *expr, gimple_stmt_iterator *gsi, bool write,
We also want to use this when accessing a complex or vector which can
be accessed as a different type too, potentially creating a need for
- type conversion (see PR42196). */
- if (!is_gimple_reg_type (type)
- || (access->grp_different_types
- && (TREE_CODE (type) == COMPLEX_TYPE
- || TREE_CODE (type) == VECTOR_TYPE)))
+ type conversion (see PR42196) and when scalarized unions are involved
+ in assembler statements (see PR42398). */
+ if (!useless_type_conversion_p (type, access->type))
{
tree ref = access->base;
bool ok;
@@ -2176,10 +2165,7 @@ sra_modify_expr (tree *expr, gimple_stmt_iterator *gsi, bool write,
}
}
else
- {
- gcc_assert (useless_type_conversion_p (type, access->type));
- *expr = repl;
- }
+ *expr = repl;
sra_stats.exprs++;
}