https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106786

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=121362

--- Comment #11 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
There is a missing fre looking through an aggregate copy due to the type
difference, unsigned char vs bool:
```
  _14 = VIEW_CONVERT_EXPR<unsigned char>(_17);
...
  MEM <unsigned char> [(struct R *)&D.3049 + 8B] = _14;
  z = D.3049;
  _1 = z.carry;
```

_1 is the same as _17 here.

if we change bool to `unsigned char`, then fre is able to handle:
```
  MEM <unsigned char> [(struct R *)&D.3049 + 8B] = SR.6_8;
  z = D.3049;
  _1 = z.carry;
  _2 = _1 != 0;
  _12 = (unsigned char) _2;
  _13 = __builtin_ia32_sbb_u64 (_12, x_5(D), y_6(D), &d);
```
Into:
```
  MEM <unsigned char> [(struct R *)&D.3049 + 8B] = _21;
  z = D.3049;
  _13 = __builtin_ia32_sbb_u64 (_21, x_5(D), y_6(D), &d);
```

So maybe we can fix this via VN handling of loads of bool via a store to
unsigned char as a VCE.

Reply via email to