; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -jump-threading -S < %s | FileCheck %s declare void @f() declare void @g() declare void @h() define i32 @test(i1 %cond, i1 %a, i1 %b) { ; CHECK-LABEL: @test( ; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]] ; CHECK: A: ; CHECK-NEXT: call void @f() ; CHECK-NEXT: br i1 [[A:%.*]], label [[EXIT1:%.*]], label [[EXIT2:%.*]] ; CHECK: C: ; CHECK-NEXT: call void @g() ; CHECK-NEXT: br i1 [[B:%.*]], label [[EXIT1]], label [[EXIT2]] ; CHECK: EXIT1: ; CHECK-NEXT: ret i32 0 ; CHECK: EXIT2: ; CHECK-NEXT: ret i32 1 ; br i1 %cond, label %A, label %B A: call void @f() br label %C B: call void @g() br label %C C: %p = phi i1 [%a, %A], [%b, %B] ; Check that this is removed br i1 %p, label %EXIT1, label %EXIT2 EXIT1: ret i32 0 EXIT2: ret i32 1 } define i32 @test2(i1 %cond, i1 %a, i1 %b) { ; CHECK-LABEL: @test2( ; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]] ; CHECK: A: ; CHECK-NEXT: call void @f() ; CHECK-NEXT: [[P_FR1:%.*]] = freeze i1 [[A:%.*]] ; CHECK-NEXT: br i1 [[P_FR1]], label [[EXIT1:%.*]], label [[EXIT2:%.*]] ; CHECK: C: ; CHECK-NEXT: call void @g() ; CHECK-NEXT: [[P_FR:%.*]] = freeze i1 [[B:%.*]] ; CHECK-NEXT: br i1 [[P_FR]], label [[EXIT1]], label [[EXIT2]] ; CHECK: EXIT1: ; CHECK-NEXT: ret i32 0 ; CHECK: EXIT2: ; CHECK-NEXT: ret i32 1 ; br i1 %cond, label %A, label %B A: call void @f() br label %C B: call void @g() br label %C C: %p = phi i1 [%a, %A], [%b, %B] ; Check that this is removed %p.fr = freeze i1 %p br i1 %p.fr, label %EXIT1, label %EXIT2 EXIT1: ret i32 0 EXIT2: ret i32 1 }