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]

[lno] Refine wrap-around matched cases


Hi,

In the pattern of wrap-around variables fall all the expressions under
the form: "a = b op c".  

The gimplifier splits complex expression using temporary variables,
ie. the expression "i = i + j + 2" is transformed into:

    temp_var = i + j
    i = temp_var + 2

The analyzer conservatively processed the "i = temp_var + 2" as a
wrap-around variable.  This patch refines the behaviour of the
analyzer in these cases, by reconstructing the non-gimple tree.

For the moment, there is no way to represent wrap-around variables,
but I plan to recycle the PERIODIC_CHREC node into a PEEL_CHREC node.

Bootstrapped on i686-pc-linux-gnu.

2004-01-12  Sebastian Pop  <s.pop@laposte.net>

	* tree-chrec.c (chrec_fold_plus, chrec_fold_multiply): Verify
	that there is no chrecs nested in the operands before calling
	the folder.
	(evolution_function_in_loop_num): When there is no evolution
	in the loop, return the initial condition.
	(evolution_part_in_loop_num): When there is no evolution
	in the loop, return NULL_TREE.
	(chrec_eval_next_init_cond): Adapt the function for the
	multivariate case.  
	(tree_contains_chrecs): Avoid the use of double negation.
	* tree-chrec.h (chrec_eval_next_init_cond): Add a parameter
	for the dimension in which to evaluate the variation.
	* tree-scalar-evolution.c (is_ssa_name_a_version_of_variable, 
	expression_contains_variable_p, remove_variable_from_expression, 
	analyze_non_gimple_initial_condition, matched_an_increment, 
	matched_an_exponentiation, matched_a_wrap_around,
	matched_an_arithmetic_wrap_around,
	evolution_of_phi_already_analyzed_p): New static functions.
	(scev_analyze_modify_expr): Use these functions.  Refine the
	cases detected as wrap-around variables. 
	(analyze_initial_condition): Don't erase the evolution in the
	previous dimensions when computing the initial condition for a
	new loop.
	(analyze_evolution_in_loop): Call the scev_analyze_modify_expr
	on the tree node, not on its evolution.
	(scev_follow_ssa_edge): In the case of an inner loop-phi-node,
	when the outer edge is a phi-node follow up the edge.
	(scev_follow_ssa_edge): Avoid the analysis of the inner loop
	when it has already been analyzed.
	(merge_evolutions): Refine the operation for zero, one, and
	more branches of evolutions.

testsuite/

2004-01-12  Sebastian Pop  <s.pop@laposte.net>
            Dorit Naishlos  <dorit@il.ibm.com>

	* gcc.dg/tree-ssa-chrec/ssa-chrec-53.c: New test.
	* gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.scev: New.
	* gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.alldd: New.
 

