Files
clang-p2996/llvm/test/Transforms/SimplifyCFG/switch-simplify-crash2.ll
Owen Anderson 733740b189 Fix a phase-ordering problem in SimplifyCFG.
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
2023-01-04 16:47:13 -07:00

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
}