Fix libgcc/config/i386/cpuinfo.c warnings (PR target/84945)

Message ID 20180416111132.GP8577@tucnak
State New
Headers show
Series
  • Fix libgcc/config/i386/cpuinfo.c warnings (PR target/84945)
Related show

Commit Message

Jakub Jelinek April 16, 2018, 11:11 a.m.
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  <jakub@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.



	Jakub

Patch

--- 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);