Index: tree-chrec.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-chrec.c,v
retrieving revision 1.1.2.2
diff -c -3 -p -r1.1.2.2 tree-chrec.c
*** tree-chrec.c	9 Jan 2004 12:15:53 -0000	1.1.2.2
--- tree-chrec.c	12 Jan 2004 13:43:52 -0000
*************** chrec_fold_plus (tree op0,
*** 988,994 ****
  	case SSA_NAME:
  	case VAR_DECL:
  	case PARM_DECL:
! 	  if (TREE_CODE (TREE_TYPE (op0)) != REAL_TYPE
  	      && TREE_CODE (TREE_TYPE (op0)) != REAL_TYPE)
  	    return tree_fold_int_plus (op0, op1);
  	  
--- 988,996 ----
  	case SSA_NAME:
  	case VAR_DECL:
  	case PARM_DECL:
! 	  if (tree_does_not_contain_chrecs (op0)
! 	      && tree_does_not_contain_chrecs (op1)
! 	      && TREE_CODE (TREE_TYPE (op0)) != REAL_TYPE
  	      && TREE_CODE (TREE_TYPE (op0)) != REAL_TYPE)
  	    return tree_fold_int_plus (op0, op1);
  	  
*************** chrec_fold_multiply (tree op0,
*** 1191,1197 ****
  	case VAR_DECL:
  	case PARM_DECL:
  	  /* testsuite/.../ssa-chrec-45.c.  */
! 	  if (TREE_CODE (TREE_TYPE (op0)) != REAL_TYPE
  	      && TREE_CODE (TREE_TYPE (op0)) != REAL_TYPE)
  	    return tree_fold_int_multiply (op0, op1);
  	  
--- 1193,1201 ----
  	case VAR_DECL:
  	case PARM_DECL:
  	  /* testsuite/.../ssa-chrec-45.c.  */
! 	  if (tree_does_not_contain_chrecs (op0)
! 	      && tree_does_not_contain_chrecs (op1)
! 	      && TREE_CODE (TREE_TYPE (op0)) != REAL_TYPE
  	      && TREE_CODE (TREE_TYPE (op0)) != REAL_TYPE)
  	    return tree_fold_int_multiply (op0, op1);
  	  
*************** evolution_function_in_loop_num (tree chr
*** 1714,1719 ****
--- 1718,1728 ----
  	  (loop_num, 
  	   evolution_function_in_loop_num (CHREC_LEFT (chrec), loop_num), 
  	   CHREC_RIGHT (chrec));
+       
+       else if (CHREC_VARIABLE (chrec) < loop_num)
+ 	/* There is no evolution in this loop.  */
+ 	return initial_condition (chrec);
+       
        else
  	return evolution_function_in_loop_num (CHREC_LEFT (chrec), loop_num);
        
*************** evolution_function_in_loop_num (tree chr
*** 1723,1728 ****
--- 1732,1742 ----
  	  (loop_num,
  	   evolution_function_in_loop_num (CHREC_LEFT (chrec), loop_num),
  	   CHREC_RIGHT (chrec));
+       
+       else if (CHREC_VARIABLE (chrec) < loop_num)
+ 	/* There is no evolution in this loop.  */
+ 	return initial_condition (chrec);
+       
        else
  	return evolution_function_in_loop_num (CHREC_LEFT (chrec), loop_num);
        
*************** evolution_part_in_loop_num (tree chrec, 
*** 1760,1765 ****
--- 1774,1783 ----
  	       CHREC_RIGHT (chrec));
  	}
        
+       else if (CHREC_VARIABLE (chrec) < loop_num)
+ 	/* There is no evolution part in this loop.  */
+ 	return NULL_TREE;
+       
        else
  	return evolution_part_in_loop_num (CHREC_LEFT (chrec), loop_num);
        
*************** evolution_part_in_loop_num (tree chrec, 
*** 1777,1782 ****
--- 1795,1804 ----
  	       CHREC_RIGHT (chrec));
  	}
        
+       else if (CHREC_VARIABLE (chrec) < loop_num)
+ 	/* There is no evolution part in this loop.  */
+ 	return NULL_TREE;
+       
        else
  	return evolution_part_in_loop_num (CHREC_LEFT (chrec), loop_num);
        
*************** reset_evolution_in_loop (unsigned loop_n
*** 1813,1852 ****
  }
  
  
! /* Returns the new value of a variable after its execution, supposing
!    that CHREC is its evolution function.
     
     Example:  
!    chrec_eval_next_init_cond ({[1, 1], +, [2, 3], +, [10, 10]}) = [3, 4].  */
  
  tree 
! chrec_eval_next_init_cond (tree chrec)
  {
! #if defined ENABLE_CHECKING 
!   if (chrec == NULL_TREE)
!     abort ();
! #endif
    
    if (TREE_CODE (chrec) == POLYNOMIAL_CHREC
        || TREE_CODE (chrec) == EXPONENTIAL_CHREC)
      {
!       tree left, right;
!       
!       while (TREE_CODE (CHREC_LEFT (chrec)) == POLYNOMIAL_CHREC
! 	     || TREE_CODE (CHREC_LEFT (chrec)) == EXPONENTIAL_CHREC)
  	chrec = CHREC_LEFT (chrec);
        
!       left = CHREC_LEFT (chrec);
!       right = CHREC_RIGHT (chrec);
!       
!       while (TREE_CODE (right) == POLYNOMIAL_CHREC
! 	     || TREE_CODE (right) == EXPONENTIAL_CHREC)
! 	right = CHREC_LEFT (right);
        
!       return chrec_fold_plus (left, right);
      }
    
!   return chrec;
  }
  
  /* Merge the information contained in two intervals. 
--- 1835,1883 ----
  }
  
  
! /* Returns the value of the variable after one execution of the loop
!    LOOP_NB, supposing that CHREC is the evolution function of the
!    variable.
     
     Example:  
!    chrec_eval_next_init_cond (4, {{1, +, 3}_2, +, 10}_4) = 11.  */
  
  tree 
! chrec_eval_next_init_cond (unsigned loop_nb, 
! 			   tree chrec)
  {
!   tree init_cond;
    
+   init_cond = initial_condition (chrec);
+ 
    if (TREE_CODE (chrec) == POLYNOMIAL_CHREC
        || TREE_CODE (chrec) == EXPONENTIAL_CHREC)
      {
!       if (CHREC_VARIABLE (chrec) < loop_nb)
! 	/* There is no evolution in this dimension.  */
! 	return init_cond;
!       
!       while ((TREE_CODE (CHREC_LEFT (chrec)) == POLYNOMIAL_CHREC
! 	      || TREE_CODE (CHREC_LEFT (chrec)) == EXPONENTIAL_CHREC)
! 	     && CHREC_VARIABLE (CHREC_LEFT (chrec)) >= loop_nb)
  	chrec = CHREC_LEFT (chrec);
        
!       if (CHREC_VARIABLE (chrec) != loop_nb)
! 	/* There is no evolution in this dimension.  */
! 	return init_cond;
!       
!       if (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
! 	/* testsuite/.../ssa-chrec-14.c */
! 	return chrec_fold_plus (init_cond, 
! 				initial_condition (CHREC_RIGHT (chrec)));
        
!       else
! 	return chrec_fold_multiply (init_cond, 
! 				    initial_condition (CHREC_RIGHT (chrec)));
      }
    
!   else
!     return init_cond;
  }
  
  /* Merge the information contained in two intervals. 
*************** tree_contains_chrecs (tree expr)
*** 2565,2575 ****
    switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
      {
      case 2:
!       if (!tree_does_not_contain_chrecs (TREE_OPERAND (expr, 1)))
  	return true;
        
      case 1:
!       if (!tree_does_not_contain_chrecs (TREE_OPERAND (expr, 0)))
  	return true;
        
      default:
--- 2596,2606 ----
    switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
      {
      case 2:
!       if (tree_contains_chrecs (TREE_OPERAND (expr, 1)))
  	return true;
        
      case 1:
!       if (tree_contains_chrecs (TREE_OPERAND (expr, 0)))
  	return true;
        
      default:
Index: tree-chrec.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-chrec.h,v
retrieving revision 1.1.2.2
diff -c -3 -p -r1.1.2.2 tree-chrec.h
*** tree-chrec.h	9 Jan 2004 12:15:53 -0000	1.1.2.2
--- tree-chrec.h	12 Jan 2004 13:43:52 -0000
*************** extern tree initial_condition (tree);
*** 100,106 ****
  extern tree evolution_part_in_loop_num (tree, unsigned);
  extern tree evolution_function_in_loop_num (tree, unsigned);
  extern tree reset_evolution_in_loop (unsigned, tree, tree);
! extern tree chrec_eval_next_init_cond (tree);
  extern tree chrec_merge (tree, tree);
  extern tree build_polynomial_evolution_in_loop (unsigned, tree, tree);
  extern tree build_exponential_evolution_in_loop (unsigned, tree, tree);
--- 100,106 ----
  extern tree evolution_part_in_loop_num (tree, unsigned);
  extern tree evolution_function_in_loop_num (tree, unsigned);
  extern tree reset_evolution_in_loop (unsigned, tree, tree);
! extern tree chrec_eval_next_init_cond (unsigned, tree);
  extern tree chrec_merge (tree, tree);
  extern tree build_polynomial_evolution_in_loop (unsigned, tree, tree);
  extern tree build_exponential_evolution_in_loop (unsigned, tree, tree);
Index: tree-scalar-evolution.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-scalar-evolution.c,v
retrieving revision 1.1.2.6
diff -c -3 -p -r1.1.2.6 tree-scalar-evolution.c
*** tree-scalar-evolution.c	9 Jan 2004 12:15:53 -0000	1.1.2.6
--- tree-scalar-evolution.c	12 Jan 2004 13:43:52 -0000
*************** static void analyze_evolution          (
*** 140,146 ****
  static void analyze_evolution_scc      (varray_type);
  static void analyze_evolution_in_loop  (tree);
  static void scev_analyze_temporary_modify_expr (struct loop *, tree, tree);
! static void scev_analyze_modify_expr (unsigned, tree, tree, tree, tree *, tree *);
  static void scev_follow_ssa_edge       (tree, tree);
  static tree compute_value_on_exit_of_loop (tree);
  static void compute_overall_effect_of_inner_loop (tree, unsigned);
--- 140,161 ----
  static void analyze_evolution_scc      (varray_type);
  static void analyze_evolution_in_loop  (tree);
  static void scev_analyze_temporary_modify_expr (struct loop *, tree, tree);
! static tree is_ssa_name_a_version_of_variable (tree *, int *, void *);
! static inline bool expression_contains_variable_p (tree, tree);
! static tree remove_variable_from_expression (tree, tree, enum tree_code *);
! static void analyze_non_gimple_initial_condition (unsigned, tree, tree,
! 						  tree, tree, tree *, tree *);
! static void matched_an_increment (unsigned, tree, tree, tree, tree, 
! 				  tree *, tree *);
! static void matched_an_exponentiation (unsigned, tree, tree, tree, tree, 
! 				       tree *, tree *);
! static void matched_a_wrap_around (enum tree_code, unsigned, tree, tree, tree, 
! 				   tree *, tree *);
! static void matched_an_arithmetic_wrap_around (unsigned, tree, tree, 
! 					       tree *, tree *);
! static inline bool evolution_of_phi_already_analyzed_p (tree);
! static void scev_analyze_modify_expr (unsigned, tree, tree, tree, 
! 				      tree *, tree *);
  static void scev_follow_ssa_edge       (tree, tree);
  static tree compute_value_on_exit_of_loop (tree);
  static void compute_overall_effect_of_inner_loop (tree, unsigned);
*************** static void 
*** 497,503 ****
  analyze_initial_condition (tree loop_phi_node)
  {
    int i;
!   tree res = chrec_not_analyzed_yet;
    tree original_chrec;
    varray_type branch_chrecs;
    
--- 512,519 ----
  analyze_initial_condition (tree loop_phi_node)
  {
    int i;
!   tree new_initial_condition = chrec_not_analyzed_yet;
!   tree new_evolution = chrec_not_analyzed_yet;
    tree original_chrec;
    varray_type branch_chrecs;
    
*************** analyze_initial_condition (tree loop_phi
*** 570,589 ****
        
        VARRAY_PUSH_TREE (branch_chrecs, branch_effect);
      }
!   
    if (VARRAY_ACTIVE_SIZE (branch_chrecs) == 1)
!     res = VARRAY_TREE (branch_chrecs, 0);
    
    /* When there are multiple branches that go outside the loop, then
       the result is the merge of all these branches.  */
    else
!     res = merge_evolutions (original_chrec, branch_chrecs);
    
    varray_clear (branch_chrecs);
    
    set_scev_inner_value (PHI_RESULT (loop_phi_node), 
! 			initial_condition (res));
!   set_scev (0, SSA_NAME_VAR (PHI_RESULT (loop_phi_node)), res);
    
    DBG_S (fprintf (stderr, ")\n"));
  }
--- 586,610 ----
        
        VARRAY_PUSH_TREE (branch_chrecs, branch_effect);
      }
! 
    if (VARRAY_ACTIVE_SIZE (branch_chrecs) == 1)
!     new_initial_condition = initial_condition (VARRAY_TREE (branch_chrecs, 0));
    
    /* When there are multiple branches that go outside the loop, then
       the result is the merge of all these branches.  */
    else
!     new_initial_condition = initial_condition 
!       (merge_evolutions (original_chrec, branch_chrecs));
!   
!   new_evolution = replace_initial_condition (original_chrec, 
! 					     new_initial_condition);
    
    varray_clear (branch_chrecs);
    
    set_scev_inner_value (PHI_RESULT (loop_phi_node), 
! 			new_initial_condition);
!   
!   set_scev (0, SSA_NAME_VAR (PHI_RESULT (loop_phi_node)), new_evolution);
    
    DBG_S (fprintf (stderr, ")\n"));
  }
