aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-chrec.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-chrec.c')
-rw-r--r--gcc/tree-chrec.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c
index 8b5371a..813b87f 100644
--- a/gcc/tree-chrec.c
+++ b/gcc/tree-chrec.c
@@ -1142,23 +1142,30 @@ evolution_function_is_affine_multivariate_p (const_tree chrec, int loopnum)
}
/* Determine whether the given tree is a function in zero or one
- variables. */
+ variables with respect to loop specified by LOOPNUM. Note only positive
+ LOOPNUM stands for a real loop. */
bool
-evolution_function_is_univariate_p (const_tree chrec)
+evolution_function_is_univariate_p (const_tree chrec, int loopnum)
{
if (chrec == NULL_TREE)
return true;
+ tree sub_chrec;
switch (TREE_CODE (chrec))
{
case POLYNOMIAL_CHREC:
switch (TREE_CODE (CHREC_LEFT (chrec)))
{
case POLYNOMIAL_CHREC:
- if (CHREC_VARIABLE (chrec) != CHREC_VARIABLE (CHREC_LEFT (chrec)))
+ sub_chrec = CHREC_LEFT (chrec);
+ if (CHREC_VARIABLE (chrec) != CHREC_VARIABLE (sub_chrec)
+ && (loopnum <= 0
+ || CHREC_VARIABLE (sub_chrec) == (unsigned) loopnum
+ || flow_loop_nested_p (get_loop (cfun, loopnum),
+ get_chrec_loop (sub_chrec))))
return false;
- if (!evolution_function_is_univariate_p (CHREC_LEFT (chrec)))
+ if (!evolution_function_is_univariate_p (sub_chrec, loopnum))
return false;
break;
@@ -1171,9 +1178,14 @@ evolution_function_is_univariate_p (const_tree chrec)
switch (TREE_CODE (CHREC_RIGHT (chrec)))
{
case POLYNOMIAL_CHREC:
- if (CHREC_VARIABLE (chrec) != CHREC_VARIABLE (CHREC_RIGHT (chrec)))
+ sub_chrec = CHREC_RIGHT (chrec);
+ if (CHREC_VARIABLE (chrec) != CHREC_VARIABLE (sub_chrec)
+ && (loopnum <= 0
+ || CHREC_VARIABLE (sub_chrec) == (unsigned) loopnum
+ || flow_loop_nested_p (get_loop (cfun, loopnum),
+ get_chrec_loop (sub_chrec))))
return false;
- if (!evolution_function_is_univariate_p (CHREC_RIGHT (chrec)))
+ if (!evolution_function_is_univariate_p (sub_chrec, loopnum))
return false;
break;