This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);
+ }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]