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

    <tr>
        <th>Summary</th>
        <td>
            Reassociate pass on `i128` created from two `i64`s changes subtraction to addition of a negative
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations,
            llvm
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          Bryce-MW
      </td>
    </tr>
</table>

<pre>
    I noticed some weird codegen around subtracting `i128` when the input is two `i64`s (which often happens on x86_64`) and the output is to memory (whether it's to the same location or different). At least I think that seems to be the condition. It looks like ReassociatePass decides to rewrite the subtraction as addition with a negative. Here's a [Compiler Explorer link](https://clang.godbolt.org/z/oTqnEo4hf).

Here's some IR that does the same thing:
```ll
define void @sub_assign_int(ptr %a.0, i64 %b.0, i64 %b.1) {
  %b.2 = zext i64 %b.1 to i128
  %b.3 = shl nuw i128 %b.2, 64
  %b.4 = zext i64 %b.0 to i128
  %b.5 = or disjoint i128 %b.3, %b.4
  %a.1 = load i128, ptr %a.0, align 8
  %res = sub i128 %a.1, %b.5
  store i128 %res, ptr %a.0, align 8
  ret void
}
```
Which compiles to the following in `x86_64`:
```asm
xor     eax, eax
neg     rsi
sbb     rax, rdx
add     qword ptr [rdi], rsi
adc     qword ptr [rdi + 8], rax
```
I expect to get just a `sub` and an `sbb`:
```asm
sub qword ptr [rdi], rsi
sbb     qword ptr [rdi + 8], rdx
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVc1u2zgQfhr6MqghUT-2DzrESY3NYYFFsUCPASWOJCYURyWp2MnTL0jGieMN2iCwwOE33_wPhXNqMIgNq_asuluJxY9km7196fDb3z9XLcmX5h4MedWhBEcTwhGVldCRxAENCEuLkeCW1lvReWUGYHWmcr5ldQbHEQ34EUGZefGgHPgjRUBdsjpzwPj2OKpuBOo9GhjFPKNxQAZO2_ohghjfgTAy0tDizzwEE05kXxIF-hEtKM_4Jt4FsBMTgqZOeEUGyIJUfY8WjWd8t4YbDxqF83APflTmCfwoPDjEKTK0GEk6MlIFgjXce9BETw60ekL4gcI56pTw-I9wDiR2SmJUtXi0yif998SQAeFAyMQGR-VHEGBwEF494xr-QovRewGs2t_SNCuNFr6fZk0WLWhlnlh1x_h29H52rLhh_MD4odPCDOuBZEvar8kOjB9eGT_Qv7_MdyrHPgTLsjuW3aTfd0Oxmvc_UtySgu_nrIWEDMFE0quz9K91EkjslUF4JiWBlZlb2ofUSQ8qJHc7ewuMV2KdMX4Lqi7Dqb065aGwbLNPlJCEHFhxB6948hfAkNPYUZfIIiLdqMEsx3j9xhCM1OUnbPkFa_YlaxWRsVfcIynjL5iLwJz4LnTEOo86moRMfPwWPidAaDUYuDRk0SX3l_bdgAgZeTNQnbHOk8V3iEX3R3aLPhbmrXSbu6sapuPPOHRd6rL3ielJazqGGVYmTOnHDP6vFYSbkuREFsIfilPwJnyi3OAQ5dapJHBtmwQJaOUbUEgZ5b-OZGWKrdpbqWKz337oC9l9iQPG97A9o8_mr-K9BzzN2PkQ6YAeHhfnw6TVoXnDpgobRsSgXdv-PuJQtD85ew72987Ka2dXsinkrtiJFTb5hm_L7YbnxWpsKsHrHoXErs96XmbFLs-qumwzibkoMVuphme8zLNsl1c8y4t1t9vUos27rN6VZVdsWJnhJJRea_08hT2xUs4t2OR5Xu82Ky1a1C6-A5wHCCtuaPZqUq9xfzrGw2SdLzkPz4VtwuFbuwyOlZlWzrsPeq-8xuZiTcIc9iSZyweisyg8SugtTddvQzcKM6D7tEI9faxQ6i8W6Gqxuvm8GQflx6VddzQxfkhex8-32dIjdp7xQ0yBY_zwloXnhv8XAAD__xHXGxc">