diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1993-03-19 06:29:40 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1993-03-19 06:29:40 -0500 |
commit | fb5c8ce64aa4c73336fe3abee7ff193cc85d5d73 (patch) | |
tree | 71d7b7ef687905daf61adeb99118106059d83ae3 /gcc | |
parent | b385aeda3f7428271d3b2ef8e6ff3801cffd3f95 (diff) | |
download | gcc-fb5c8ce64aa4c73336fe3abee7ff193cc85d5d73.zip gcc-fb5c8ce64aa4c73336fe3abee7ff193cc85d5d73.tar.gz gcc-fb5c8ce64aa4c73336fe3abee7ff193cc85d5d73.tar.bz2 |
(simplify_plus_minus): Count CONSTs coming in and going out...
(simplify_plus_minus): Count CONSTs coming in and going out; we have
simplified things if we have more CONSTs going out even if we have the
same number of total terms.
From-SVN: r3787
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cse.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -3929,9 +3929,9 @@ simplify_plus_minus (code, mode, op0, op1) rtx ops[8]; int negs[8]; rtx result, tem; - int n_ops = 2, input_ops = 2; - int i, j, k; + int n_ops = 2, input_ops = 2, input_consts = 0, n_consts = 0; int first = 1, negate = 0, changed; + int i, j; bzero (ops, sizeof ops); @@ -3969,6 +3969,7 @@ simplify_plus_minus (code, mode, op0, op1) case CONST: ops[i] = XEXP (ops[i], 0); + input_consts++; changed = 1; break; @@ -4035,17 +4036,20 @@ simplify_plus_minus (code, mode, op0, op1) /* Pack all the operands to the lower-numbered entries and give up if we didn't reduce the number of operands we had. Make sure we - count a CONST as two operands. */ + count a CONST as two operands. If we have the same number of + operands, but have made more CONSTs than we had, this is also + an improvement, so accept it. */ - for (i = 0, j = 0, k = 0; j < n_ops; j++) + for (i = 0, j = 0; j < n_ops; j++) if (ops[j] != 0) { ops[i] = ops[j], negs[i++] = negs[j]; if (GET_CODE (ops[j]) == CONST) - k++; + n_consts++; } - if (i + k >= input_ops) + if (i + n_consts > input_ops + || (i + n_consts == input_ops && n_consts <= input_consts)) return 0; n_ops = i; |