From: Sebastian Pop Date: Wed, 11 Aug 2010 20:27:27 +0000 (+0000) Subject: chrec_apply should only apply to the specified variable. X-Git-Tag: releases/gcc-4.6.0~5070 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8b0592326bc7fa59d4e6d9a4a93b2b067745a039;p=thirdparty%2Fgcc.git chrec_apply should only apply to the specified variable. 2010-07-15 Sebastian Pop * tree-chrec.c (chrec_apply): Should only apply to the specified variable. Also handle multivariate chains of recurrences that satisfy evolution_function_is_affine_p. Also handle CASE_CONVERT. From-SVN: r163140 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f333453ff5a1..3a903947706f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-08-02 Sebastian Pop + + * tree-chrec.c (chrec_apply): Should only apply to the specified + variable. Also handle multivariate chains of recurrences that + satisfy evolution_function_is_affine_p. Also handle CASE_CONVERT. + 2010-08-02 Sebastian Pop * graphite-clast-to-gimple.c (debug_clast_name_index): Removed. diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite index 3c7615b39817..c46bd703214e 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,3 +1,9 @@ +2010-07-15 Sebastian Pop + + * tree-chrec.c (chrec_apply): Should only apply to the specified + variable. Also handle multivariate chains of recurrences that + satisfy evolution_function_is_affine_p. Also handle CASE_CONVERT. + 2010-07-15 Sebastian Pop * graphite-clast-to-gimple.c (debug_clast_name_index): Removed. diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c index c92b6b9837c7..92f8de9f0eb6 100644 --- a/gcc/tree-chrec.c +++ b/gcc/tree-chrec.c @@ -599,23 +599,40 @@ chrec_apply (unsigned var, if (TREE_CODE (x) == INTEGER_CST && SCALAR_FLOAT_TYPE_P (type)) x = build_real_from_int_cst (type, x); - if (evolution_function_is_affine_p (chrec)) + switch (TREE_CODE (chrec)) { - /* "{a, +, b} (x)" -> "a + b*x". */ - x = chrec_convert_rhs (type, x, NULL); - res = chrec_fold_multiply (TREE_TYPE (x), CHREC_RIGHT (chrec), x); - res = chrec_fold_plus (type, CHREC_LEFT (chrec), res); - } + case POLYNOMIAL_CHREC: + if (evolution_function_is_affine_p (chrec)) + { + if (CHREC_VARIABLE (chrec) != var) + return build_polynomial_chrec + (CHREC_VARIABLE (chrec), + chrec_apply (var, CHREC_LEFT (chrec), x), + chrec_apply (var, CHREC_RIGHT (chrec), x)); + + /* "{a, +, b} (x)" -> "a + b*x". */ + x = chrec_convert_rhs (type, x, NULL); + res = chrec_fold_multiply (TREE_TYPE (x), CHREC_RIGHT (chrec), x); + res = chrec_fold_plus (type, CHREC_LEFT (chrec), res); + } + else if (TREE_CODE (x) == INTEGER_CST + && tree_int_cst_sgn (x) == 1) + /* testsuite/.../ssa-chrec-38.c. */ + res = chrec_evaluate (var, chrec, x, 0); + else + res = chrec_dont_know; + break; - else if (TREE_CODE (chrec) != POLYNOMIAL_CHREC) - res = chrec; + CASE_CONVERT: + res = chrec_convert (TREE_TYPE (chrec), + chrec_apply (var, TREE_OPERAND (chrec, 0), x), + NULL); + break; - else if (TREE_CODE (x) == INTEGER_CST - && tree_int_cst_sgn (x) == 1) - /* testsuite/.../ssa-chrec-38.c. */ - res = chrec_evaluate (var, chrec, x, 0); - else - res = chrec_dont_know; + default: + res = chrec; + break; + } if (dump_file && (dump_flags & TDF_DETAILS)) {