*************** analyze_evolution_in_loop (tree loop_phi
*** 639,645 ****
  		  scev_analyze_modify_expr 
  		    (loop_nb,
  		     PHI_RESULT (loop_phi_node),
! 		     evolution_at_version (loop_nb, arg), 
  		     loop_phi_node, 
  		     &evolution_function, 
  		     &effect_after_execution);
--- 660,666 ----
  		  scev_analyze_modify_expr 
  		    (loop_nb,
  		     PHI_RESULT (loop_phi_node),
! 		     arg,
  		     loop_phi_node, 
  		     &evolution_function, 
  		     &effect_after_execution);
*************** scev_analyze_temporary_modify_expr (stru
*** 834,839 ****
--- 855,1272 ----
    DBG_S (fprintf (stderr, ")\n"));
  }
  
+ /* Helper function for walk_tree.  Determines whether the tree pointer
+    TP is a version of the variable DATA.  */
+ 
+ static tree
+ is_ssa_name_a_version_of_variable (tree *tp, 
+ 				   int *walk_subtrees ATTRIBUTE_UNUSED,
+ 				   void *data)
+ {
+   tree *variable = (tree *) data;
+   
+   if (TREE_CODE (*tp) == SSA_NAME
+       && SSA_NAME_VAR (*tp) == *variable)
+     return *tp;
+   
+   else
+     return NULL_TREE;
+ }
+ 
+ /* Determines whether EXPR contains versions of VARIABLE.  */
+ 
+ static inline bool
+ expression_contains_variable_p (tree expr, 
+ 				tree variable)
+ {
+   tree res = walk_tree (&expr, is_ssa_name_a_version_of_variable, &variable, NULL);
+   
+   return (res != NULL_TREE);
+ }
+ 
+ /* Strips the first occurrence of VARIABLE from EXPR, and return the
+    tree_code of the subexpression that was deleted from RES.  */
+ 
+ static tree
+ remove_variable_from_expression (tree variable, 
+ 				 tree expr, 
+ 				 enum tree_code *code)
+ {
+   switch (TREE_CODE (expr))
+     {
+     case PLUS_EXPR:
+       if (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
+ 	  && SSA_NAME_VAR (TREE_OPERAND (expr, 0)) == variable)
+ 	{
+ 	  *code = PLUS_EXPR;
+ 	  return TREE_OPERAND (expr, 1);
+ 	}
+       
+       else if (TREE_CODE (TREE_OPERAND (expr, 1)) == SSA_NAME
+ 	       && SSA_NAME_VAR (TREE_OPERAND (expr, 1)) == variable)
+ 	{
+ 	  *code = PLUS_EXPR;
+ 	  return TREE_OPERAND (expr, 0);
+ 	}
+       
+       else 
+ 	{
+ 	  tree opnd0, opnd1;
+ 	  
+ 	  opnd0 = remove_variable_from_expression 
+ 	    (variable, TREE_OPERAND (expr, 0), code);
+ 	  
+ 	  /* When the node has been found in opnd0, don't search for
+ 	     it in opnd1.  */
+ 	  if (*code != NOP_EXPR)
+ 	    opnd1 = TREE_OPERAND (expr, 1);
+ 	  
+ 	  else
+ 	    opnd1 = remove_variable_from_expression 
+ 	      (variable, TREE_OPERAND (expr, 1), code);
+ 	  
+ 	  return build (PLUS_EXPR, TREE_TYPE (expr), opnd0, opnd1);
+ 	}
+       
+     case MULT_EXPR:
+       if (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
+ 	  && SSA_NAME_VAR (TREE_OPERAND (expr, 0)) == variable)
+ 	{
+ 	  *code = MULT_EXPR;
+ 	  return TREE_OPERAND (expr, 1);
+ 	}
+       
+       else if (TREE_CODE (TREE_OPERAND (expr, 1)) == SSA_NAME
+ 	       && SSA_NAME_VAR (TREE_OPERAND (expr, 1)) == variable)
+ 	{
+ 	  *code = MULT_EXPR;
+ 	  return TREE_OPERAND (expr, 0);
+ 	}
+       
+       else 
+ 	{
+ 	  tree opnd0, opnd1;
+ 	  
+ 	  opnd0 = remove_variable_from_expression 
+ 	    (variable, TREE_OPERAND (expr, 0), code);
+ 	  
+ 	  /* When the node has been found in opnd0, don't search for
+ 	     it in opnd1.  */
+ 	  if (*code != NOP_EXPR)
+ 	    opnd1 = TREE_OPERAND (expr, 1);
+ 	  
+ 	  else
+ 	    opnd1 = remove_variable_from_expression 
+ 	      (variable, TREE_OPERAND (expr, 1), code);
+ 	  
+ 	  return build (MULT_EXPR, TREE_TYPE (expr), opnd0, opnd1);
+ 	}
+       
+     default:
+       switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
+ 	{
+ 	case 2:
+ 	  {
+ 	    tree opnd0, opnd1;
+ 	    
+ 	    opnd0 = remove_variable_from_expression 
+ 	      (variable, TREE_OPERAND (expr, 0), code);
+ 	    
+ 	    /* When the node has been found in opnd0, don't search for
+ 	       it in opnd1.  */
+ 	    if (*code != NOP_EXPR)
+ 	      opnd1 = TREE_OPERAND (expr, 1);
+ 	    
+ 	    else
+ 	      opnd1 = remove_variable_from_expression 
+ 		(variable, TREE_OPERAND (expr, 1), code);
+ 	    return build (TREE_CODE (expr), TREE_TYPE (expr), opnd0, opnd1);
+ 	  }
+ 	  
+ 	case 1:
+ 	  {
+ 	    tree opnd0 = remove_variable_from_expression 
+ 	      (variable, TREE_OPERAND (expr, 0), code);
+ 	    
+ 	    return build1 (TREE_CODE (expr), TREE_TYPE (expr), opnd0);
+ 	  }
+ 	  
+ 	default:
+ 	  return expr;
+ 	}
+     }
+ }
+ 
+ /* When the gimplifier transforms an assignment into
+ 
+    temp_var = i + j;
+    i = temp_var + 2;
+    
+    the scalar evolution analyzer reconstructs the tree and ends to
+    analyze the expression "i = i + j + 2".  This function deals with
+    these reconstructed expressions.  */
+ 
+ static void
+ analyze_non_gimple_initial_condition (unsigned loop_nb, 
+ 				      tree opnd0,
+ 				      tree chrec_before,
+ 				      tree chrec1,
+ 				      tree init_cond,
+ 				      tree *evolution_function, 
+ 				      tree *effect_after_execution)
+ {
+   tree stripped_expr;
+   tree init_cond_chrec_before;
+   enum tree_code code = NOP_EXPR;
+   
+   stripped_expr = remove_variable_from_expression 
+     (SSA_NAME_VAR (opnd0), init_cond, &code);
+   init_cond_chrec_before = initial_condition (chrec_before);
+   
+   switch (code)
+     {
+     case PLUS_EXPR:
+       {
+ 	tree to_be_added = replace_initial_condition 
+ 	  (chrec1, stripped_expr);
+ 	
+ 	*evolution_function = add_to_evolution 
+ 	  (loop_nb, init_cond_chrec_before, to_be_added);
+ 	*effect_after_execution = chrec_eval_next_init_cond 
+ 	  (loop_nb, *evolution_function);
+ 	break;
+       }
+       
+     case MULT_EXPR:
+       {
+ 	tree to_be_multiplied = replace_initial_condition 
+ 	  (chrec1, stripped_expr);
+ 	
+ 	*evolution_function = multiply_evolution
+ 	  (loop_nb, init_cond_chrec_before, to_be_multiplied);
+ 	*effect_after_execution = chrec_eval_next_init_cond 
+ 	  (loop_nb, *evolution_function);
+ 	break;
+       }
+   
+     default:
+       *effect_after_execution = chrec1;
+       *evolution_function = reset_evolution_in_loop 
+ 	(loop_nb, chrec_before, chrec_top);
+       break;
+     }
+ }
+ 
+ /* The following pattern has been matched: "a_1 = a_2 + ...".
+    OPND10 is "a_2", OPND11 is the rest "...".
+    This function updates the EVOLUTION_FUNCTION and the
+    EFFECT_AFTER_EXECUTION consequently.  */
+ 
+ static void
+ matched_an_increment (unsigned loop_nb, 
+ 		      tree var, 
+ 		      tree opnd10, 
+ 		      tree opnd11,
+ 		      tree halting_phi,
+ 		      tree *evolution_function, 
+ 		      tree *effect_after_execution)
+ {
+   tree upper_chain = SSA_NAME_DEF_STMT (opnd10);
+   tree chrec10, chrec11, chrec_before;
+   tree to_be_added;
+   
+   /* Recursively construct the SSA path.  */
+   scev_follow_ssa_edge (upper_chain, halting_phi);
+   
+   /* Analyze the assignment on the return walk.  */
+   
+   chrec_before = get_scev (0, var);
+   if (chrec_should_remain_symbolic (chrec_before))
+     /* KEEP_IT_SYMBOLIC.  */
+     chrec_before = opnd10;
+   
+   chrec10 = evolution_at_version (loop_nb, opnd10);
+   chrec11 = evolution_at_version (loop_nb, opnd11);
+   
+   if (chrec_should_remain_symbolic (chrec11))
+     /* KEEP_IT_SYMBOLIC.  
+        Don't propagate unknown values, but instead, 
+        keep the evolution function under a symbolic 
+        form.  Example: testsuite/.../ssa-chrec-17.c.  */
+     to_be_added = opnd11;
+   
+   else
+     to_be_added = chrec11;
+   
+   *effect_after_execution = chrec_fold_plus 
+     (initial_condition (chrec10), 
+      initial_condition (to_be_added));
+   
+   *evolution_function = add_to_evolution 
+     (loop_nb, chrec_before, to_be_added);
+ }
+ 
+ /* The following pattern has been matched: "a_1 = a_2 * ...".
+    OPND10 is "a_2", OPND11 is the rest "...".
+    This function updates the EVOLUTION_FUNCTION and the
+    EFFECT_AFTER_EXECUTION consequently.  */
+ 
+ static void
+ matched_an_exponentiation (unsigned loop_nb, 
+ 			   tree var, 
+ 			   tree opnd10, 
+ 			   tree opnd11,
+ 			   tree halting_phi,
+ 			   tree *evolution_function, 
+ 			   tree *effect_after_execution)
+ {
+   tree upper_chain = SSA_NAME_DEF_STMT (opnd10);
+   tree chrec10, chrec11, chrec_before;
+   tree to_be_multiplied;
+   
+   /* Recursively construct the SSA path.  */
+   scev_follow_ssa_edge (upper_chain, halting_phi);
+   /* Then, analyze the assignment on the return walk.  */
+   
+   chrec_before = get_scev (0, var);
+   if (chrec_should_remain_symbolic (chrec_before))
+     /* KEEP_IT_SYMBOLIC.  */
+     chrec_before = opnd10;
+   
+   chrec10 = evolution_at_version (loop_nb, opnd10);
+   chrec11 = evolution_at_version (loop_nb, opnd11);
+   if (chrec_should_remain_symbolic (chrec11))
+     /* KEEP_IT_SYMBOLIC.  */
+     to_be_multiplied = opnd11;
+   else
+     to_be_multiplied = chrec11;
+   
+   *effect_after_execution = chrec_fold_multiply 
+     (initial_condition (chrec10), 
+      initial_condition (to_be_multiplied));
+   
+   *evolution_function = multiply_evolution 
+     (loop_nb, chrec_before, to_be_multiplied);
+ }
+ 
+ /* The following pattern has been matched: "a = b code c".  
+ 
+    This function updates the EVOLUTION_FUNCTION and the
+    EFFECT_AFTER_EXECUTION consequently.  */
+ 
+ static void
+ matched_a_wrap_around (enum tree_code code,
+ 		       unsigned loop_nb,
+ 		       tree var,
+ 		       tree opnd0, 
+ 		       tree opnd1, 
+ 		       tree *evolution_function, 
+ 		       tree *effect_after_execution)
+ {
+   tree opnd10, opnd11;
+   tree chrec10, chrec11;
+   tree init_cond, chrec1;
+   tree chrec_before;
+   
+   opnd10 = TREE_OPERAND (opnd1, 0);
+   opnd11 = TREE_OPERAND (opnd1, 1);
+   
+   chrec_before = get_scev (0, var);
+   if (chrec_should_remain_symbolic (chrec_before))
+     /* KEEP_IT_SYMBOLIC.  */
+     chrec_before = opnd1;
+   
+   chrec10 = evolution_at_version (loop_nb, opnd10);
+   chrec11 = evolution_at_version (loop_nb, opnd11);
+   
+   switch (code)
+     {
+     case PLUS_EXPR:
+       chrec1 = chrec_fold_plus (chrec10, chrec11);
+       break;
+       
+     case MINUS_EXPR:
+       chrec1 = chrec_fold_minus (chrec10, chrec11);
+       break;
+       
+     case MULT_EXPR:
+       chrec1 = chrec_fold_multiply (chrec10, chrec11);
+       break;
+       
+     default:
+       chrec1 = chrec_top;
+       break;
+     }
+   
+   init_cond = initial_condition (chrec1);
+   
+   /* If VAR occurs in the initial condition of opnd1
+      then the analyzed modify expression is not a
+      wrap-around: it is just an expression that has
+      been gimplified using temporary variables.  */
+   if (expression_contains_variable_p 
+       (init_cond, SSA_NAME_VAR (opnd0)))
+     analyze_non_gimple_initial_condition 
+       (loop_nb, opnd0, chrec_before, 
+        chrec1, init_cond,
+        evolution_function, effect_after_execution);
+   
+   else
+     {
+       /* FIXME wrap_around.  */
+       *effect_after_execution = chrec1;
+       *evolution_function = reset_evolution_in_loop 
+ 	(loop_nb, chrec_before, chrec_top);
+     }
+ }
+ 
+ /* The following pattern has been matched: "a_1 = b_2 - a_3".  
+    
+    This function updates the EVOLUTION_FUNCTION and the
+    EFFECT_AFTER_EXECUTION consequently.  */
+ 
+ static void
+ matched_an_arithmetic_wrap_around (unsigned loop_nb,
+ 				   tree var,
+ 				   tree opnd1, 
+ 				   tree *evolution_function, 
+ 				   tree *effect_after_execution)
+ {
+   /* FIXME arithmetic flip-flop.  */
+   tree opnd10, opnd11;
+   tree chrec10, chrec11;
+   tree chrec_before = get_scev (0, var);
+   if (chrec_should_remain_symbolic (chrec_before))
+     /* KEEP_IT_SYMBOLIC.  */
+     chrec_before = opnd1;
+   
+   opnd10 = TREE_OPERAND (opnd1, 0);
+   opnd11 = TREE_OPERAND (opnd1, 1);
+   
+   chrec10 = evolution_at_version (loop_nb, opnd10);
+   chrec11 = evolution_at_version (loop_nb, opnd11);
+   
+   *effect_after_execution = chrec_fold_minus (chrec10, chrec11);
+   *evolution_function = reset_evolution_in_loop 
+     (loop_nb, chrec_before, chrec_top);
+ }
+ 
+ /* Given a loop-phi-node RDEF, determines whether its evolution has
+    already been analyzed.  */
+ 
+ static inline bool
+ evolution_of_phi_already_analyzed_p (tree rdef)
+ {
+   /* Another way to check this property would be: "if all the edges
+      that enter the loop have been analyzed, then the loop-phi-node
+      has already been analyzed".  */
+   
+   return (evolution_part_in_loop_num 
+ 	  (get_scev (0, SSA_NAME_VAR (PHI_RESULT (rdef))), 
+ 	   loop_num (loop_of_stmt (rdef)))
+ 	  == NULL_TREE);
+ }
+ 
  /* Helper function for analyzing a modify expression "OPND0 = OPND1"
     in the context of loop LOOP_NB.  The EVOLUTION_FUNCTION is the new
     evolution function after having analyzed the statement, and the
*************** scev_analyze_modify_expr (unsigned loop_
*** 870,882 ****
      {
      case INTEGER_CST:
        {
! 	/* FIXME wrap_around:  
  	   This assignment is under the form "a_1 = 7".  */
! 	*effect_after_execution = chrec_top;
! 	*evolution_function = chrec_top;
  	break;
        }
