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

    <tr>
        <th>Summary</th>
        <td>
            [DAG] SelectionDAG::canCreateUndefOrPoison - when can we bypass poison generating flags?
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:SelectionDAG
      </td>
    </tr>

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

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

<pre>
    Currently if a node has any poison generating flags canCreateUndefOrPoison always returns true:

https://github.com/llvm/llvm-project/blob/main/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp#L5638-L5642

However, if we can easily prove the flag, e.g. nuw - when are we allowed to use valuetracking to perform a better analysis of the node?

e.g.
```ll
define i8 @src(i4 %a0, i4 %a1) {
  %x0 = zext i4 %a0 to i8
  %x1 = zext i4 %a1 to i8
  %add = add nuw i8 %x0, %x1 ; zext proves nuw so should be safe to push freeze through to operands?
  %res = freeze i8 %add
  ret i8 %res
}

define i8 @tgt(i4 %a0, i4 %a1) {
  %f0 = freeze i4 %a0
  %f1 = freeze i4 %a1
  %x0 = zext i4 %f0 to i8
  %x1 = zext i4 %f1 to i8
  %add = add nuw i8 %x0, %x1
  ret i8 %add
}
Transformation seems to be correct!
```

 CC @nikic @dtcxzyw @nunoplopes 
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUlG2PozYQxz-NeTPaCOyQkBe8yCbKVepJrXrtBxjwAO45NvKYZLOfvjJs2su1q95KSNjjv-fhJ88gs-kdUS3KZ1EeM5zi4EP9289fzNm7rPH6Vh-mEMhFewPTAYLzmmBABnQ3GL1h76AnRwGjcT10FnuGFt0hEEb6w2nqfgm_Ljq0V7wxBIpTcAwxTCTUXuTpG2IcOe3kSchTb-IwNavWn4U8WXu5_57G4P-kNgp5aqxvhDyd0bhvNCbZDl7TJ0rmL2Spjca74_7Td9tVO45Cqs_lRlVPn8vNWi6J_OSvdKEg5CEVfKVUDBCysTcYg78QxIHmOpOEVv0K3HSFJ7gO5AADpTtorb-ShuhhYoIL2oliwPZrYhQ9jBQ6H86A0FCMFAAd2hsbBt_N_hNmoU5LSilIWm3y5bNW5HtNnXEEpgKxzjm0QlZmDUKWmM-5L-tCyB2I7bPI95AMLzkIdYRXeol3SZ4SMtXfiuJfiuJRgVrPkvRPpacUkucU9u7geXEwA-NZxR548JPV0BAwdjRzmHiALhC9JqzBT_2QzH6kgE7zQmAOGojnoG_iJSZqPZ8Him-WQJxIbY8LuQdIsY8_BqnLH0LdL9xPi_84Ld4H3P0v4O6jgL8resGwFP17QMfpbWF658BEZ07eG4LWhzD3TvHtY1pAweGQEDnz1bRpoWP78nq7zrbJ-dH6kRgyXSu9UzvMqC625UZKValdNtQkW1kWTaVpi3nV7LoqL9VGalWUBTXbPDO1zGWZV3JTlOW22K22elPuUGHXoKxU2Yh1Tmc0dpU6eeVDnxnmieqiLNdql1lsyPI8p6Scm13tH5tbpgEW6nlKNFPPYp1bw5H_cRhNtPOoS_ryCA_31V6o_Ttz66230yC4EjS3EZnfm31CnbIp2PrD82wul4U8vVV8qeVfAQAA__8qQbde">