https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86829

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization, patch
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-08-02
                 CC|                            |rguenth at gcc dot gnu.org
            Version|unknown                     |9.0
     Ever confirmed|0                           |1

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
+ /* Simplify sin(atan(x)) -> x / sqrt(x*x + 1). */
+ (for sins (SIN)
+      atans (ATAN)
+      sqrts (SQRT)
+  (simplify
+   (sins (atans @0))
+   (rdiv @0 ( sqrts (plus (mult @0 @0) 
+       { build_one_cst (float_type_node);})))))
+ 
+ 
+ /* Simplify cos(atan(x)) -> 1 / sqrt(x*x + 1). */
+ (for coss (COS)
+      atans (ATAN)
+      sqrts (SQRT)
+  (simplify
+   (coss (atans @0))
+   (rdiv { build_one_cst (float_type_node);} 
+       ( sqrts (plus (mult @0 @0) { build_one_cst (float_type_node);})))))


likely happens because you use float_type_node instead of 'type' for
build_one_cst.  I think that if the atan intermediate result has additional
uses then the substitution may not be beneficial?  Thus you should
write (atans:s @0) in both places.

Otherwise this looks OK.  Can you please post the patch to gcc-patches
and add testcases?

Reply via email to