! 	    
      case SSA_NAME:
        if (var == SSA_NAME_VAR (opnd1))
  	{
--- 1303,1320 ----
      {
      case INTEGER_CST:
        {
! 	/* FIXME wrap_around.
  	   This assignment is under the form "a_1 = 7".  */
! 	tree chrec_before = get_scev (0, var);
! 	if (chrec_should_remain_symbolic (chrec_before))
! 	  /* KEEP_IT_SYMBOLIC.  */
! 	  chrec_before = opnd1;
! 	
! 	*effect_after_execution = evolution_at_version (loop_nb, opnd1);
! 	*evolution_function = reset_evolution_in_loop (loop_nb, chrec_before, chrec_top);
  	break;
        }
!       
      case SSA_NAME:
        if (var == SSA_NAME_VAR (opnd1))
  	{
*************** scev_analyze_modify_expr (unsigned loop_
*** 884,898 ****
  	     This is a strange case: "a_1 = a_2".  */
  	  abort ();
  	}
        else
  	{
! 	  /* FIXME wrap_around:
! 	     This assignment is under the form: "a_1 = b_2".  */
! 	  *effect_after_execution = chrec_top;
! 	  *evolution_function = chrec_top;
  	}
        break;
! 	    
      case PLUS_EXPR:
        {
  	/* This case is under the form "opnd0 = opnd10 + opnd11".  */
--- 1322,1363 ----
  	     This is a strange case: "a_1 = a_2".  */
  	  abort ();
  	}
+       
+       /* This assignment is under the form: "a_1 = b_2".  */
        else
  	{
! 	  tree init_cond, chrec1;
! 	  tree chrec_before;
! 	  
! 	  chrec_before = get_scev (0, var);
! 	  if (chrec_should_remain_symbolic (chrec_before))
! 	    /* KEEP_IT_SYMBOLIC.  */
! 	    chrec_before = opnd1;
! 	  
! 	  chrec1 = evolution_at_version (loop_nb, opnd1);
! 	  init_cond = initial_condition (chrec1);
! 	  
! 	  /* If VAR occurs in the initial condition of opnd1
! 	     then the analyzed modify expression is not a
! 	     wrap-around: it is just an expression that has
! 	     been gimplified using temporary variables.  */
! 	  if (expression_contains_variable_p 
! 	      (init_cond, SSA_NAME_VAR (opnd0)))
! 	    analyze_non_gimple_initial_condition 
! 	      (loop_nb, opnd0, chrec_before, 
! 	       chrec1, init_cond,
! 	       evolution_function, effect_after_execution);
! 	  
! 	  else
! 	    {
! 	      /* FIXME wrap_around.  */
! 	      *effect_after_execution = chrec1;
! 	      *evolution_function = reset_evolution_in_loop 
! 		(loop_nb, chrec_before, chrec_top);
! 	    }
  	}
        break;
!       
      case PLUS_EXPR:
        {
  	/* This case is under the form "opnd0 = opnd10 + opnd11".  */
*************** scev_analyze_modify_expr (unsigned loop_
*** 907,948 ****
  	    /* Match an assignment under the form: 
  	       "a_1 = a_2 + ...".  */
  	    if (SSA_NAME_VAR (opnd10) == var)
! 	      {
! 		tree upper_chain = SSA_NAME_DEF_STMT (opnd10);
! 		tree chrec10, chrec11, chrec_before;
! 		tree to_be_added;
! 		      
! 		/* Recursively construct the SSA path.  */
! 		scev_follow_ssa_edge (upper_chain, halting_phi);
! 		      
! 		/* Analyze the assignment on the return walk.  */
! 
! 		chrec_before = get_scev (0, var);
! 		if (chrec_should_remain_symbolic (chrec_before))
! 		  /* KEEP_IT_SYMBOLIC.  */
! 		  chrec_before = opnd10;
! 		      
! 		chrec10 = evolution_at_version (loop_nb, opnd10);
! 		chrec11 = evolution_at_version (loop_nb, opnd11);
! 		      
! 		if (chrec_should_remain_symbolic (chrec11))
! 		  /* KEEP_IT_SYMBOLIC.  
! 		     Don't propagate unknown values, but instead, 
! 		     keep the evolution function under a symbolic 
! 		     form.  Example: testsuite/.../ssa-chrec-17.c.  */
! 		  to_be_added = opnd11;
! 		      
! 		else
! 		  to_be_added = chrec11;
! 		      
! 		*effect_after_execution = chrec_fold_plus 
! 		  (initial_condition (chrec10), 
! 		   initial_condition (to_be_added));
! 		      
! 		*evolution_function = add_to_evolution 
! 		  (loop_nb, chrec_before, to_be_added);
! 	      }
! 	    
  	    /* Otherwise the assignment is under the form: 
  	       "a_1 = b_2 + ...".  */
  	    else
--- 1372,1381 ----
  	    /* Match an assignment under the form: 
  	       "a_1 = a_2 + ...".  */
  	    if (SSA_NAME_VAR (opnd10) == var)
! 	      matched_an_increment 
! 		(loop_nb, var, opnd10, opnd11, halting_phi, 
! 		 evolution_function, effect_after_execution);
! 	      
  	    /* Otherwise the assignment is under the form: 
  	       "a_1 = b_2 + ...".  */
  	    else
*************** scev_analyze_modify_expr (unsigned loop_
*** 952,1000 ****
  		   "a_1 = b_2 + a_3".  */
  		if (TREE_CODE (opnd11) == SSA_NAME
  		    && SSA_NAME_VAR (opnd11) == var)
! 		  {
! 		    tree upper_chain = SSA_NAME_DEF_STMT (opnd11);
! 		    tree chrec10, chrec11, chrec_before;
! 		    tree to_be_added;
! 			  
! 		    /* Recursively construct the SSA path.  */
! 		    scev_follow_ssa_edge (upper_chain, halting_phi);
! 			  
! 		    /* Analyze the assignment on the return walk.  */
! 			  
! 		    chrec_before = get_scev (0, var);
! 		    if (chrec_should_remain_symbolic (chrec_before))
! 		      /* KEEP_IT_SYMBOLIC.  */
! 		      chrec_before = opnd11;
! 			  
! 		    chrec10 = evolution_at_version (loop_nb, opnd10);
! 		    chrec11 = evolution_at_version (loop_nb, opnd11);
! 		    if (chrec_should_remain_symbolic (chrec10))
! 		      /* KEEP_IT_SYMBOLIC.  */
! 		      to_be_added = opnd10;
! 			  
! 		    else
! 		      to_be_added = chrec10;
! 			  
! 		    *effect_after_execution = chrec_fold_plus 
! 		      (initial_condition (chrec11), 
! 		       initial_condition (to_be_added));
! 			  
! 		    *evolution_function = add_to_evolution 
! 		      (loop_nb, chrec_before, to_be_added);
! 		  }
  		
  		/* Match an assignment under the form: 
  		   "a_1 = b_2 + c_3".  */
  		else
! 		  {
! 		    /* FIXME wrap_around.  */
! 		    *effect_after_execution = chrec_top;
! 		    *evolution_function = chrec_top;
! 		  }
  	      }
  	  }
! 	      
  	else if (TREE_CODE (opnd11) == SSA_NAME)
  	  {
  	    if (SSA_NAME_VAR (opnd11) == var)
--- 1385,1403 ----
  		   "a_1 = b_2 + a_3".  */
  		if (TREE_CODE (opnd11) == SSA_NAME
  		    && SSA_NAME_VAR (opnd11) == var)
! 		  matched_an_increment
! 		    (loop_nb, var, opnd11, opnd10, halting_phi, 
! 		     evolution_function, effect_after_execution);
  		
  		/* Match an assignment under the form: 
  		   "a_1 = b_2 + c_3".  */
  		else
! 		  matched_a_wrap_around 
! 		    (PLUS_EXPR, loop_nb, var, opnd0, opnd1, 
! 		     evolution_function, effect_after_execution);
  	      }
  	  }
! 	
  	else if (TREE_CODE (opnd11) == SSA_NAME)
  	  {
  	    if (SSA_NAME_VAR (opnd11) == var)
*************** scev_analyze_modify_expr (unsigned loop_
*** 1006,1021 ****
  		   "a_1 = a_2 + 5".  */
  		abort ();
  	      }
! 		  
  	    else
! 	      {
! 		/* FIXME wrap_around:
! 		   The assignment is under the form: "a_1 = 5 + b_2.  */
! 		*effect_after_execution = chrec_top;
! 		*evolution_function = chrec_top;
! 	      }
  	  }
! 	      
  	else
  	  {
  	    /* The arguments do not contain SSA_NAMEs.  For
--- 1409,1422 ----
  		   "a_1 = a_2 + 5".  */
  		abort ();
  	      }
! 	    
! 	    /* The assignment is under the form: "a_1 = 5 + b_2.  */
  	    else
! 	      matched_a_wrap_around 
! 		(PLUS_EXPR, loop_nb, var, opnd0, opnd1, 
! 		 evolution_function, effect_after_execution);
  	  }
! 	
  	else
  	  {
  	    /* The arguments do not contain SSA_NAMEs.  For
*************** scev_analyze_modify_expr (unsigned loop_
*** 1086,1105 ****
  		   "a_1 = b_2 - a_3".  */
  		if (TREE_CODE (opnd11) == SSA_NAME
  		    && SSA_NAME_VAR (opnd11) == var)
! 		  {
! 		    /* FIXME arithmetic flip-flop.  */
! 		    *effect_after_execution = chrec_top;
! 		    *evolution_function = chrec_top;
! 		  }
  		
  		/* Otherwise the assignment is under the form: 
  		   "a_1 = b_2 - c_3".  */
  		else
! 		  {
! 		    /* FIXME wrap_around.  */
! 		    *effect_after_execution = chrec_top;
! 		    *evolution_function = chrec_top;
! 		  }
  	      }
  	  }
  	      
--- 1487,1502 ----
  		   "a_1 = b_2 - a_3".  */
  		if (TREE_CODE (opnd11) == SSA_NAME
  		    && SSA_NAME_VAR (opnd11) == var)
! 		  matched_an_arithmetic_wrap_around 
! 		    (loop_nb, var, opnd1, evolution_function, 
! 		     effect_after_execution);
  		
  		/* Otherwise the assignment is under the form: 
  		   "a_1 = b_2 - c_3".  */
  		else
! 		  matched_a_wrap_around 
! 		    (MINUS_EXPR, loop_nb, var, opnd0, opnd1, 
! 		     evolution_function, effect_after_execution);
  	      }
  	  }
  	      
