aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-03-27 07:23:42 +0000
committerRichard Stallman <rms@gnu.org>1993-03-27 07:23:42 +0000
commitae698e41edea77e25cb7e74ea60cd47de672a858 (patch)
tree40efd9c03a5fe34821e59b78b1f6b1e8320abc60 /gcc/tree.c
parentcf1c49cb5648bacda0d9a01dce9e448f87f72ab7 (diff)
downloadgcc-ae698e41edea77e25cb7e74ea60cd47de672a858.zip
gcc-ae698e41edea77e25cb7e74ea60cd47de672a858.tar.gz
gcc-ae698e41edea77e25cb7e74ea60cd47de672a858.tar.bz2
(stabilize_reference_1): For division and remainder, make a save_expr.
From-SVN: r3889
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 9033cc5..0ce3ddb 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -1940,6 +1940,14 @@ stabilize_reference_1 (e)
return e;
case '2':
+ /* Division is slow and tends to be compiled with jumps,
+ especially the division by powers of 2 that is often
+ found inside of an array reference. So do it just once. */
+ if (code == TRUNC_DIV_EXPR || code == TRUNC_MOD_EXPR
+ || code == FLOOR_DIV_EXPR || code == FLOOR_MOD_EXPR
+ || code == CEIL_DIV_EXPR || code == CEIL_MOD_EXPR
+ || code == ROUND_DIV_EXPR || code == ROUND_MOD_EXPR)
+ return save_expr (e);
/* Recursively stabilize each operand. */
result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0)),
stabilize_reference_1 (TREE_OPERAND (e, 1)));