Issue 177729
Summary Loop reduction optimization incorrectly propagates poison
Labels new issue
Assignees
Reporter sairam2661
    **Fuzzer Generated Test**
**Reproducer**
https://alive2.llvm.org/ce/z/eCwTnN

**Description**
When a loop executes zero times, the source returns the initial phi value without using the loop-variant input, but the optimizer transforms this to compute `input * count` which propagates poison.

**Steps to reproduce**
- Minimized test case, `input.ll`
```
define i8 @test(i32 %x, i32 %n) {
entry:
  br label %for.cond

for.cond: ; preds = %for.cond, %entry
  %load.r1 = phi i32 [ %ibinop2, %for.cond ], [ 0, %entry ]
  %load = phi i32 [ %ibinop, %for.cond ], [ 0, %entry ]
  %ibinop2 = add i32 %load.r1, %x
  %ibinop = add i32 %load, 1
 %icmp = icmp slt i32 %load, %n
  br i1 %icmp, label %for.cond, label %for.end

for.end:                                          ; preds = %for.cond
  %t = trunc i32 %load.r1 to i8
  ret i8 %t
}
```

**Output**
```
----------------------------------------
define i8 @test(i32 %x, i32 %n) {
entry:
  br label %for.cond

for.cond:
 %load.r1 = phi i32 [ %ibinop2, %for.cond ], [ 0, %entry ]
  %load = phi i32 [ %ibinop, %for.cond ], [ 0, %entry ]
  %ibinop2 = add i32 %load.r1, %x
 %ibinop = add i32 %load, 1
  %icmp = icmp slt i32 %load, %n
  br i1 %icmp, label %for.cond, label %for.end

for.end:
  %t = trunc i32 %load.r1 to i8
  ret i8 %t
}
=>
define i8 @test(i32 %x, i32 %n) nofree willreturn memory(none) {
entry:
  %smax = smax i32 %n, 0
  %#0 = mul i32 %x, %smax
 %t = trunc i32 %#0 to i8
  ret i8 %t
}
Transformation doesn't verify!

ERROR: Target is more poisonous than source

Example:
i32 %x = poison
i32 %n = #x00000000 (0)

Source:
  >> Jump to %for.cond
i32 %load.r1 = #x00000000 (0)
i32 %load = #x00000000 (0)
i32 %ibinop2 = poison
i32 %ibinop = #x00000001 (1)
i1 %icmp = #x0 (0)
  >> Jump to %for.end
i8 %t = #x00 (0)

Target:
i32 %smax = #x00000000 (0)
i32 %#0 = poison
i8 %t = poison
Source value: #x00 (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