This patch adds a pattern in match.pd folding x/sqrt(x) to sqrt(x) for -funsafe-math-optimizations. Test cases were added for double, float, and long double.
The patch was bootstrapped and regtested on aarch64-linux-gnu, no regression.
Ok for mainline?
Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com>
gcc/
* match.pd: Fold x/sqrt(x) to sqrt(x).
gcc/testsuite/
* gcc.dg/tree-ssa/sqrt_div.c: New test.
when the operand has that value.) */
(if (flag_unsafe_math_optimizations)
+ /* Simplify x / sqrt(x) -> sqrt(x). */
+ (simplify
+ (rdiv @0 (SQRT @0)) (SQRT @0))
+
/* Simplify sqrt(x) * sqrt(x) -> x. */
(simplify
(mult (SQRT_ALL@1 @0) @1)
--- /dev/null
+/* { dg-do compile } */\r
+/* { dg-options "-O2 -ffast-math -fdump-tree-forwprop-details" } */\r
+/* { dg-require-effective-target c99_runtime } */\r
+\r
+#define T(n, type, fname) \\r
+type f##n (type x) \\r
+{ \\r
+ type t1 = __builtin_##fname (x); \\r
+ type t2 = x / t1; \\r
+ return t2; \\r
+} \r
+\r
+T(1, double, sqrt)\r
+\r
+/* { dg-final { scan-tree-dump "gimple_simplified to t2_\[0-9\]+ = __builtin_sqrt .x_\[0-9\]*.D.." "forwprop1" } } */\r
+\r
+T(2, float, sqrtf )\r
+\r
+/* { dg-final { scan-tree-dump "gimple_simplified to t2_\[0-9\]+ = __builtin_sqrtf .x_\[0-9\]*.D.." "forwprop1" } } */\r
+\r
+T(3, long double, sqrtl)\r
+\r
+/* { dg-final { scan-tree-dump "gimple_simplified to t2_\[0-9\]+ = __builtin_sqrtl .x_\[0-9\]*.D.." "forwprop1" } } */\r