*************** scev_analyze_modify_expr (unsigned loop_
*** 1109,1130 ****
  	    /* Match an assignment under the form: 
  	       "a_1 = 5 - a_2".  */
  	    if (SSA_NAME_VAR (opnd11) == var)
! 	      {
! 		/* FIXME arithmetic flip-flop.  */
! 		*effect_after_execution = chrec_top;
! 		*evolution_function = chrec_top;
! 	      }
  	    
  	    /* Otherwise the assignment is under the form: 
  	       "a_1 = 5 - b_2.  */
  	    else
! 	      {
! 		/* FIXME wrap_around.  */
! 		*effect_after_execution = chrec_top;
! 		*evolution_function = chrec_top;
! 	      }
  	  }
! 	      
  	else
  	  {
  	    /* The arguments do not contain SSA_NAMEs.  */
--- 1506,1523 ----
  	    /* Match an assignment under the form: 
  	       "a_1 = 5 - a_2".  */
  	    if (SSA_NAME_VAR (opnd11) == var)
! 	      matched_an_arithmetic_wrap_around 
! 		(loop_nb, var, opnd1, evolution_function, 
! 		 effect_after_execution);
  	    
  	    /* Otherwise the assignment is under the form: 
  	       "a_1 = 5 - b_2.  */
  	    else
! 	      matched_a_wrap_around
! 		(MINUS_EXPR, loop_nb, var, opnd0, opnd1, 
! 		 evolution_function, effect_after_execution);
  	  }
