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

    <tr>
        <th>Summary</th>
        <td>
            Wrong folding binary ops with PHI operands
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    https://github.com/llvm/llvm-project/blob/a1d31caa8c53082d12f580122dcf2b2ff8285e78/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp#L2364-L2365

https://github.com/llvm/llvm-project/blob/c876d719ef5b10128eca6d8677068248b4831017/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp#L2016-L2020


Alive2 report: https://alive2.llvm.org/ce/z/4_XyjS

```llvm
----------------------------------------
define i32 @phi1UndefInput.2(i1 %cond, i8 %arg0, i8 %arg1, i8 %arg2, i8 %arg3) {
entry:
  br i1 %cond, label %bb2, label %bb3

bb2:
  br label %bb3

bb3:
  %phi0 = phi i8 [ %arg0, %bb2 ], [ 0, %entry ]
 %phi1 = phi i8 [ %arg1, %bb2 ], [ 0, %entry ]
  %phi2 = phi i8 [ %arg2, %bb2 ], [ 0, %entry ]
  %phi3 = phi i8 [ %arg3, %bb2 ], [ undef, %entry ]
  %zext0 = zext i8 %phi0 to i32
  %zext1 = zext i8 %phi1 to i32
 %zext2 = zext i8 %phi2 to i32
  %zext3 = zext i8 %phi3 to i32
  %or1 = or i32 %zext0, %zext1
  %or2 = or i32 %or1, %zext2
  %or3 = or i32 %or2, %zext3
  ret i32 %or3
}
=>
define i32 @phi1UndefInput.2(i1 %cond, i8 %arg0, i8 %arg1, i8 %arg2, i8 %arg3) {
entry:
  br i1 %cond, label %bb2, label %bb3

bb2:
  %#0 = or i8 %arg0, %arg1
  %#1 = or i8 %#0, %arg2
  br label %bb3

bb3:
  %or22 = phi i8 [ %#1, %bb2 ], [ 0, %entry ]
  %or33 = or i8 %or22, %arg3
  %or3 = zext i8 %or33 to i32
  ret i32 %or3
}
Transformation doesn't verify!

ERROR: Target is more poisonous than source

Example:
i1 %cond = #x0 (0)
i8 %arg0 = #x00 (0)
i8 %arg1 = #x00 (0)
i8 %arg2 = #x00 (0)
i8 %arg3 = poison

Source:
  >> Jump to %bb3
i8 %phi0 = #x00 (0)
i8 %phi1 = #x00 (0)
i8 %phi2 = #x00 (0)
i8 %phi3 = #x00 (0)     [based on undef value]
i32 %zext0 = #x00000000 (0)
i32 %zext1 = #x00000000 (0)
i32 %zext2 = #x00000000 (0)
i32 %zext3 = #x00000000 (0)
i32 %or1 = #x00000000 (0)
i32 %or2 = #x00000000 (0)
i32 %or3 = #x00000000 (0)

Target:
  >> Jump to %bb3
i8 %or22 = #x00 (0)
i8 %or33 = poison
i32 %or3 = poison
Source value: #x00000000 (0)
Target value: poison

Summary:
  0 correct transformations
  1 incorrect transformations
  0 failed-to-prove transformations
  0 Alive2 errors
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcl19v4ygXxj8NuUGN4GDH5MIX6bTR21cjzaozq527FTY4oXLAApxt59Ov_CeOnXHbtJcbjTzF_vHwAOccY-G93hmlUhTfovhuIeqwty7NrNk91eZpkVn5ku5DqDxiGwRbBNudDvs6W-b2gGBblsfTfzeVs08qDwi2WWkzBFtBJaO5EDyPGeEgKRQxJxRA5gVkUBQceKwSPtLRTb8fThhfWHfwCLYPxocv9pBpo6atjZHf3E_rlnlVIWBfga2im-YaI3KHyKa7ftZ7zpOVTOhaFXFGCQWucrGSfJUkZMUh4lnEGSU0-aB3V-dBW9Pd1GY3mCd0dfMVCJCx-e66KfVRAXaqsi4gtsHTOYn28bJxsbRu13hvRvuFYBv9_fPl6ftEcUW6f63p9tbNlb-OlqrQRmHNAKOIVHtN_zRSFQ-mqsMSEHBNMYI4t0Yi-II1b1rC7cikRSctmLQYgjVGyW03njLBvTRzbVsYZw5PRyhFpsrmRpbBRZuNZ948nsi8DrIRiCCu9ppgxO5wtdetzfh2PKluaIziu7YV3-LT7dZ7-6AT67TovBb9mFYvBvNi8CkxNi_G5sXqZt_fEPylnkO3bs1f_f62axlsEz8XKJ1B6RTtSZghYV6UzaDsd9S6bnTrusDuzfeTa91NaLigraMjdqrMfmNhxLIT61Q4E6d4TPr1ROwOsfv_VAIiiBEwMiwOv0ip1uOEpVO26X1m4TOJbR3M5U8z1sfzxzrGpg4b-bNDNhMVo8Bsu08D882QGN4zonmfYGmVNwiSgI_K6eIFAR1P_f7x8dtj8-r4IdyukfX4YJ3CldXeGlt7HPbCYG9rl6tJx2dxqEo1rNt569sJIGDPBCPgBMG6J4adPBOvIfR9BN5H-rLVTmXs_Xs3m9GWs3vE7vH_60PVLPU4QkbV6e3xhgL-JvKe66HYXiJrFN9mwiuJrekqLD6KslZDrI3r00ih-10MdUbp9Shcj7Lr0FN1vQK8cvBT_rwO9knSRvtHImAoCa_v3ZDo44i7MDZ-1IVhv41s84bpPjkHciak68NBTMoxwbl1TuUBh0lF8CeAYm3eQQguhC6VvAm2OQgf1etgfxZVzlnnL46UC5kyuWZrsVApTRgha7IidLFPheQyioo8iRNBZJYxxXJJMiH4CoQqsoVOgUBECXASRQzoMo9jxqgSVPI4k3mOIqIOQpfDKXehva9VSinjMV-0Fd-fvmFc2h7ps3rnUURK7YM_9ws6lCr9y1mzw4UtpTY7nGkj3Au2lcf_6LDHf_zvAdtKOWGkX9Su_PgHUOuu-QLoDR5T-DcAAP__7MiUJQ">