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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2020-04-18
            Summary|[x86_64] gratuitous sign    |[sign extension of
                   |extension of nonnegative    |nonnegative value from 32
                   |value from 32 to 64 bits    |to 64 bits
           Severity|normal                      |enhancement
          Component|target                      |tree-optimization

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
This could be done on the tree level:
Given (where _1 is short unsigned):
  _2 = (int) _1;
  _3 = _2 * 16;
  _6 = (uint64_t) _3;

We should be able to convert this to:
_7 = (uint64_t) _1;
_6 = _7 << 4;

But there might be a few steps inbetween.  I will let someone decide on how it
would work.
This is true even on AARCH64:
        adrp    x1, a
        add     x1, x1, :lo12:a
        ldrh    w0, [x1, w0, sxtw 1]
        ubfiz   x0, x0, 4, 16
        ret

But ubfiz is the the zero extend and shift in one instruction so it does not
matter in the end ...

Reply via email to