[PATCH] Fix PR52155
Richard Guenther
rguenther@suse.de
Mon Feb 6 14:53:00 GMT 2012
This fixes PR 52155.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
2012-02-06 Richard Guenther <rguenther@suse.de>
PR tree-optimization/52115
* tree-sra.c (access_has_replacements_p): New function.
(sra_modify_assign): Use it to decide whether a use is uninitialized.
* gcc.c-torture/compile/pr52115.c: New testcase.
Index: gcc/tree-sra.c
===================================================================
*** gcc/tree-sra.c (revision 183932)
--- gcc/tree-sra.c (working copy)
*************** access_has_children_p (struct access *ac
*** 440,445 ****
--- 440,459 ----
return acc && acc->first_child;
}
+ /* Return true iff ACC is (partly) covered by at least one replacement. */
+
+ static bool
+ access_has_replacements_p (struct access *acc)
+ {
+ struct access *child;
+ if (acc->grp_to_be_replaced)
+ return true;
+ for (child = acc->first_child; child; child = child->next_sibling)
+ if (access_has_replacements_p (child))
+ return true;
+ return false;
+ }
+
/* Return a vector of pointers to accesses for the variable given in BASE or
NULL if there is none. */
*************** sra_modify_assign (gimple *stmt, gimple_
*** 2992,3001 ****
sra_stats.exprs++;
}
else if (racc
- && !access_has_children_p (racc)
- && !racc->grp_to_be_replaced
&& !racc->grp_unscalarized_data
! && TREE_CODE (lhs) == SSA_NAME)
{
rhs = get_repl_default_def_ssa_name (racc);
modify_this_stmt = true;
--- 3006,3014 ----
sra_stats.exprs++;
}
else if (racc
&& !racc->grp_unscalarized_data
! && TREE_CODE (lhs) == SSA_NAME
! && !access_has_replacements_p (racc))
{
rhs = get_repl_default_def_ssa_name (racc);
modify_this_stmt = true;
Index: gcc/testsuite/gcc.c-torture/compile/pr52115.c
===================================================================
*** gcc/testsuite/gcc.c-torture/compile/pr52115.c (revision 0)
--- gcc/testsuite/gcc.c-torture/compile/pr52115.c (revision 0)
***************
*** 0 ****
--- 1,26 ----
+ struct S
+ {
+ float f;
+ long l;
+ };
+
+ extern int gi;
+ extern float gf;
+
+ long foo (long p)
+ {
+ struct S s;
+ float *pf;
+
+ s.l = p;
+
+ pf = &s.f;
+
+ pf++;
+ pf--;
+
+ gf = *pf + 3.3;
+ gi = *((short *)pf) + 2;
+
+ return s.l + 6;
+ }
More information about the Gcc-patches
mailing list