llvm / llvm/llvm-project

[LSR] New poison dependency when normalizing post-increment IV uses with variable stride

Open
#174,200 1 comment 0 reactions 0 assignees View on GitHub
llvm:optimizations miscompilation
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

LSR rewrites post-increment IV uses by normalizing `E_post → E_pre = E_post - stride`. The invertibility check only validates SCEV structural equivalence and does not account for poison propagation.

For example, in this IR, if `%step` is poison, `%iv.next` is poison, but `%iv` remains 0, and the function returns 0:

```llvm
%iv.next = add i32 %iv, %step
...
%conv5 = zext i32 %iv to i64
```

is transformed to:

```llvm
%0 = sub i32 0, %step
...
%1 = add i32 %0, %iv.next
%iv.lcssa = phi i32 [ %1, %loop ]
%conv5 = zext i32 %iv.lcssa to i64
```

Now `%iv.lcssa` becomes poison when `%step` is poison, and the function returns poison.

Alive2 proof: https://alive2.llvm.org/ce/z/8UEKvn

Extracted from https://github.com/llvm/llvm-project/commit/3a57152d85e1b9f993871d550846f193ab91450c, cc @fhahn

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.