| ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes=loop-simplifycfg %s | FileCheck %s | |
| ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes='require<domtree>,loop(loop-simplifycfg)' %s | FileCheck %s | |
| declare ptr @fake_personality_function() | |
| declare void @foo() | |
| define i32 @test_remove_lpad(i1 %exitcond) personality ptr @fake_personality_function { | |
| ; CHECK-LABEL: @test_remove_lpad( | |
| entry: | |
| br label %for.body | |
| for.body: | |
| br i1 0, label %never, label %next | |
| next: | |
| br label %latch | |
| latch: | |
| br i1 %exitcond, label %exit, label %for.body | |
| exit: | |
| ret i32 0 | |
| never: | |
| invoke void @foo() to label %next unwind label %never-unwind | |
| never-unwind: | |
| ; CHECK: never-unwind: | |
| ; CHECK-NEXT: unreachable | |
| %res = landingpad token cleanup | |
| unreachable | |
| } | |
| define i32 @test_remove_phi_lpad(i1 %exitcond) personality ptr @fake_personality_function { | |
| ; CHECK-LABEL: @test_remove_phi_lpad( | |
| entry: | |
| br label %for.body | |
| for.body: | |
| br i1 0, label %never, label %next | |
| next: | |
| br label %latch | |
| latch: | |
| br i1 %exitcond, label %exit, label %for.body | |
| exit: | |
| ret i32 0 | |
| never: | |
| invoke void @foo() to label %next unwind label %never-unwind | |
| never-unwind: | |
| ; CHECK: never-unwind: | |
| ; CHECK-NEXT: ret i32 poison | |
| %p = phi i32 [1, %never] | |
| %res = landingpad token cleanup | |
| ret i32 %p | |
| } | |
| define i32 @test_split_remove_phi_lpad_(i1 %exitcond) personality ptr @fake_personality_function { | |
| ; CHECK-LABEL: @test_split_remove_phi_lpad_( | |
| entry: | |
| invoke void @foo() to label %for.body unwind label %unwind-bb | |
| for.body: | |
| br i1 0, label %never, label %next | |
| next: | |
| br label %latch | |
| latch: | |
| br i1 %exitcond, label %exit, label %for.body | |
| exit: | |
| ret i32 0 | |
| never: | |
| invoke void @foo() to label %next unwind label %unwind-bb | |
| unwind-bb: | |
| ; CHECK: unwind-bb.loopexit: | |
| ; CHECK-NEXT: br label %unwind-bb | |
| %p = phi i32 [1, %never], [2, %entry] | |
| %res = landingpad token cleanup | |
| ret i32 %p | |
| } |