llvm-project/llvm/test/Transforms/SimplifyCFG/unreachable-multi-basic-block-funclet.ll
Gábor Spaits 43561ad204
[BasicBlockUtils] Handle funclets when detaching EH pad blocks (#157363)
Fixes #148052 .

When removing EH Pad blocks, the value defined by them becomes poison. These poison values are then used by `catchret` and `cleanupret`, which is invalid. This commit replaces those unreachable `catchret` and `cleanupret` instructions with `unreachable`.
2025-09-11 22:52:16 +02:00

170 lines
3.8 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -passes=simplifycfg -S < %s | FileCheck %s
; cleanuppad/cleanupret
define void @unreachable_cleanuppad_linear(i64 %shapes.1) personality ptr null {
; CHECK-LABEL: define void @unreachable_cleanuppad_linear(
; CHECK-SAME: i64 [[SHAPES_1:%.*]]) personality ptr null {
; CHECK-NEXT: [[START:.*:]]
; CHECK-NEXT: [[_7:%.*]] = icmp ult i64 0, [[SHAPES_1]]
; CHECK-NEXT: ret void
;
start:
%_7 = icmp ult i64 0, %shapes.1
ret void
funclet:
%cleanuppad = cleanuppad within none []
br label %funclet_end
funclet_end:
cleanupret from %cleanuppad unwind to caller
}
define void @unreachable_cleanuppad_multiple_predecessors(i64 %shapes.1) personality ptr null {
; CHECK-LABEL: define void @unreachable_cleanuppad_multiple_predecessors(
; CHECK-SAME: i64 [[SHAPES_1:%.*]]) personality ptr null {
; CHECK-NEXT: [[START:.*:]]
; CHECK-NEXT: [[_7:%.*]] = icmp ult i64 0, [[SHAPES_1]]
; CHECK-NEXT: ret void
;
start:
%_7 = icmp ult i64 0, %shapes.1
ret void
funclet:
%cleanuppad = cleanuppad within none []
switch i64 %shapes.1, label %otherwise [ i64 0, label %one
i64 1, label %two
i64 42, label %three ]
one:
br label %funclet_end
two:
br label %funclet_end
three:
br label %funclet_end
otherwise:
br label %funclet_end
funclet_end:
cleanupret from %cleanuppad unwind to caller
}
; catchpad/catchret
define void @unreachable_catchpad_linear(i64 %shapes.1) personality ptr null {
; CHECK-LABEL: define void @unreachable_catchpad_linear(
; CHECK-SAME: i64 [[SHAPES_1:%.*]]) personality ptr null {
; CHECK-NEXT: [[START:.*:]]
; CHECK-NEXT: [[_7:%.*]] = icmp ult i64 0, [[SHAPES_1]]
; CHECK-NEXT: ret void
;
start:
%_7 = icmp ult i64 0, %shapes.1
ret void
dispatch:
%cs = catchswitch within none [label %funclet] unwind to caller
funclet:
%cleanuppad = catchpad within %cs []
br label %funclet_end
funclet_end:
catchret from %cleanuppad to label %unreachable
unreachable:
unreachable
}
define void @unreachable_catchpad_multiple_predecessors(i64 %shapes.1) personality ptr null {
; CHECK-LABEL: define void @unreachable_catchpad_multiple_predecessors(
; CHECK-SAME: i64 [[SHAPES_1:%.*]]) personality ptr null {
; CHECK-NEXT: [[START:.*:]]
; CHECK-NEXT: [[_7:%.*]] = icmp ult i64 0, [[SHAPES_1]]
; CHECK-NEXT: ret void
;
start:
%_7 = icmp ult i64 0, %shapes.1
ret void
dispatch:
%cs = catchswitch within none [label %funclet] unwind to caller
funclet:
%cleanuppad = catchpad within %cs []
switch i64 %shapes.1, label %otherwise [ i64 0, label %one
i64 1, label %two
i64 42, label %three ]
one:
br label %funclet_end
two:
br label %funclet_end
three:
br label %funclet_end
otherwise:
br label %funclet_end
funclet_end:
catchret from %cleanuppad to label %unreachable
unreachable:
unreachable
}
; Issue reproducer
define void @gh148052(i64 %shapes.1) personality ptr null {
; CHECK-LABEL: define void @gh148052(
; CHECK-SAME: i64 [[SHAPES_1:%.*]]) personality ptr null {
; CHECK-NEXT: [[START:.*:]]
; CHECK-NEXT: [[_7:%.*]] = icmp ult i64 0, [[SHAPES_1]]
; CHECK-NEXT: call void @llvm.assume(i1 [[_7]])
; CHECK-NEXT: ret void
;
start:
%_7 = icmp ult i64 0, %shapes.1
br i1 %_7, label %bb1, label %panic
bb1:
%_11 = icmp ult i64 0, %shapes.1
br i1 %_11, label %bb3, label %panic1
panic:
unreachable
bb3:
ret void
panic1:
invoke void @func(i64 0, i64 0, ptr null)
to label %unreachable unwind label %funclet_bb14
funclet_bb14:
%cleanuppad = cleanuppad within none []
br label %bb13
unreachable:
unreachable
bb10:
cleanupret from %cleanuppad5 unwind to caller
funclet_bb10:
%cleanuppad5 = cleanuppad within none []
br label %bb10
bb13:
cleanupret from %cleanuppad unwind label %funclet_bb10
}
declare void @func(i64, i64, ptr)