<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">