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]

Switch order in sra_walk_modify_expr


This fixes a number of ACATS tests, including c352001.  We discussed this
a while ago, but I wanted to verify this is what we agreed on.

Tested on x86_64-linux-gnu.

2004-11-24  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>

	* tree-sra.c (sra_walk_modify_expr): Handle RHS first, then LHS.

*** tree-sra.c	22 Nov 2004 20:02:16 -0000	2.45
--- tree-sra.c	24 Nov 2004 16:19:29 -0000
*************** sra_walk_modify_expr (tree expr, block_s
*** 806,809 ****
--- 806,834 ----
      }
  
+   /* If the RHS is scalarizable, handle it.  There are only two cases.  */
+   if (rhs_elt)
+     {
+       if (!rhs_elt->is_scalar)
+ 	fns->ldst (rhs_elt, lhs, bsi, false);
+       else
+ 	fns->use (rhs_elt, &TREE_OPERAND (expr, 1), bsi, false);
+     }
+ 
+   /* If it isn't scalarizable, there may be scalarizable variables within, so
+      check for a call or else walk the RHS to see if we need to do any
+      copy-in operations.  We need to do it before the LHS is scalarized so
+      that the statements get inserted in the proper place, before any
+      copy-out operations.  */
+   else
+     {
+       tree call = get_call_expr_in (rhs);
+       if (call)
+ 	sra_walk_call_expr (call, bsi, fns);
+       else
+ 	sra_walk_expr (&TREE_OPERAND (expr, 1), bsi, false, fns);
+     }
+ 
+   /* Likewise, handle the LHS being scalarizable.  We have cases similar
+      to those above, but also want to handle RHS being constant.  */
    if (lhs_elt)
      {
*************** sra_walk_modify_expr (tree expr, block_s
*** 835,863 ****
  	fns->use (lhs_elt, &TREE_OPERAND (expr, 0), bsi, true);
      }
-   else
-     {
-       /* LHS_ELT being null only means that the LHS as a whole is not a
- 	 scalarizable reference.  There may be occurrences of scalarizable
- 	 variables within, which implies a USE.  */
-       sra_walk_expr (&TREE_OPERAND (expr, 0), bsi, true, fns);
-     }
  
!   /* Likewise for the right-hand side.  The only difference here is that
!      we don't have to handle constants, and the RHS may be a call.  */
!   if (rhs_elt)
!     {
!       if (!rhs_elt->is_scalar)
! 	fns->ldst (rhs_elt, lhs, bsi, false);
!       else
! 	fns->use (rhs_elt, &TREE_OPERAND (expr, 1), bsi, false);
!     }
    else
!     {
!       tree call = get_call_expr_in (rhs);
!       if (call)
! 	sra_walk_call_expr (call, bsi, fns);
!       else
! 	sra_walk_expr (&TREE_OPERAND (expr, 1), bsi, false, fns);
!     }
  }
  
--- 860,869 ----
  	fns->use (lhs_elt, &TREE_OPERAND (expr, 0), bsi, true);
      }
  
!   /* Similarly to above, LHS_ELT being null only means that the LHS as a
!      whole is not a scalarizable reference.  There may be occurrences of
!      scalarizable variables within, which implies a USE.  */
    else
!     sra_walk_expr (&TREE_OPERAND (expr, 0), bsi, true, fns);
  }
  


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