! 	
  	else
  	  {
  	    /* The arguments do not contain SSA_NAMEs.  */
*************** scev_analyze_modify_expr (unsigned loop_
*** 1148,1230 ****
  	    /* Match an assignment under the form: 
  	       "a_1 = a_2 * ...".  */
  	    if (SSA_NAME_VAR (opnd10) == var)
! 	      {
! 		tree upper_chain = SSA_NAME_DEF_STMT (opnd10);
! 		tree chrec10, chrec11, chrec_before;
! 		tree to_be_multiplied;
! 		      
! 		/* Recursively construct the SSA path.  */
! 		scev_follow_ssa_edge (upper_chain, halting_phi);
! 		/* Then, analyze the assignment on the return walk.  */
! 		      
! 		chrec_before = get_scev (0, var);
! 		if (chrec_should_remain_symbolic (chrec_before))
! 		  /* KEEP_IT_SYMBOLIC.  */
! 		  chrec_before = opnd10;
! 		      
! 		chrec10 = evolution_at_version (loop_nb, opnd10);
! 		chrec11 = evolution_at_version (loop_nb, opnd11);
! 		if (chrec_should_remain_symbolic (chrec11))
! 		  /* KEEP_IT_SYMBOLIC.  */
! 		  to_be_multiplied = opnd11;
! 		else
! 		  to_be_multiplied = chrec11;
! 		      
! 		*effect_after_execution = chrec_fold_multiply 
! 		  (initial_condition (chrec10), 
! 		   initial_condition (to_be_multiplied));
! 		
! 		*evolution_function = multiply_evolution 
! 		  (loop_nb, chrec_before, to_be_multiplied);
! 	      }
! 	  
  	    /* Otherwise the assignment is under the form: 
  	       "a_1 = b_2 * ...".  */
  	    else
  	      {
- 
  		/* Match an assignment under the form: 
  		   "a_1 = b_2 * a_3".  */
  		if (TREE_CODE (opnd11) == SSA_NAME
  		    && SSA_NAME_VAR (opnd11) == var)
! 		  {
! 		    tree upper_chain = SSA_NAME_DEF_STMT (opnd11);
! 		    tree chrec10, chrec11, chrec_before;
! 		    tree to_be_multiplied;
! 			  
! 		    /* Recursively construct the SSA path.  */
! 		    scev_follow_ssa_edge (upper_chain, halting_phi);
! 		    /* Then, analyze the assignment on the return walk.  */
! 
! 		    chrec_before = get_scev (0, var);
! 		    if (chrec_should_remain_symbolic (chrec_before))
! 		      /* KEEP_IT_SYMBOLIC.  */
! 		      chrec_before = opnd11;
! 			  
! 		    chrec10 = evolution_at_version (loop_nb, opnd10);
! 		    chrec11 = evolution_at_version (loop_nb, opnd11);
! 		    if (chrec_should_remain_symbolic (chrec10))
! 		      /* KEEP_IT_SYMBOLIC.  */
! 		      to_be_multiplied = opnd10;
! 		    else
! 		      to_be_multiplied = chrec10;
! 			  
! 		    *effect_after_execution = chrec_fold_multiply 
! 		      (initial_condition (chrec11), 
! 		       initial_condition (to_be_multiplied));
! 		    
! 		    *evolution_function = multiply_evolution 
! 		      (loop_nb, chrec_before, to_be_multiplied);
! 		  }
  		
  		/* Otherwise the assignment is under the form: 
  		   "a_1 = b_2 * c_3".  */
  		else
! 		  {
! 		    /* FIXME wrap_around.  */
! 		    *effect_after_execution = chrec_top;
! 		    *evolution_function = chrec_top;
! 		  }
  	      }
  	  }
  	      
--- 1541,1568 ----
  	    /* Match an assignment under the form: 
  	       "a_1 = a_2 * ...".  */
  	    if (SSA_NAME_VAR (opnd10) == var)
! 	      matched_an_exponentiation 
! 		(loop_nb, var, opnd10, opnd11, halting_phi, 
! 		 evolution_function, effect_after_execution);
! 	    
  	    /* Otherwise the assignment is under the form: 
  	       "a_1 = b_2 * ...".  */
  	    else
  	      {
  		/* Match an assignment under the form: 
  		   "a_1 = b_2 * a_3".  */
  		if (TREE_CODE (opnd11) == SSA_NAME
  		    && SSA_NAME_VAR (opnd11) == var)
! 		  matched_an_exponentiation 
! 		    (loop_nb, var, opnd11, opnd10, halting_phi, 
! 		     evolution_function, effect_after_execution);
  		
  		/* Otherwise the assignment is under the form: 
  		   "a_1 = b_2 * c_3".  */
  		else
! 		  matched_a_wrap_around
! 		    (MULT_EXPR, loop_nb, var, opnd0, opnd1, 
! 		     evolution_function, effect_after_execution);
  	      }
  	  }
  	      
*************** scev_analyze_modify_expr (unsigned loop_
*** 1244,1254 ****
  	    /* Otherwise the assignment is under the form: 
  	       "a_1 = 5 * b_2.  */
  	    else
! 	      {
! 		/* FIXME wrap_around.  */
! 		*effect_after_execution = chrec_top;
! 		*evolution_function = chrec_top;
! 	      }
  	  }
  	
  	else
--- 1582,1590 ----
  	    /* Otherwise the assignment is under the form: 
  	       "a_1 = 5 * b_2.  */
  	    else
! 	      matched_a_wrap_around 
! 		(MULT_EXPR, loop_nb, var, opnd0, opnd1, 
! 		 evolution_function, effect_after_execution);
  	  }
  	
  	else
*************** scev_analyze_modify_expr (unsigned loop_
*** 1262,1270 ****
        }
  	    
      default:
!       *effect_after_execution = chrec_top;
!       *evolution_function = chrec_top;
!       break;
      }
    
    DBG_S (fprintf (stderr, ")\n"));
--- 1598,1614 ----
        }
  	    
      default:
!       {
! 	tree chrec_before = get_scev (0, var);
! 	if (chrec_should_remain_symbolic (chrec_before))
! 	  /* KEEP_IT_SYMBOLIC.  */
! 	  chrec_before = opnd1;
! 	
! 	*effect_after_execution = chrec_top;
! 	*evolution_function = reset_evolution_in_loop 
! 	  (loop_nb, chrec_before, chrec_top);
! 	break;
!       }
      }
    
    DBG_S (fprintf (stderr, ")\n"));
*************** scev_follow_ssa_edge (tree rdef, 
*** 1343,1348 ****
--- 1687,1693 ----
  		      break;
  		      
  		    case PHI_NODE:
+ 		      scev_follow_ssa_edge (upper_branch, halting_phi);
  		      res = evolution_at_version 
  			(upper_num, PHI_RESULT (upper_branch));
  		      break;
*************** scev_follow_ssa_edge (tree rdef, 
*** 1357,1367 ****
  		}
  	    }
  	  
