Avoid maybe-uninitialized warning in __kernel_rem_pio2

Message ID mvm8r8cp5ve.fsf@suse.de
State Committed
Headers
Series Avoid maybe-uninitialized warning in __kernel_rem_pio2 |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
redhat-pt-bot/TryBot-32bit success Build for i686
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Testing passed

Commit Message

Andreas Schwab Oct. 9, 2023, 8:17 a.m. UTC
  With GCC 14 on 32-bit x86 the compiler emits a maybe-uninitialized
warning:

../sysdeps/ieee754/dbl-64/k_rem_pio2.c: In function '__kernel_rem_pio2':
../sysdeps/ieee754/dbl-64/k_rem_pio2.c:364:20: error: 'fq' may be used uninitialized [-Werror=maybe-uninitialized]
  364 |           y[0] = fq[0]; y[1] = fq[1]; y[2] = fw;
      |                  ~~^~~

This is similar to the warning that is suppressed in the other branch of
the switch.  Help the compiler knowing that the variable is always
initialized, which also makes the suppression obsolete.
---
 sysdeps/ieee754/dbl-64/k_rem_pio2.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)
  

Comments

Adhemerval Zanella Netto Oct. 13, 2023, 1:06 p.m. UTC | #1
On 09/10/23 05:17, Andreas Schwab wrote:
> With GCC 14 on 32-bit x86 the compiler emits a maybe-uninitialized
> warning:
> 
> ../sysdeps/ieee754/dbl-64/k_rem_pio2.c: In function '__kernel_rem_pio2':
> ../sysdeps/ieee754/dbl-64/k_rem_pio2.c:364:20: error: 'fq' may be used uninitialized [-Werror=maybe-uninitialized]
>   364 |           y[0] = fq[0]; y[1] = fq[1]; y[2] = fw;
>       |                  ~~^~~
> 
> This is similar to the warning that is suppressed in the other branch of
> the switch.  Help the compiler knowing that the variable is always
> initialized, which also makes the suppression obsolete.

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  sysdeps/ieee754/dbl-64/k_rem_pio2.c | 14 +++++---------
>  1 file changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/sysdeps/ieee754/dbl-64/k_rem_pio2.c b/sysdeps/ieee754/dbl-64/k_rem_pio2.c
> index 6e2ef5d07b..af29685c68 100644
> --- a/sysdeps/ieee754/dbl-64/k_rem_pio2.c
> +++ b/sysdeps/ieee754/dbl-64/k_rem_pio2.c
> @@ -300,6 +300,11 @@ recompute:
>  	iq[jz] = (int32_t) z;
>      }
>  
> +  /* jz is always nonnegative here, because the result is never zero to
> +     full precision (this function is not called for zero arguments). Help

I think it should double space here.

> +     the compiler to know it.  */
> +  if (jz < 0) __builtin_unreachable ();
> +
>    /* convert integer "bit" chunk to floating-point value */
>    fw = __scalbn (one, q0);
>    for (i = jz; i >= 0; i--)
> @@ -330,16 +335,7 @@ recompute:
>        for (i = jz; i >= 0; i--)
>  	fv = math_narrow_eval (fv + fq[i]);
>        y[0] = (ih == 0) ? fv : -fv;
> -      /* GCC mainline (to be GCC 9), as of 2018-05-22 on i686, warns
> -	 that fq[0] may be used uninitialized.  This is not possible
> -	 because jz is always nonnegative when the above loop
> -	 initializing fq is executed, because the result is never zero
> -	 to full precision (this function is not called for zero
> -	 arguments).  */
> -      DIAG_PUSH_NEEDS_COMMENT;
> -      DIAG_IGNORE_NEEDS_COMMENT (9, "-Wmaybe-uninitialized");
>        fv = math_narrow_eval (fq[0] - fv);
> -      DIAG_POP_NEEDS_COMMENT;
>        for (i = 1; i <= jz; i++)
>  	fv = math_narrow_eval (fv + fq[i]);
>        y[1] = (ih == 0) ? fv : -fv;
  

Patch

diff --git a/sysdeps/ieee754/dbl-64/k_rem_pio2.c b/sysdeps/ieee754/dbl-64/k_rem_pio2.c
index 6e2ef5d07b..af29685c68 100644
--- a/sysdeps/ieee754/dbl-64/k_rem_pio2.c
+++ b/sysdeps/ieee754/dbl-64/k_rem_pio2.c
@@ -300,6 +300,11 @@  recompute:
 	iq[jz] = (int32_t) z;
     }
 
+  /* jz is always nonnegative here, because the result is never zero to
+     full precision (this function is not called for zero arguments). Help
+     the compiler to know it.  */
+  if (jz < 0) __builtin_unreachable ();
+
   /* convert integer "bit" chunk to floating-point value */
   fw = __scalbn (one, q0);
   for (i = jz; i >= 0; i--)
@@ -330,16 +335,7 @@  recompute:
       for (i = jz; i >= 0; i--)
 	fv = math_narrow_eval (fv + fq[i]);
       y[0] = (ih == 0) ? fv : -fv;
-      /* GCC mainline (to be GCC 9), as of 2018-05-22 on i686, warns
-	 that fq[0] may be used uninitialized.  This is not possible
-	 because jz is always nonnegative when the above loop
-	 initializing fq is executed, because the result is never zero
-	 to full precision (this function is not called for zero
-	 arguments).  */
-      DIAG_PUSH_NEEDS_COMMENT;
-      DIAG_IGNORE_NEEDS_COMMENT (9, "-Wmaybe-uninitialized");
       fv = math_narrow_eval (fq[0] - fv);
-      DIAG_POP_NEEDS_COMMENT;
       for (i = 1; i <= jz; i++)
 	fv = math_narrow_eval (fv + fq[i]);
       y[1] = (ih == 0) ? fv : -fv;