Hi!

A recent unroller change results in the arg_types array initializing
loop in altivec_build_resolved_builtin being completely unrolled.
The callers ensure that for ALTIVEC_BUILTIN_VEC_VCMPGE_P all the 3
arguments are provided (i.e. n == 3), but the compiler doesn't know that
and emits -Wmaybe-uninitialized warning.

Fixed thusly, additionally simplified the code/made it more readable
with std::swap.  Bootstrapped/regtested on powerpc64le-linux, preapproved by
Segher on IRC, committed to trunk.

2019-11-11  Jakub Jelinek  <ja...@redhat.com>

        PR bootstrap/92433
        * config/rs6000/rs6000-c.c (altivec_build_resolved_builtin): Guard
        ALTIVEC_BUILTIN_VEC_VCMPGE_P argument swapping with n == 3 check.  Use
        std::swap.

--- gcc/config/rs6000/rs6000-c.c.jj     2019-08-27 12:26:30.115019661 +0200
+++ gcc/config/rs6000/rs6000-c.c        2019-11-11 10:12:00.954282097 +0100
@@ -6076,14 +6076,14 @@ altivec_build_resolved_builtin (tree *ar
      condition (LT vs. EQ, which is recognizable by bit 1 of the first
      argument) is reversed.  Patch the arguments here before building
      the resolved CALL_EXPR.  */
-  if (desc->code == ALTIVEC_BUILTIN_VEC_VCMPGE_P
+  if (n == 3
+      && desc->code == ALTIVEC_BUILTIN_VEC_VCMPGE_P
       && desc->overloaded_code != ALTIVEC_BUILTIN_VCMPGEFP_P
       && desc->overloaded_code != VSX_BUILTIN_XVCMPGEDP_P)
     {
-      tree t;
-      t = args[2], args[2] = args[1], args[1] = t;
-      t = arg_type[2], arg_type[2] = arg_type[1], arg_type[1] = t;
-      
+      std::swap (args[1], args[2]);
+      std::swap (arg_type[1], arg_type[2]);
+
       args[0] = fold_build2 (BIT_XOR_EXPR, TREE_TYPE (args[0]), args[0],
                             build_int_cst (NULL_TREE, 2));
     }

        Jakub

Reply via email to