Issue |
95921
|
Summary |
[CodeGen] Eliminate branches using `undef`
|
Labels |
llvm:codegen,
missed-optimization
|
Assignees |
|
Reporter |
DianQK
|
I tried this IR:
```llvm
define { i64, i64 } @src(i64 noundef %arg, i64 noundef %arg1) local_unnamed_addr #0 {
bb:
switch i64 %arg1, label %bb7 [
i64 2, label %bb3
i64 3, label %bb2
]
bb2: ; preds = %bb
br label %bb3
bb7: ; preds = %bb
%i8 = udiv i64 %arg, %arg1
%i13 = shl nuw i64 %i8, 1
br label %bb3
bb3: ; preds = %bb7, %bb2, %bb
%i = phi i64 [ %i13, %bb7 ], [ %arg, %bb2 ], [ undef, %bb ]
%i4 = phi i64 [ 1, %bb7 ], [ 1, %bb2 ], [ %arg1, %bb ]
%i5 = insertvalue { i64, i64 } poison, i64 %i4, 0
%i6 = insertvalue { i64, i64 } %i5, i64 %i, 1
ret { i64, i64 } %i6
}
```
The assembly code is:
```asm
src: # @src
cmp rsi, 2
je .LBB0_1
cmp rsi, 3
je .LBB0_4
mov rax, rdi
xor edx, edx
div rsi
mov rdi, rax
add rdi, rax
.LBB0_4: # %bb3
mov esi, 1
jmp .LBB0_5
.LBB0_1:
.LBB0_5: # %bb3
mov rax, rsi
mov rdx, rdi
ret
```
We can merge `.LBB0_1` and `.LBB0_5`.
This MIR is:
```llvm
bb.1:
; predecessors: %bb.0
successors: %bb.5(0x80000000); %bb.5(100.00%)
liveins: $rsi
renamable $rdi = IMPLICIT_DEF
```
I think we can remove this BB because we are assigning `undef` to `$rdi`.
GodBolt: https://llvm.godbolt.org/z/joff5fYs9.
From: https://github.com/rust-lang/rust/issues/126585.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs