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

    <tr>
        <th>Summary</th>
        <td>
            Ineffisiscient double null/arhument matrialization.
        </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>
    Consider the two following equivalent (as far as I can tell) IR:

```llvm
define ptr @foo(ptr readonly %arg.o) {
entry:
  %0 = load ptr, ptr %arg.o, align 8
  %1 = load i64, ptr %0, align 8
  %cmp1 = icmp eq i64 %1, 0
  br i1 %cmp1, label %exit, label %continue

continue:
  %2 = getelementptr inbounds ptr, ptr %0, i64 1
  %3 = load ptr, ptr %2, align 8
  %4 = load ptr, ptr %3, align 8
  %cmp2 = icmp eq ptr %4, null
  %o = select i1 %cmp2, ptr %arg.o, ptr null
  br label %exit

exit:
  %ret = phi ptr [ null, %entry ], [ %o, %continue ]
  ret ptr %ret
}
```

and

```llvm
define ptr @bar(ptr %arg.o) {
entry:
  %0 = load ptr, ptr %arg.o, align 8
  %1 = load i64, ptr %0, align 8
  %cmp1 = icmp eq i64 %1, 0
  br i1 %cmp1, label %fail, label %continue

continue:
  %2 = getelementptr inbounds ptr, ptr %0, i64 1
  %3 = load ptr, ptr %2, align 8
  %4 = load ptr, ptr %3, align 8
  %cmp2 = icmp eq ptr %4, null
  br i1 %cmp2, label %exit, label %fail

fail:
  br label %exit

exit:
  %ret = phi ptr [ null, %fail ], [ %arg.o, %continue ]
  ret ptr %ret
}
```

Nether are transformed into the other. From a canonicalization perspective, it's a bit of a miss. But more generally, the first one includes a phi of a select, which seems a bit redundant and leads to worse code generation. This example is a cleaned up version of a down cast in a language implementation, something that can potentially be run numerous times and is typically followed by an branch on the result. the select/phi combination prevent subsequent branches from being removed effectively, while the phi only implementation is able to simplify the control flow after inlining.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkVstu6zgM_RpnQ9zAVt4LL6YtAnQzi8H8AG3RNgey5OqRNPP1A8pJmxbtAAPc1VygaCyJ54g8JE1jCNxborrYPBSbpwWmODhfa0KNxvLronH6Uj86G1iThzgQxLODzhnjzmx7oJfEJzRkIxRqjwE69IABnqFFC5GMKdQBnv8oVr8V5VNR3v5vy_nPmNM4b2nq2BJM0UOxLjvnCrWXhSfUzpoLFGqDvl86ISx2DzOKbPSXN3IQoxKK1RMYh1rICvU4c76hHwEN9xb2d5jqHcPb9R2m_Nq-HacZwu04Ab0IKvOIeXkzbDxwdTOXE4MNGdmgV44fNlpnI9tE9yK97X0IT-V7e4pkaCQbxVG2jUtWh08BZ-fFs-oOv_pOHvV1qOvv7FffSqM-SHM1z6raZMydrcuGgQy18V0q9VXOZH2PbvwnNe-Ey-sPonmK-app4Jl58zCzqcdMIFUExeYprzcP2bfr2S0L-fjKKHRXBz3drt49farte5fQ6v9U_w36a_3_n8q-Qza_etnfq6P-_aWQ5bpTJq_fVfmpLSDcnzrgrXB-Whf8TnEgD-gJokcbOudH0sA2ujxbnBwv4ejdCCgTxFlu0fDfGNlZmMiHidrIJ8opjoXaBUBoOILrAGHkEJbwkCKMzhP0ZMmjMRexFv6OfYjgLAHb1iRNghZBMnp-D4nteeB2gEA03ug96WQ12ghoNRhCHSA6ODsfCFqnb5eJn0v4c-AA9IrjZAhYOFpDaElDmuBEPkg0-U7tzhZaDBHYAoJB2yfsCVigUueZUXwKbqQ4yMyNA8Y8XicXyUaWCKEh8MmCTSN5lwJEHiU6q-X-eJlER3O5Tm7S0FwALTQebTuAs1keTyGZuMzPNzGOIk_rxobtNQmeTjLuQ2oCvSR5nFkoQCeJa0ic9DS6E2mgrpszNmfhPLChfEGWXeb6x1CzXI3YOAhyxN0l20sFemegM-4M2EWS_jds2fbLha5X-rA64ILqans4HMrVerNeDHWz0e1e4bZUW1rtuwqbXbnf7Q4b0luN-2rBtSrVqqqqVXVQ62q9pF2zVmq171rdHAg3xbqkEdks5U29dL5fcAiJ6p2qNmqR-y_kryelLJ0hHxZKyceUrwXzo0l9KNal4RDDO0vkaKh-ttR1HDi0LEJqlyT0uS2P6IckusCI0fNbGywXyZt6iHEK0uHqWKhjz3FIzbJ1Y6GOeabMPz8m7_6a85g9C4U6Zs__CQAA__-6CALE">