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.

Reply via email to