; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -loop-simplifycfg %s | FileCheck %s ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes='require<domtree>,loop(loop-simplifycfg)' %s | FileCheck %s declare i32* @fake_personality_function() declare void @foo() define i32 @test_remove_lpad(i1 %exitcond) personality i32* ()* @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 i32* ()* @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 i32* ()* @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 }