Hi!

This pass reuses a SSA_NAME on the lhs of sqrt etc. call as lhs
of .RSQRT etc. call.  The following testcase is miscompiled since my recent
ranger cast changes, because we compute (correct) range for sqrtf argument
as well as result but then recip pass keeps using that range for the .RQSRT
call which returns 1. / sqrt, so the function then returns 0.5f
unconditionally.
Note, on foo this is a regression from GCC 15, but on bar it regressed
already with the r14-536 change.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk/15.2/14.4?

2025-06-12  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/120638
        * tree-ssa-math-opts.cc (pass_cse_reciprocals::execute): Call
        reset_flow_sensitive_info on arg1.

        * gcc.dg/pr120638.c: New test.

--- gcc/tree-ssa-math-opts.cc.jj        2025-06-02 11:00:17.151382811 +0200
+++ gcc/tree-ssa-math-opts.cc   2025-06-12 14:04:47.504220666 +0200
@@ -1053,6 +1053,7 @@ pass_cse_reciprocals::execute (function
                    continue;
 
                  gimple_replace_ssa_lhs (call, arg1);
+                 reset_flow_sensitive_info (arg1);
                  if (gimple_call_internal_p (call) != (ifn != IFN_LAST))
                    {
                      auto_vec<tree, 4> args;
--- gcc/testsuite/gcc.dg/pr120638.c.jj  2025-06-12 14:03:32.101221725 +0200
+++ gcc/testsuite/gcc.dg/pr120638.c     2025-06-12 19:38:23.277001999 +0200
@@ -0,0 +1,31 @@
+/* PR tree-optimization/120638 */
+/* { dg-do run } */
+/* { dg-options "-O2 -ffast-math" } */
+
+extern float sqrtf (float x);
+
+__attribute__((noipa)) float
+foo (unsigned int s)
+{
+  return 0.5f / sqrtf (1.f + s);
+}
+
+__attribute__((noipa)) float
+bar (float s)
+{
+  if (s < 0.0 || s > 65535.0f)
+    __builtin_unreachable ();
+  return 0.5f / sqrtf (1.f + s);
+}
+
+int
+main ()
+{
+  if (__builtin_fabsf (foo (3) - 0.25f) > 0.00390625f
+      || __builtin_fabsf (foo (15) - 0.125f) > 0.00390625f
+      || __builtin_fabsf (foo (63) - 0.0625f) > 0.00390625f
+      || __builtin_fabsf (bar (3.0f) - 0.25f) > 0.00390625f
+      || __builtin_fabsf (bar (15.0f) - 0.125f) > 0.00390625f
+      || __builtin_fabsf (bar (63.0f) - 0.0625f) > 0.00390625f)
+    __builtin_abort ();
+}

        Jakub

Reply via email to