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

    <tr>
        <th>Summary</th>
        <td>
            GVN replacement invalidates dominator tree
        </td>
    </tr>

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

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

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

<pre>
    Currently, GVNPass performs a replacement incorrectly since it assumes that the replacement dominates all the uses. In the following example, this leads to an invalid dominator tree.

Example IR:
[ir.ll](https://github.com/llvm/llvm-project/files/9803258/ir.ll.txt)

Command:
`opt -gvn -S ir.ll
`
Error: 
```
Instruction does not dominate all uses!
  %.pre = shl i32 %i12, 2
  %i23 = getelementptr inbounds i32, i32* null, i32 %.pre
```

Created a patch https://reviews.llvm.org/D136095 for this bug. It's up for review 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyVU8uOmzAU_RrYXAWBHV4LFtOkrbKpqlbq3sANuDI2sk0m8_e9mKSZjLqpZNm-7-PDoTX9W3NYrEXt1VvEDvD117fvwjmY0Z6NnRwIsDgr0eFEOSB1Zyi7o2xwZCBID5S_TOjAj8LThk8VvZmkFp7CQqkQXRy6BE46GGejlHmVegC8imlWuILwo3SgUPTU04DQNPYilOzvzYwFbxGTKD1G6cu2f97K4fQj4jdXlH-SNlEqyo8Rq0bvZ7fG2Bdag_Tj0iadmchQ6nI_drM1v-l9ZJ6lQkdnXaWc5RXdQrfEXylav599MNMkdP8YXKRm9rAbLhp2P2EDcY_c4FprLBXAw7-tYJ6083bpvDSa3kzcafNgMhC5khixbEsHiFiezBYh4kdwowLJ2eqTGVv5ZO_SJOMha0CPKnyi2VsiuDWLJr6pcK0IxwvohYBv5n3EP_HeaLBI8HqSzCx8N8Iz4xYvEl9dsrKcGDuQ65jxIq1zEoHdvnm7DKQMord0sMzBv5VBjE1WFEXKal6Xcd_wni4i9tIrbEi0H1Qa5BJU9yyZeLGq-W8lSBJ4kEJe7bMqHhuenft9Wna1KLN-3zFWVvm5LWrBGCv4vo2VaFG5hhQYMaYJf2hBd9JiLBuWMpalWZmVecHLhFc871OW7fMs7Uoso32Kk5DqL1exbQIk4sdRUEnnH0TG9P_JQSOGcdRfLH40thEKrwNxIOIwvAng_wB-2ju9">