Switch simplification could sometimes fail to notice when an intermediate case removal caused the switch condition to become constant. This would cause the switch to be simplified into a conditional branch rather than a direct branch. Most of the time this didn't matter, except that occasionally downstream parts of SimplifyCFG expect tautological branches to already have been eliminated. The missed handling in switch simplification would cause an assertion failure in the downstream code. Triggering the assertion failure is fairly sensitive to the exact order of various simplifications. Fixes https://github.com/llvm/llvm-project/issues/59768 Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D140831
28 lines
584 B
LLVM
28 lines
584 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -passes="simplifycfg<forward-switch-cond;no-keep-loops>" < %s | FileCheck %s
|
|
|
|
define i8 @test() {
|
|
; CHECK-LABEL: @test(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[LOOP2:%.*]]
|
|
; CHECK: loop2:
|
|
; CHECK-NEXT: br label [[LOOP2]]
|
|
;
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
%phi1 = phi i8 [ 0, %entry ], [ %phi2, %loop2 ]
|
|
br label %loop2
|
|
|
|
loop2:
|
|
%phi2 = phi i8 [ %phi1, %loop ], [ 0, %loop2 ]
|
|
switch i8 %phi2, label %loop [
|
|
i8 0, label %loop2
|
|
i8 1, label %exit
|
|
]
|
|
|
|
exit:
|
|
ret i8 0
|
|
}
|