Issue 113858
Summary Wrong folding binary ops with PHI operands
Labels
Assignees
Reporter bongjunj
    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
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to