<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99783>99783</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[MIPS64] Failure to remove random NOPs in the middle of instructions
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
GabrielRavier
</td>
</tr>
</table>
<pre>
```cpp
int f(int a, int b)
{
return (a ^ b) | ~(a | b);
}
```
When compiled with `-O3 -target mips64el -fomit-frame-pointer`, LLVM outputs:
```x86asm
f(int, int): # @f(int, int)
and $1, $5, $4
sll $1, $1, 0
not $1, $1
jr $ra
sll $2, $1, 0
```
whereas GCC manages (with `-O3`):
```x86asm
f(int, int):
and $4,$4,$5
jr $31
nor $2,$0,$4
```
The `sll` instructions seem entirely unnecessary as they are just `nop`s from what I understand, and they don't seem required for any particular reason (using `-target mipsel` instead of `-target mips64el` also gets them removed, so this seems quite specific to 64-bit MIPS)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVEuP2zYQ_jXUZeAFNXofdNj11kGApAnaoj1T4tjigiIVPtb1pb-9oGQnzja9BBA0JD_O4_s0GuG9OhminlVPrHrORAyTdf07MThF-jfxqshlg5WXntV8e8ZlYfyZ8UdlAhwZtskKhntIi4Fht8GsedoW4ChEZ4BhK4BVv6x3gDV7-Gc7avabW_F083y-Lm45r9v1_ddEBkY7L0qThLMKE7Ca7z4VsAvCnSjArBZfl6Rhd7SzCrujEzPtFqtMIJei4R4-fPjzI9gYlhg8Kx7vE3zN-ndbCz9vh1eiV5prtY_AsABW8v9iG28QRgLDMk8Iw7K62vKGe63v8dXyG2hs-B68nr-4tHXiTRD8QZAf6neeyJHw8G6_h1kYcSKfPs2dkKtE3c-q8oZ8yXD_zVTfsyhurIx1NxIMS37z-X8Wf0yUqvVas5qDMj64OAZljQdPNAOZoBzpC0RjaCTvhbuA8BAmuoBwBC_RhxTB2CXFgaOzM5wnEeA9RCPJ-SCMTMwSkdVNWsOwCVsCR1-iciThaB0Ic4FFuKDGqIWDpK9dGz56ZU6rrHe9SV9rJiHBHt_iqXfTDaG9hROFteqUcbavtJbkLYRJbVQ9fIkqEPiFRnVUIwQLdbkbVICP7z__zrDLZF_IruhERn3eYF7lvMQ8m_r6KKu8rOsS-TDIRlQVyopabPNiEG09ZKpHjiVvkGOOHPlDJ9tuFJzKfBzbph5YyWkWSj9o_To_WHfKlPeR-q5r2iLTYiDt19mCaOgMK8gQ06hxffLZDfHkWcm18sF_ixJU0OtQShTqklXPcBBKR0eJ3qYEOGGkneHXT589KJNEgllJqSlpet8SWXS6n0JY1l8dDwwPJxWmODyMdmZ4SGmvZrc4-0JjYHhYi_UMDxuZ1x7_DQAA___gGn5S">