expr.c (epxand_expr): Convert divisions into multiplications by reciprocals if -ffast...
authorJan Hubicka <jh@suse.cz>
Tue, 17 Jul 2001 21:44:57 +0000 (23:44 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 17 Jul 2001 21:44:57 +0000 (21:44 +0000)
* expr.c (epxand_expr): Convert divisions into multiplications by
reciprocals if -ffast-math.

From-SVN: r44090

gcc/ChangeLog
gcc/expr.c

index 3d5e47996a09b5799376b410a1621cadfd48714b..fda69fb8dbed48c80d70ba9abcc418a69142d31e 100644 (file)
@@ -1,3 +1,8 @@
+Tue Jul 17 23:43:31 CEST 2001  Jan Hubicka  <jh@suse.cz>
+
+       * expr.c (epxand_expr): Convert divisions into multiplications by
+       reciprocals if -ffast-math.
+
 2001-07-17  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * dbxout.c (dbxout_really_begin_function): Rename to
index 0021910515942a017098f23032bff693aa404fd2..041ee908044144a6488edb0855d171c3d03bc3f6 100644 (file)
@@ -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;