From eac3018308f1929cc15be4aae5c144356121d8d2 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Fri, 31 Dec 2004 19:03:28 +0100 Subject: tree-scalar-evolution.c (instantiate_parameters_1): Copy the expression only if needed. * tree-scalar-evolution.c (instantiate_parameters_1): Copy the expression only if needed. From-SVN: r92768 --- gcc/tree-scalar-evolution.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'gcc/tree-scalar-evolution.c') diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 4b5dbc8..dd4ea0b 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -1955,28 +1955,40 @@ instantiate_parameters_1 (struct loop *loop, tree chrec, allow_superloop_chrecs); op1 = instantiate_parameters_1 (loop, CHREC_RIGHT (chrec), allow_superloop_chrecs); - return build_polynomial_chrec (CHREC_VARIABLE (chrec), op0, op1); + if (CHREC_LEFT (chrec) != op0 + || CHREC_RIGHT (chrec) != op1) + chrec = build_polynomial_chrec (CHREC_VARIABLE (chrec), op0, op1); + return chrec; case PLUS_EXPR: op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0), allow_superloop_chrecs); op1 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 1), allow_superloop_chrecs); - return chrec_fold_plus (TREE_TYPE (chrec), op0, op1); + if (TREE_OPERAND (chrec, 0) != op0 + || TREE_OPERAND (chrec, 1) != op1) + chrec = chrec_fold_plus (TREE_TYPE (chrec), op0, op1); + return chrec; case MINUS_EXPR: op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0), allow_superloop_chrecs); op1 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 1), allow_superloop_chrecs); - return chrec_fold_minus (TREE_TYPE (chrec), op0, op1); + if (TREE_OPERAND (chrec, 0) != op0 + || TREE_OPERAND (chrec, 1) != op1) + chrec = chrec_fold_minus (TREE_TYPE (chrec), op0, op1); + return chrec; case MULT_EXPR: op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0), allow_superloop_chrecs); op1 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 1), allow_superloop_chrecs); - return chrec_fold_multiply (TREE_TYPE (chrec), op0, op1); + if (TREE_OPERAND (chrec, 0) != op0 + || TREE_OPERAND (chrec, 1) != op1) + chrec = chrec_fold_multiply (TREE_TYPE (chrec), op0, op1); + return chrec; case NOP_EXPR: case CONVERT_EXPR: @@ -1986,6 +1998,9 @@ instantiate_parameters_1 (struct loop *loop, tree chrec, if (op0 == chrec_dont_know) return chrec_dont_know; + if (op0 == TREE_OPERAND (chrec, 0)) + return chrec; + return chrec_convert (TREE_TYPE (chrec), op0); case SCEV_NOT_KNOWN: @@ -2011,6 +2026,12 @@ instantiate_parameters_1 (struct loop *loop, tree chrec, || op1 == chrec_dont_know || op2 == chrec_dont_know) return chrec_dont_know; + + if (op0 == TREE_OPERAND (chrec, 0) + && op1 == TREE_OPERAND (chrec, 1) + && op2 == TREE_OPERAND (chrec, 2)) + return chrec; + return fold (build (TREE_CODE (chrec), TREE_TYPE (chrec), op0, op1, op2)); @@ -2022,6 +2043,10 @@ instantiate_parameters_1 (struct loop *loop, tree chrec, if (op0 == chrec_dont_know || op1 == chrec_dont_know) return chrec_dont_know; + + if (op0 == TREE_OPERAND (chrec, 0) + && op1 == TREE_OPERAND (chrec, 1)) + return chrec; return fold (build (TREE_CODE (chrec), TREE_TYPE (chrec), op0, op1)); case 1: @@ -2029,6 +2054,8 @@ instantiate_parameters_1 (struct loop *loop, tree chrec, allow_superloop_chrecs); if (op0 == chrec_dont_know) return chrec_dont_know; + if (op0 == TREE_OPERAND (chrec, 0)) + return chrec; return fold (build1 (TREE_CODE (chrec), TREE_TYPE (chrec), op0)); case 0: -- cgit v1.1