This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[lno] Refine wrap-around matched cases
- From: Pop Sébastian <pop at gauvain dot u-strasbg dot fr>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 12 Jan 2004 15:24:21 +0100
- Subject: [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
+
+
+