diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2009-11-25 04:30:10 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2009-11-25 04:30:10 +0000 |
commit | ec6636ebd828017e1af5b0515cf48149b13003b7 (patch) | |
tree | dc513c2f1f07f28f7c6e05c53f44d112fd748e24 /gcc/tree-scalar-evolution.c | |
parent | 7ec0665dc4e07633752015c67e051b5d6d059c1b (diff) | |
download | gcc-ec6636ebd828017e1af5b0515cf48149b13003b7.zip gcc-ec6636ebd828017e1af5b0515cf48149b13003b7.tar.gz gcc-ec6636ebd828017e1af5b0515cf48149b13003b7.tar.bz2 |
tree-scalar-evolution.c (instantiate_scev_poly): New.
2009-09-01 Sebastian Pop <sebastian.pop@amd.com>
* tree-scalar-evolution.c (instantiate_scev_poly): New.
(instantiate_scev_1): Move code in instantiate_scev_poly.
From-SVN: r154536
Diffstat (limited to 'gcc/tree-scalar-evolution.c')
-rw-r--r-- | gcc/tree-scalar-evolution.c | 62 |
1 files changed, 43 insertions, 19 deletions
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 6d8bf26..6c9e091 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -2194,6 +2194,47 @@ instantiate_scev_name (basic_block instantiate_below, /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW and EVOLUTION_LOOP, that were left under a symbolic form. + CHREC is a polynomial chain of recurrence to be instantiated. + + CACHE is the cache of already instantiated values. + + FOLD_CONVERSIONS should be set to true when the conversions that + may wrap in signed/pointer type are folded, as long as the value of + the chrec is preserved. + + SIZE_EXPR is used for computing the size of the expression to be + instantiated, and to stop if it exceeds some limit. */ + +static tree +instantiate_scev_poly (basic_block instantiate_below, + struct loop *evolution_loop, tree chrec, + bool fold_conversions, htab_t cache, int size_expr) +{ + tree op1; + tree op0 = instantiate_scev_1 (instantiate_below, evolution_loop, + CHREC_LEFT (chrec), fold_conversions, cache, + size_expr); + if (op0 == chrec_dont_know) + return chrec_dont_know; + + op1 = instantiate_scev_1 (instantiate_below, evolution_loop, + CHREC_RIGHT (chrec), fold_conversions, cache, + size_expr); + if (op1 == chrec_dont_know) + return chrec_dont_know; + + if (CHREC_LEFT (chrec) != op0 + || CHREC_RIGHT (chrec) != op1) + { + op1 = chrec_convert_rhs (chrec_type (op0), op1, NULL); + chrec = build_polynomial_chrec (CHREC_VARIABLE (chrec), op0, op1); + } + return chrec; +} + +/* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW + and EVOLUTION_LOOP, that were left under a symbolic form. + CHREC is a binary expression to be instantiated. CACHE is the cache of already instantiated values. @@ -2371,25 +2412,8 @@ instantiate_scev_1 (basic_block instantiate_below, fold_conversions, cache, size_expr); case POLYNOMIAL_CHREC: - op0 = instantiate_scev_1 (instantiate_below, evolution_loop, - CHREC_LEFT (chrec), fold_conversions, cache, - size_expr); - if (op0 == chrec_dont_know) - return chrec_dont_know; - - op1 = instantiate_scev_1 (instantiate_below, evolution_loop, - CHREC_RIGHT (chrec), fold_conversions, cache, - size_expr); - if (op1 == chrec_dont_know) - return chrec_dont_know; - - if (CHREC_LEFT (chrec) != op0 - || CHREC_RIGHT (chrec) != op1) - { - op1 = chrec_convert_rhs (chrec_type (op0), op1, NULL); - chrec = build_polynomial_chrec (CHREC_VARIABLE (chrec), op0, op1); - } - return chrec; + return instantiate_scev_poly (instantiate_below, evolution_loop, chrec, + fold_conversions, cache, size_expr); case POINTER_PLUS_EXPR: case PLUS_EXPR: |