<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/61881>61881</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [MIPS] Incorrect expansion of sub-word signed atomic max
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Amanieu
      </td>
    </tr>
</table>

<pre>
    ## IR

```llvm
define void @foo(ptr %a, i32 %x) {
  %val = trunc i32 %x to i8
  %1 = atomicrmw max ptr %a, i8 %val seq_cst
  ret void
}
```

## Asm (`-march=mipsel`)

```asm
foo:                                    # @foo
        sync
        addiu   $1, $zero, -4
        and     $1, $4, $1
        andi    $2, $4, 3
        sll     $2, $2, 3
 ori     $3, $zero, 255
        sllv    $3, $3, $2
        nor     $4, $zero, $3
        sllv    $5, $5, $2
$BB0_1: # =>This Inner Loop Header: Depth=1
        ll      $7, 0($1)
 and     $7, $7, $3 # <== WRONG, zero-extending
        and     $5, $5, $3 # <== WRONG, zero-extending 
        slt     $10, $7, $5
 move    $8, $7
        movn    $8, $5, $10
        and     $8, $8, $3
        and     $9, $7, $4
        or      $9, $9, $8
        sc $9, 0($1)
        beqz    $9, $BB0_1
        nop
        and $6, $7, $3
        srlv    $6, $6, $2
        sll     $6, $6, 16
 sra     $6, $6, 16
        sync
        jr      $ra
 nop
```

## The problem

The expansion of `i8` signed atomic max masks out all bits that are not involved, but fails to sign-extend the values before passing them to `slt` for a proper signed comparison.

Downstream bug: https://github.com/rust-lang/rust/issues/100650
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVl2PmzgU_TXOy1VGxgZCHnjIlM3uSPulbqV9rAzcJO4am9omM-2vX5mYNJCZUVEUkO_x8Tn3XmyEc_KoEUuSPZKsWonBn4wtd53QEodVbdpvJWGcMA5PHwmtCN3F_5xefkqdu8tQiwepEc5GtkBSejCGsKL3FgjLBGEfQHIWnl8I2wLZPF5mQRg6CwWEV-DtoJsrDrwBWdzAkhEkvOlkY7tn6MQLzBYoJjKHXz83zk9zLfpRV9S-qRYmZs4udneuA8IKktN1J2xzIrzqZO9QBTjbvpoL4WIqgne-g5-4wlIxWVHr5XLfdDMfEW0rh3FGmgSzhKXf0ZrwuE4XUN1G8is0jffkDikjkt0i-UKNUrCAsVuYsXKK84U2lmV3XOcFll85Z0ht7MSaLljHSW_RZhGRzWkJSx8f6eckVGZMO68I_-XTSTp40hot_G5MD7-haNEGTIW9D2VfpCymIhBvwgI0dMmY6NgUt-nfRAnTnceVP4yLV_Dvx7_-_DXEgrE1vnjUrdTHN8u5tPaTfLDMlb_2B10onKrVmTNGTHGFzFg6c9YLxCQroW86mKDF62W8QW4XyhZNHpvjFrm9cs_tNtfgfbHiVePX7wu2S7MsOrK_l0tYmi_LvBBgr705IfPXW_7mRZshkzzinBXvAyaiu_3jy498WRFDVz_v7YSfTgi9NbXC7jYahvGlF9pJo8EcgORUhv0SxiOljfv0uEl3wv3nwAwehFJQS-_An4QHYRG08SD12agztsFJPXg4CKlc2P4DVWxj8CeEs1ADOqjxYCxCH44vfQyRLqBJTp3yQcLBWBBBdY920tOYrhdWOqMfbn1U5lk7b1F0UA_H8OKfvO8d4TvC9oTtj9KfhvqhMR1hezs4v1ZCH-MzYXvp3ICOsH1CaZ7RVVvydsu3YoVlkheUM5YV2epUZgJTzjij6XaDBW_4Ic_SjBYo2IY1yFayZJRxmtKEpknOsofDNk-w5qJOWCrYJiEpxU5I9RDO3Adjj6tx7TJPiiJZKVGjcuNBzpjGZxiDhLFwrtsyzFnXw9GRlCrpvPvB4qVX4xfAH09__0OyCp50Y6zFxs8L7IZ6_Wxse1_g1WBV-U7axo-Ey23dW_MFm1nmRgP_BwAA__8edSyM">