llvm-project/llvm/test/Transforms/LoopDeletion/loop-with-ehpad-not-executed.ll
Manish Kausik H a0b9117454
LoopDeletion: Move EH pad check before the isLoopNeverExecuted Check (#78189)
This commit modifies `LoopDeletion::deleteLoopIfDead` to check if the
exit block of a loop is an EH pad before checking if the loop gets
executed. This handles the case where an unreachable loop has a
landingpad as an Exit block, and the loop gets deleted, leaving leaving
the landingpad without an edge from an unwind clause.

Fixes #76852.
2024-01-19 15:30:20 +01:00

38 lines
1.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt %s -passes=loop-deletion -S | FileCheck %s
define void @wombat() personality ptr null {
; CHECK-LABEL: define void @wombat() personality ptr null {
; CHECK-NEXT: bb:
; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB4:%.*]]
; CHECK: bb1:
; CHECK-NEXT: br label [[BB2:%.*]]
; CHECK: bb2:
; CHECK-NEXT: [[INVOKE:%.*]] = invoke double null()
; CHECK-NEXT: to label [[BB2]] unwind label [[BB3:%.*]]
; CHECK: bb3:
; CHECK-NEXT: [[LANDINGPAD:%.*]] = landingpad { ptr, i32 }
; CHECK-NEXT: cleanup
; CHECK-NEXT: ret void
; CHECK: bb4:
; CHECK-NEXT: ret void
;
bb:
br i1 false, label %bb1, label %bb4
bb1: ; preds = %bb
br label %bb2
bb2: ; preds = %bb1, %bb2
%invoke = invoke double null()
to label %bb2 unwind label %bb3
bb3: ; preds = %bb2
%landingpad = landingpad { ptr, i32 }
cleanup
ret void
bb4: ; preds = %bb
ret void
}