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

    <tr>
        <th>Summary</th>
        <td>
            Rendundant multiplication is issued when using mulhi/mullo
        </td>
    </tr>

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

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

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

<pre>
    See sample IR:

```ir
define i64 @rehash0(i64 %h) {
  %h128 = zext i64 %h to i128
  %m128 = mul nuw i128 %h128, 14181476777654086739
  %hi128 = lshr i128 %m128, 64
  %hi = trunc i128 %hi128 to i64
  %lo = mul i64 %h, 14181476777654086739
  %r = xor i64 %lo, %hi
  ret i64 %r
}
```

Which compiles to (on x64):
```asm
rehash0:                                # @rehash0
        movabs  rcx, -4265267296055464877
        mov     rax, rdi
        mul     rcx
        imul    rcx, rdi
        xor     rcx, rdx
        mov     rax, rcx
        ret
```

One would expect the above IR to be optimized to something looking like:
```ir
define i64 @rehash1(i64 %h) local_unnamed_addr #0 {
  %h128 = zext i64 %h to i128
  %m128 = mul nuw i128 %h128, 14181476777654086739
  %hi128 = lshr i128 %m128, 64
  %r1 = xor i128 %hi128, %m128
  %r = trunc i128 %r1 to i64
  ret i64 %r
}
```

Which compiles to something like (on x64):
```asm
rehash1:                                # @rehash1
        mov     rax, rdi
        movabs  rcx, -4265267296055464877
        mul     rcx
        xor     rax, rdx
        ret
```

This type of construct is fairly common in hash function (where I noticed the bad behavior) and/or in big number libraries, both of which tends to be fairly performance sensitives, so it is worth investigating.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVVU2P2zYQ_TXShYghUt8HHZouFuipQFqgx4ASKWsaihRIyvbm13dIW2t7N3Gx6KmCYEqcr8c38-TeiJfuDymJ4_OiJPntS5L_kmRPSbb9Vtn5BnveEHIELQlUBUmKzMqJuylLWBM3WDklrCVJ_fnsTOIWZQ1J8ifyXZ482fyINwTQcuM4b47zqohej9G-ZUjYr4QWtKFFXdV1XZVF1lR13t4Wgi2BcpN9jZ4v0VVx5xsdvV31cK0THwKwO19lXlFdT_mvaGwMOhm7BSkTomKZzc3KV0Iu9Cb10xvib7vx1wTDRAYzL6CkC0iReaPJCfGy9tq6LZa7-byz9SnHoo-vhOW3jb0APV-zOfDeIezhFI7yqWBVyaqatVVWlkVVNHX9LiCulscAK-CNHSmNdkx4Z4CL5VLpXWCg9c5-elz4bX4k_gHNv-OAH82qBJGnRQ6e-EkS3ptDEEhgvZfELB5m-C5FeHdmln4CvSfKmG9xhW_yfT8eiYi-EZEyA1dfV635LMVXLoQNvcn-D-Ky9Dr7t9K6zP98j8z-QImY4V6G_10pNz3C3nxMOPSjwqEf1MGHhfUz4bwKg_9YGI8H_88JkKuXBcd7RPK0w67g-OPmyMGql0DojLSBJuGUZMSeecANZPM4SYv6INp4GIIsUDM9F6iViR_A2DDTXIuEPYex0KSHPc7h3EuLDekttyBdgNwbP4Xyx9hBL7VwF8ldMCzSjsbOXA_4tyW1Aw-Hc6jDkYloj8ZiEtC472HPPXZ9l8qOVlVbVjSr2lR0uWjzlqcevJLdFyyzasG1D9R6WBQMPJ4Ms4FzKx4ID6jJ6sIEoQ9-xNkzrsqkq1Xd5P3iwhyxZ7z34Ke13yFb-KLUYVs-Ldb8jR8UfI1JEfVz2TJap1OXNSMTw1g3gjYiK2VJZTbmPW9Fw4aRVqnivVSuS8rPCWNaHs-48Dkpn1LoWMYYpaymRVnn9a7pRdYXouAtY301VjiacuagdgHHzth9arsIqV_3Do0KnHdXI3cO9lrKWA7z89VPxnZCcsGVhlMai3cR_D--6kKZ">