mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-15 23:11:25 +08:00
re PR tree-optimization/46111 (ICE: tree check: expected tree that contains 'decl minimal' structure, have 'mem_ref' in take_address_of, at tree-parloops.c:336 with -ftree-parallelize-loops -g)
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. From-SVN: r165765
This commit is contained in:
parent
4818e7b9f8
commit
c9a410f028
@ -1,3 +1,8 @@
|
||||
2010-10-21 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/46111
|
||||
* tree-parloops.c (take_address_of): Re-organize for MEM_REF.
|
||||
|
||||
2010-10-21 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
|
||||
|
||||
* config/s390/s390.md (*xordi3_cc): Mark xgrk as z196 only.
|
||||
|
@ -1,3 +1,8 @@
|
||||
2010-10-21 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/46111
|
||||
* g++.dg/torture/pr46111.C: New testcase.
|
||||
|
||||
2010-10-21 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/46067
|
||||
|
31
gcc/testsuite/g++.dg/torture/pr46111.C
Normal file
31
gcc/testsuite/g++.dg/torture/pr46111.C
Normal file
@ -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);
|
||||
}
|
@ -333,14 +333,23 @@ take_address_of (tree obj, tree type, edge entry, htab_t decl_address)
|
||||
handled_component_p (*var_p);
|
||||
var_p = &TREE_OPERAND (*var_p, 0))
|
||||
continue;
|
||||
uid = DECL_UID (*var_p);
|
||||
|
||||
/* 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 = build_addr (*var_p, current_function_decl);
|
||||
bvar = create_tmp_var (TREE_TYPE (addr), get_name (*var_p));
|
||||
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);
|
||||
@ -355,16 +364,14 @@ take_address_of (tree obj, tree type, edge entry, htab_t decl_address)
|
||||
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);
|
||||
}
|
||||
/* 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 (TREE_TYPE (name) != type)
|
||||
if (!useless_type_conversion_p (type, TREE_TYPE (name)))
|
||||
{
|
||||
name = force_gimple_operand (fold_convert (type, name), &stmts, true,
|
||||
NULL_TREE);
|
||||
|
Loading…
x
Reference in New Issue
Block a user