! 	  analyze_evolution_in_loop (rdef);
  	  
  	  /* After having determined the evolution in the inner loop,
  	     the analyzer computes the overall effect of the inner
! 	     loop on the analyzed variable.  
  	     
  	     Example:  
  	     
--- 1702,1715 ----
  		}
  	    }
  	  
! 	  /* Avoid the analysis of the inner loop when it has already
! 	     been analyzed: testsuite/.../ssa-chrec-01.c  */
! 	  if (evolution_of_phi_already_analyzed_p (rdef))
! 	    analyze_evolution_in_loop (rdef);
  	  
  	  /* After having determined the evolution in the inner loop,
  	     the analyzer computes the overall effect of the inner
! 	     loop on the analyzed variable.
  	     
  	     Example:  
  	     
*************** static tree 
*** 1914,1957 ****
  merge_evolutions (tree original_chrec, 
  		  varray_type branch_chrecs)
  {
!   unsigned int i;
!   tree res;
!   varray_type diff_chrecs;
!   
!   VARRAY_TREE_INIT (diff_chrecs, 2, "diff_chrecs");
    
    DBG_S (fprintf (stderr, "(merge_evolutions \n"));
! 
!   if (original_chrec == chrec_not_analyzed_yet)
!     original_chrec = integer_zero_node;
!   
!   for (i = 0; i < VARRAY_ACTIVE_SIZE (branch_chrecs); i++)
      {
!       tree diff_chrec;
!       tree branch_chrec = VARRAY_TREE (branch_chrecs, i);
        
!       diff_chrec = chrec_fold_minus (branch_chrec, original_chrec);
!       DBG_S (fprintf (stderr, "  (branch = ");
! 	     debug_generic_expr (diff_chrec);
! 	     fprintf (stderr, "  )\n"));
!       VARRAY_PUSH_TREE (diff_chrecs, diff_chrec);
      }
    
!   res = VARRAY_TREE (diff_chrecs, 0);
!   if (res == NULL_TREE)
!     res = chrec_top;
!   
!   for (i = 1; i < VARRAY_ACTIVE_SIZE (diff_chrecs); i++)
!     res = chrec_merge (res, VARRAY_TREE (diff_chrecs, i));
!   
!   DBG_S (fprintf (stderr, "  (merged_branches = ");
  	 debug_generic_expr (res);
  	 fprintf (stderr, "  )\n");
  	 fprintf (stderr, ")\n"));
    
!   varray_clear (diff_chrecs);
!   
!   return chrec_fold_plus (original_chrec, res);
  }
  
  /* This function merges the branches of a condition phi node in a
--- 2262,2318 ----
  merge_evolutions (tree original_chrec, 
  		  varray_type branch_chrecs)
  {
!   unsigned i;
!   tree res = chrec_top;
!   unsigned nb_branches = VARRAY_ACTIVE_SIZE (branch_chrecs);
    
    DBG_S (fprintf (stderr, "(merge_evolutions \n"));
!   if (nb_branches > 0)
      {
!       if (original_chrec == chrec_not_analyzed_yet)
! 	original_chrec = integer_zero_node;
!       
!       /* In the case where there is a single branch, there is no need
! 	 to merge evolution functions.  */
!       if (nb_branches == 1) 
! 	res = VARRAY_TREE (branch_chrecs, 0);
        
!       /* Otherwise merge the different branches.  */
!       else
! 	{
! 	  varray_type diff_chrecs;
! 	  VARRAY_TREE_INIT (diff_chrecs, 2, "diff_chrecs");
! 	  
! 	  for (i = 0; i < VARRAY_ACTIVE_SIZE (branch_chrecs); i++)
! 	    {
! 	      tree diff_chrec;
! 	      tree branch_chrec = VARRAY_TREE (branch_chrecs, i);
! 	      
! 	      diff_chrec = chrec_fold_minus (branch_chrec, original_chrec);
! 	      DBG_S (fprintf (stderr, "  (branch = ");
! 		     debug_generic_expr (diff_chrec);
! 		     fprintf (stderr, "  )\n"));
! 	      VARRAY_PUSH_TREE (diff_chrecs, diff_chrec);
! 	    }
! 	  
! 	  res = VARRAY_TREE (diff_chrecs, 0);
! 	  if (res == NULL_TREE)
! 	    res = chrec_top;
! 	  
! 	  for (i = 1; i < VARRAY_ACTIVE_SIZE (diff_chrecs); i++)
! 	    res = chrec_merge (res, VARRAY_TREE (diff_chrecs, i));
! 	  
! 	  res = chrec_fold_plus (original_chrec, res);
! 	  varray_clear (diff_chrecs);
!   	}
      }
    
!   DBG_S (fprintf (stderr, "  (evolution_after_merge = ");
  	 debug_generic_expr (res);
  	 fprintf (stderr, "  )\n");
  	 fprintf (stderr, ")\n"));
    
