aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2001-07-17 23:44:57 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2001-07-17 21:44:57 +0000
commitb7e9703c27ee1b02df751646742fb5020a2d2b8c (patch)
treec8480e650f798616a3a4925e1f098f4f258e9711 /gcc/expr.c
parent653e276c6536663cda57bda038a9df4e64adb96f (diff)
downloadgcc-b7e9703c27ee1b02df751646742fb5020a2d2b8c.zip
gcc-b7e9703c27ee1b02df751646742fb5020a2d2b8c.tar.gz
gcc-b7e9703c27ee1b02df751646742fb5020a2d2b8c.tar.bz2
expr.c (epxand_expr): Convert divisions into multiplications by reciprocals if -ffast-math.
* expr.c (epxand_expr): Convert divisions into multiplications by reciprocals if -ffast-math. From-SVN: r44090
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 0021910..041ee90 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -7830,6 +7830,16 @@ expand_expr (exp, target, tmode, modifier)
return expand_divmod (0, code, mode, op0, op1, target, unsignedp);
case RDIV_EXPR:
+ /* Emit a/b as a*(1/b). Later we may manage CSE the reciprocal saving
+ expensive divide. If not, combine will rebuild the original
+ computation. */
+ if (flag_unsafe_math_optimizations && optimize && !optimize_size
+ && !real_onep (TREE_OPERAND (exp, 0)))
+ return expand_expr (build (MULT_EXPR, type, TREE_OPERAND (exp, 0),
+ build (RDIV_EXPR, type,
+ build_real (type, dconst1),
+ TREE_OPERAND (exp, 1))),
+ target, tmode, unsignedp);
this_optab = flodiv_optab;
goto binop;