On Mon, Apr 16, 2018 at 12:50:29PM +0200, Thomas Schwinge wrote:
> > +#define set_feature(f) \
> > +  if (f < 32) features |= (1U << f); else features2 |= (1U << (f - 32))
> >    if (edx & bit_CMOV)
> > -    features |= (1 << FEATURE_CMOV);
> > +    set_feature (FEATURE_CMOV);
> 
>     [...]/libgcc/config/i386/cpuinfo.c: In function 'get_available_features':
>     [...]/libgcc/config/i386/cpuinfo.c:278:60: warning: left shift count is 
> negative [-Wshift-count-negative]
>        if (f < 32) features |= (1U << f); else features2 |= (1U << (f - 32))
>                                                                 ^~
>     [...]/libgcc/config/i386/cpuinfo.c:281:5: note: in expansion of macro 
> 'set_feature'
>          set_feature (FEATURE_CMOV);
>          ^~~~~~~~~~~
>     [...]/libgcc/config/i386/cpuinfo.c:280:6: warning: suggest explicit 
> braces to avoid ambiguous 'else' [-Wdangling-else]
>        if (edx & bit_CMOV)
>           ^
>     [Many more.]

Oops, missed these.  All of the warnings are false positives (warn on dead
code) or style warning (-Wdangling-else), not actual code bugs.

The following patch fixes all the warnings without changing code generation,
we are using set_feature with constant arguments only, so everything is
folded properly anyway.

Ok for trunk?

2018-04-16  Jakub Jelinek  <ja...@redhat.com>

        PR target/84945
        * config/i386/cpuinfo.c (set_feature): Wrap into do while (0) to avoid
        -Wdangling-else warnings.  Mask shift counts to avoid
        -Wshift-count-negative and -Wshift-count-overflow false positives.

--- libgcc/config/i386/cpuinfo.c.jj     2018-03-30 20:37:37.683185248 +0200
+++ libgcc/config/i386/cpuinfo.c        2018-04-16 13:04:45.239490344 +0200
@@ -275,7 +275,14 @@ get_available_features (unsigned int ecx
     }
 
 #define set_feature(f) \
-  if (f < 32) features |= (1U << f); else features2 |= (1U << (f - 32))
+  do                                           \
+    {                                          \
+      if (f < 32)                              \
+       features |= (1U << (f & 31));           \
+      else                                     \
+       features2 |= (1U << ((f - 32) & 31));   \
+    }                                          \
+  while (0)
 
   if (edx & bit_CMOV)
     set_feature (FEATURE_CMOV);


        Jakub

Reply via email to