!   return res;
  }
  
  /* This function merges the branches of a condition phi node in a
*************** merge_branches_of_condition_phi_node_in_
*** 2007,2013 ****
    set_scev (0, SSA_NAME_VAR (PHI_RESULT (condition_phi)), res);
    set_scev (loop_num (loop_of_stmt (condition_phi)),
  	    PHI_RESULT (condition_phi), 
! 	    chrec_eval_next_init_cond (res));
    
    varray_clear (branch_chrecs);
  }
--- 2368,2375 ----
    set_scev (0, SSA_NAME_VAR (PHI_RESULT (condition_phi)), res);
    set_scev (loop_num (loop_of_stmt (condition_phi)),
  	    PHI_RESULT (condition_phi), 
! 	    chrec_eval_next_init_cond (loop_num (loop_of_stmt (condition_phi)), 
! 				       res));
    
    varray_clear (branch_chrecs);
  }
*************** merge_branches_of_condition_phi_node (tr
*** 2036,2042 ****
    
    set_scev (0, SSA_NAME_VAR (PHI_RESULT (condition_phi)), res);
    set_scev (loop_nb, PHI_RESULT (condition_phi), 
! 	    chrec_eval_next_init_cond (res));
    
    varray_clear (branch_chrecs);
  }
--- 2398,2404 ----
    
    set_scev (0, SSA_NAME_VAR (PHI_RESULT (condition_phi)), res);
    set_scev (loop_nb, PHI_RESULT (condition_phi), 
! 	    chrec_eval_next_init_cond (loop_nb, res));
    
    varray_clear (branch_chrecs);
  }
Index: testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c
===================================================================
RCS file: testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c
diff -N testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c	12 Jan 2004 13:43:56 -0000
***************
*** 0 ****
--- 1,130 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fscalar-evolutions -fdump-scalar-evolutions -fall-data-deps -fdump-all-data-deps -ftree-vectorize -fdump-tree-vect-stats" } */
+ 
+ #define N 16
+ 
+ void fbar (float *);
+ void ibar (int *);
+ void sbar (short *);
+ 
+ /* Should be vectorized */
+ 
+ foo (int n)
+ {
+   float a[N+1];
+   float b[N];
+   float c[N];
+   float d[N];
+   int ia[N];
+   int ib[N];
+   int ic[N];
+   double da[N];
+   double db[N];
+   short sa[N];
+   short sb[N];
+   short sc[N];
+   int i,j;
+   int diff = 0;
+   char cb[N];
+   char cc[N];
+   char image[N][N];
+   char block[N][N];
+ 
+   /* Not vetorizable yet (unknown loop bound).  */
+   for (i = 0; i < n; i++){
+     a[i] = b[i];
+   }
+   fbar (a);
+ 
+   /* Vectorizable.  */
+   for (i = 0; i < N; i++){
+     a[i] = b[i];
+   }
+   fbar (a);
+ 
+   /* Not Vectorizable (mode not supported).  */
+   for (i = 0; i < N; i++){
+     da[i] = db[i];
+   }
+   fbar (a);
+ 
+   /* Not vetorizable yet (constant assignment).  */
+   for (i = 0; i < N; i++){
+     a[i] = 5;
+   }
+   fbar (a);
+ 
+   /* Vectorizable.  */
+   for (i = 0; i < N; i++){
+     a[i] = b[i] + c[i] + d[i];
+   }
+   fbar (a);
+ 
+   /* Vectorizable.  */
+   for (i = 0; i < N; i++){
+     a[i] = b[i] * c[i];
+   }
+   fbar (a);
+ 
+   /* Vectorizable.  */
+   for (i = 0; i < N/2; i++){
+     a[i] = b[i+N/2] * c[i+N/2] - b[i] * c[i];
+     d[i] = b[i] * c[i+N/2] + b[i+N/2] * c[i];
+   }
+   fbar (a);
+ 
+   /* Not vetorizable yet (too conservative dependence test).  */
+   for (i = 0; i < N/2; i++){
+     a[i] = b[i+N/2] * c[i+N/2] - b[i] * c[i];
+     a[i+N/2] = b[i] * c[i+N/2] + b[i+N/2] * c[i];
+   }
+   fbar (a);
+ 
+   /* Not vetorizable yet (access pattern).  */
+   for (i = 0; i < N/2; i++){
+     a[i] = b[2*i+1] * c[2*i+1] - b[2*i] * c[2*i];
+     d[i] = b[2*i] * c[2*i+1] + b[2*i+1] * c[2*i];
+   }
+   fbar (a);
+ 
+   /* Not vetorizable yet (too conservative dependence test; access pattern).  */
+   for (i = 0; i < N/2; i++){
+     a[2*i] = b[2*i+1] * c[2*i+1] - b[2*i] * c[2*i];
+     a[2*i+1] = b[2*i] * c[2*i+1] + b[2*i+1] * c[2*i];
+   }
+   fbar (a);
+ 
+   /* Not vetorizable yet (no support for integer mult).  */
+   for (i = 0; i < N; i++){
+     ia[i] = ib[i] * ic[i];
+   }
+   ibar (ia);
+ 
+   /* Vectorizable.  */
+   for (i = 0; i < N; i++){
+     a[i] = b[i] + c[i];
+     d[i] = b[i] + c[i];
+     ia[i] = ib[i] + ic[i];
+   }
+   ibar (ia);
+   fbar (a);
+   fbar (d);
+ 
+   /* Not vectorizable yet (two types with different nunits in vector).  */
+   for (i = 0; i < N; i++){
+     ia[i] = ib[i] + ic[i];
+     sa[i] = sb[i] + sc[i];
+   }
+   ibar (ia);
+   sbar (sa);
+ 
+   /* Not vetorizable yet (too conservative dependence test).  */
+   for (i = 0; i < N; i++){
+     a[i] = b[i] + c[i];
+     a[i+1] = b[i] + c[i];
+   }
+   fbar (a);
+ }
+ 
+ /* { dg-final { diff-tree-dumps "scev" } } */
+ /* { dg-final { diff-tree-dumps "alldd" } } */
Index: testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.alldd
===================================================================
RCS file: testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.alldd
diff -N testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.alldd
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.alldd	12 Jan 2004 13:43:56 -0000
***************
*** 0 ****
--- 1,736 ----
+ (Data Ref 0: 
+   stmt: T.1_522 = b[i_1];
+   ref: b[i_1];
+   base_name: b
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 1: 
+   stmt: a[i_1] = T.1_522;
+   ref: a[i_1];
+   base_name: a
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 2: 
+   stmt: T.1_519 = b[i_2];
+   ref: b[i_2];
+   base_name: b
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 3: 
+   stmt: a[i_2] = T.1_519;
+   ref: a[i_2];
+   base_name: a
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 4: 
+   stmt: T.2_516 = db[i_3];
+   ref: db[i_3];
+   base_name: db
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 5: 
+   stmt: da[i_3] = T.2_516;
+   ref: da[i_3];
+   base_name: da
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 6: 
+   stmt: a[i_4] = 5.0e+0;
+   ref: a[i_4];
+   base_name: a
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 7: 
+   stmt: T.1_507 = b[i_5];
+   ref: b[i_5];
+   base_name: b
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 8: 
+   stmt: T.3_508 = c[i_5];
+   ref: c[i_5];
+   base_name: c
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ (Data Ref 9: 
+   stmt: T.5_510 = d[i_5];
+   ref: d[i_5];
+   base_name: d
+   Access function 0: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ )
+ 
+ (Data Dep (A = 0, B = 0):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 0, B = 1):    (no dependence)
+ 
+ )
+ (Data Dep (A = 0, B = 2):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 0, B = 3):    (no dependence)
+ 
+ )
+ (Data Dep (A = 0, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 0, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 0, B = 6):    (no dependence)
+ 
+ )
+ (Data Dep (A = 0, B = 7):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 0, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 0, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 1, B = 0):    (no dependence)
+ 
+ )
+ (Data Dep (A = 1, B = 1):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 1, B = 2):    (no dependence)
+ 
+ )
+ (Data Dep (A = 1, B = 3):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 1, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 1, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 1, B = 6):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 1, B = 7):    (no dependence)
+ 
+ )
+ (Data Dep (A = 1, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 1, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 2, B = 0):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 2, B = 1):    (no dependence)
+ 
+ )
+ (Data Dep (A = 2, B = 2):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 2, B = 3):    (no dependence)
+ 
+ )
+ (Data Dep (A = 2, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 2, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 2, B = 6):    (no dependence)
+ 
+ )
+ (Data Dep (A = 2, B = 7):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 2, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 2, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 3, B = 0):    (no dependence)
+ 
+ )
+ (Data Dep (A = 3, B = 1):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 3, B = 2):    (no dependence)
+ 
+ )
+ (Data Dep (A = 3, B = 3):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 3, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 3, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 3, B = 6):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 3, B = 7):    (no dependence)
+ 
+ )
+ (Data Dep (A = 3, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 3, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 0):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 1):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 2):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 3):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 4):
+  (subscript 0:
+   base_name_A: db
+   base_name_B: db
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 4, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 6):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 7):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 4, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 0):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 1):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 2):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 3):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 5):
+  (subscript 0:
+   base_name_A: da
+   base_name_B: da
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 5, B = 6):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 7):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 5, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 6, B = 0):    (no dependence)
+ 
+ )
+ (Data Dep (A = 6, B = 1):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 6, B = 2):    (no dependence)
+ 
+ )
+ (Data Dep (A = 6, B = 3):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 6, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 6, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 6, B = 6):
+  (subscript 0:
+   base_name_A: a
+   base_name_B: a
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 6, B = 7):    (no dependence)
+ 
+ )
+ (Data Dep (A = 6, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 6, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 7, B = 0):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 7, B = 1):    (no dependence)
+ 
+ )
+ (Data Dep (A = 7, B = 2):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 7, B = 3):    (no dependence)
+ 
+ )
+ (Data Dep (A = 7, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 7, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 7, B = 6):    (no dependence)
+ 
+ )
+ (Data Dep (A = 7, B = 7):
+  (subscript 0:
+   base_name_A: b
+   base_name_B: b
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 7, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 7, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 0):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 1):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 2):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 3):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 6):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 7):    (no dependence)
+ 
+ )
+ (Data Dep (A = 8, B = 8):
+  (subscript 0:
+   base_name_A: c
+   base_name_B: c
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ (Data Dep (A = 8, B = 9):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 0):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 1):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 2):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 3):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 4):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 5):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 6):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 7):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 8):    (no dependence)
+ 
+ )
+ (Data Dep (A = 9, B = 9):
+  (subscript 0:
+   base_name_A: d
+   base_name_B: d
+   access_fn_A: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   access_fn_B: {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+   iterations_that_access_an_element_twice_in_A: 0
+   last_iteration_that_access_an_element_twice_in_A: [-oo, +oo]
+   iterations_that_access_an_element_twice_in_B: 0
+   last_iteration_that_access_an_element_twice_in_B: [-oo, +oo]
+  )
+  (Distance Vector: 
+ (0
+ )
+  )
+  (Direction Vector: 
+ (=)
+  )
+ 
+ )
+ 
Index: testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.scev
===================================================================
RCS file: testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.scev
diff -N testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.scev
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gcc.dg/tree-ssa-chrec/ssa-chrec-53.c.scev	12 Jan 2004 13:43:56 -0000
***************
*** 0 ****
--- 1,144 ----
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {0, +, 1}_1
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ n
+   ->  not_analyzed_yet
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{0, +, 1}_1, +, 1}_2
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{0, +, 1}_1, +, 1}_2, +, 1}_3
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{{{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{{{{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{{{{{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ i
+   ->  {{{{{{{{{{{{{0, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ T.35
+   ->  {{{{{{{{{{{{{i_14 + 1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13
+ 
+ i
+   ->  {0, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ T.8
+   ->  {8, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ T.8
+   ->  {8, +, {{{{{{{{{{{{{1, +, 1}_1, +, 1}_2, +, 1}_3, +, 1}_4, +, 1}_5, +, 1}_6, +, 1}_7, +, 1}_8, +, 1}_9, +, 1}_10, +, 1}_11, +, 1}_12, +, 1}_13}_14
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ T.16
+   ->  {0, +, {{{{{{{{{{{{{2, +, 2}_1, +, 2}_2, +, 2}_3, +, 2}_4, +, 2}_5, +, 2}_6, +, 2}_7, +, 2}_8, +, 2}_9, +, 2}_10, +, 2}_11, +, 2}_12, +, 2}_13}_14
+ 
+ T.17
+   ->  {1, +, {{{{{{{{{{{{{2, +, 2}_1, +, 2}_2, +, 2}_3, +, 2}_4, +, 2}_5, +, 2}_6, +, 2}_7, +, 2}_8, +, 2}_9, +, 2}_10, +, 2}_11, +, 2}_12, +, 2}_13}_14
+ 
+ 
+ 
+   Scalar evolution functions: 
+ 
+ T.16
+   ->  {0, +, {{{{{{{{{{{{{2, +, 2}_1, +, 2}_2, +, 2}_3, +, 2}_4, +, 2}_5, +, 2}_6, +, 2}_7, +, 2}_8, +, 2}_9, +, 2}_10, +, 2}_11, +, 2}_12, +, 2}_13}_14
+ 
+ T.17
+   ->  {1, +, {{{{{{{{{{{{{2, +, 2}_1, +, 2}_2, +, 2}_3, +, 2}_4, +, 2}_5, +, 2}_6, +, 2}_7, +, 2}_8, +, 2}_9, +, 2}_10, +, 2}_11, +, 2}_12, +, 2}_13}_14
+ 
+ 
+ 


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