[SimplifyCFG] Check if the return instruction causes undefined behavior
authorDianQK <dianqk@dianqk.net>
Sat, 18 Feb 2023 15:09:07 +0000 (23:09 +0800)
committerDianQK <dianqk@dianqk.net>
Sat, 18 Feb 2023 15:31:57 +0000 (23:31 +0800)
commit7be55b007698f6b6398cbbea69c327b5a971938a
tree67290edca86e946fcaded7034deef9e4fbbbfa9a
parent4d5fd9b79fed50e1ceceec90fbd73099700fc6fd
[SimplifyCFG] Check if the return instruction causes undefined behavior

This should fix https://github.com/rust-lang/rust/issues/107681.

Return undefined to a noundef return value is undefined.

Example:

```
define noundef i32 @test_ret_noundef(i1 %cond) {
entry:
  br i1 %cond, label %bb1, label %bb2
bb1:
  br label %bb2
bb2:
  %r = phi i32 [ undef, %entry ], [ 1, %bb1 ]
  ret i32 %r
}
```

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D144319
llvm/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/test/Transforms/SimplifyCFG/unreachable-eliminate-on-ret.ll [new file with mode: 0644]