| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 |
| ; RUN: opt -S -passes=loop-deletion < %s | FileCheck %s |
| |
| ; Do not try to delete a loop that exits to an EH pad, as we can't directly |
| ; branch to it. We would need a different approach here that still retains |
| ; the invoke. |
| |
| define i32 @test() mustprogress personality ptr poison { |
| ; CHECK-LABEL: define i32 @test |
| ; CHECK-SAME: () #[[ATTR0:[0-9]+]] personality ptr poison { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[LOOP:%.*]] |
| ; CHECK: loop: |
| ; CHECK-NEXT: invoke void @llvm.donothing() |
| ; CHECK-NEXT: to label [[LOOP_LATCH:%.*]] unwind label [[LPAD:%.*]] |
| ; CHECK: lpad: |
| ; CHECK-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } |
| ; CHECK-NEXT: cleanup |
| ; CHECK-NEXT: resume { ptr, i32 } [[LP]] |
| ; CHECK: loop.latch: |
| ; CHECK-NEXT: br label [[LOOP]] |
| ; |
| entry: |
| br label %loop |
| |
| loop: |
| invoke void @llvm.donothing() |
| to label %loop.latch unwind label %lpad |
| |
| lpad: |
| %lp = landingpad { ptr, i32 } |
| cleanup |
| resume { ptr, i32 } %lp |
| |
| loop.latch: |
| br label %loop |
| } |
| |
| declare void @llvm.donothing() |