https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80813
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target Milestone|12.5 |--- Summary|[12/13/14/15 Regression] |x86: |x86: |std::vector<bool>::operator |std::vector<bool>::operator |[] could be somewhat faster |[] could be somewhat faster |using BT instead of SHL |using BT instead of SHL | --- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Simplfied testcase: ``` bool f(long unsigned int a, long unsigned int x) { int t = x & 63; unsigned long tt = 1; tt = tt << t; unsigned long y = a; return y & tt; } ``` Currently we get: ``` Trying 8, 9, 11 -> 12: 8: r108:DI=0x1 9: {r107:DI=r108:DI<<r112:DI#0&0x3f#0;clobber flags:CC;} REG_DEAD r112:DI REG_UNUSED flags:CC REG_DEAD r108:DI 11: flags:CCZ=cmp(r107:DI&r111:DI,0) REG_DEAD r107:DI REG_DEAD r111:DI 12: r110:QI=flags:CCZ!=0 REG_DEAD flags:CCZ Failed to match this instruction: (set (subreg:DI (reg:QI 110 [ _7 ]) 0) (zero_extract:DI (reg:DI 111 [ a ]) (const_int 1 [0x1]) (subreg:QI (and:SI (subreg:SI (reg:DI 112 [ x ]) 0) (const_int 63 [0x3f])) 0))) ``` Which we don't have a pattern for. That is the regression part is solved removing the regression markers.