This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR46111
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 21 Oct 2010 12:36:12 +0200 (CEST)
- Subject: [PATCH] Fix PR46111
This fixes PR46111
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard.
2010-10-21 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46111
* tree-parloops.c (take_address_of): Re-organize for MEM_REF.
* g++.dg/torture/pr46111.C: New testcase.
Index: gcc/tree-parloops.c
===================================================================
*** gcc/tree-parloops.c (revision 165728)
--- gcc/tree-parloops.c (working copy)
*************** take_address_of (tree obj, tree type, ed
*** 333,346 ****
handled_component_p (*var_p);
var_p = &TREE_OPERAND (*var_p, 0))
continue;
- uid = DECL_UID (*var_p);
ielt.uid = uid;
dslot = htab_find_slot_with_hash (decl_address, &ielt, uid, INSERT);
if (!*dslot)
{
! addr = build_addr (*var_p, current_function_decl);
! bvar = create_tmp_var (TREE_TYPE (addr), get_name (*var_p));
add_referenced_var (bvar);
stmt = gimple_build_assign (bvar, addr);
name = make_ssa_name (bvar, stmt);
--- 333,353 ----
handled_component_p (*var_p);
var_p = &TREE_OPERAND (*var_p, 0))
continue;
+ /* Canonicalize the access to base on a MEM_REF. */
+ if (DECL_P (*var_p))
+ *var_p = build_simple_mem_ref (build_fold_addr_expr (*var_p));
+
+ /* Assign a canonical SSA name to the address of the base decl used
+ in the address and share it for all accesses and addresses based
+ on it. */
+ uid = DECL_UID (TREE_OPERAND (TREE_OPERAND (*var_p, 0), 0));
ielt.uid = uid;
dslot = htab_find_slot_with_hash (decl_address, &ielt, uid, INSERT);
if (!*dslot)
{
! addr = TREE_OPERAND (*var_p, 0);
! bvar = create_tmp_var (TREE_TYPE (addr), get_name (TREE_OPERAND (TREE_OPERAND (*var_p, 0), 0)));
add_referenced_var (bvar);
stmt = gimple_build_assign (bvar, addr);
name = make_ssa_name (bvar, stmt);
*************** take_address_of (tree obj, tree type, ed
*** 355,370 ****
else
name = ((struct int_tree_map *) *dslot)->to;
! if (var_p != &obj)
! {
! *var_p = build_simple_mem_ref (name);
! name = force_gimple_operand (build_addr (obj, current_function_decl),
! &stmts, true, NULL_TREE);
! if (!gimple_seq_empty_p (stmts))
! gsi_insert_seq_on_edge_immediate (entry, stmts);
! }
! if (TREE_TYPE (name) != type)
{
name = force_gimple_operand (fold_convert (type, name), &stmts, true,
NULL_TREE);
--- 362,375 ----
else
name = ((struct int_tree_map *) *dslot)->to;
! /* Express the address in terms of the canonical SSA name. */
! TREE_OPERAND (*var_p, 0) = name;
! name = force_gimple_operand (build_addr (obj, current_function_decl),
! &stmts, true, NULL_TREE);
! if (!gimple_seq_empty_p (stmts))
! gsi_insert_seq_on_edge_immediate (entry, stmts);
! if (!useless_type_conversion_p (type, TREE_TYPE (name)))
{
name = force_gimple_operand (fold_convert (type, name), &stmts, true,
NULL_TREE);
Index: gcc/testsuite/g++.dg/torture/pr46111.C
===================================================================
*** gcc/testsuite/g++.dg/torture/pr46111.C (revision 0)
--- gcc/testsuite/g++.dg/torture/pr46111.C (revision 0)
***************
*** 0 ****
--- 1,31 ----
+ // { dg-do compile }
+ // { dg-options "-ftree-parallelize-loops=2 -g" }
+
+ struct A
+ {
+ int zero ()
+ {
+ return 0;
+ }
+ };
+
+ static inline void
+ bar (int)
+ {
+ }
+
+ struct B
+ {
+ struct A a;
+ B (int n)
+ {
+ for (int i = 0; i < n; i++)
+ bar (a.zero ());
+ }
+ };
+
+ void
+ foo (int n)
+ {
+ struct B b (n);
+ }