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