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

    <tr>
        <th>Summary</th>
        <td>
            GVN-Hoist crashes with opaque pointers if you have mixed load types
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            opaque-pointers
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          jcranmer-intel
      </td>
    </tr>
</table>

<pre>
    Example crashing code:
```llvm
define void @foo(ptr %a1, i1 %tobool5.not) {
  br i1 %tobool5.not, label %if.then10, label %land.rhs

land.rhs:
  %a5 = load i32, ptr %a1, align 4
  %a6 = icmp ne i32 %a5, 0
  br i1 %a6, label %if.end14, label %if.then10

if.then10:
  %vtable = load ptr, ptr %a1, align 8
  br label %if.end14

if.end14:
  ret void
}
```

`%a1` is loaded once as an `i32` and once as a `ptr`, so GVNHoist tries to hoist both of them with the same load, resulting in a RAUW assertion failure.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx1k01zmzAQhn-NuOyYEeLD9oGDEzftqYfOtD1LsBhlBKKScJN_30UksZ00MwxIK-2-z36gbPtcf3mSw2QQGid9r8cTNLZFlh8YPzJ-YBVfH2POw2pqsdMjwtnqFljBO2uZ2E3BAROlzJi4B50t62CVtaZMRxuY2APb3q3-AMr978o9GKnQLHbdpaHHMeM3ViPHNnW9fyGL7zfbKzBEjBJYfgRjZQs6F0uUG0Bp9GmE4tqjih66GSag5MhpjbPc5h-4ZfUeF8c2Kz7J4Qr3YrzhPQepqAVvzAT7CfPuiuWj_q3SarsIOQyxay_Xtsd3Lb52X7ZRueKgfaTCFuzYIEgPcgQ6WCpLx9SBy8FiX-ir2Dpv4euv79-s9gGC0-ghWOjjVtnQg-2AyjHAX00bWoGXA0axxduhn01YRlKPFPnH4edv0vDogrYjdFKb2WGatHXe7vO9TIIOBmsS3KyKcaJJM0a3k_wzI0xWjwGdB93Bs52hl2eEQT9RcrHy4XlCn8zO1H0IUxwr8UDPiWLMKm3sQJv4L6yfzeTsIzY0vg_a-xk9LcqirIqkr3MuO0S5rfiuauVO7Nq8UKXa84qrMuN5Ehvoa1beMSFWwM0rIFlYeUx0LbgQPBelyIqszFKlsj3fyq5TXZd3KOkPxIFKkS40qXWnxNURTM0nT4eGKuEvh1Q_GiPEKErx5Rx66-pHqtU4oNss4iaJqdQxj393sz3i">