1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=jump-threading -S < %s | FileCheck %s 3 4declare void @f() 5declare void @g() 6declare void @h() 7 8define i32 @test(i1 %cond, i1 %a, i1 %b) { 9; CHECK-LABEL: @test( 10; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]] 11; CHECK: A: 12; CHECK-NEXT: call void @f() 13; CHECK-NEXT: br i1 [[A:%.*]], label [[EXIT1:%.*]], label [[EXIT2:%.*]] 14; CHECK: C: 15; CHECK-NEXT: call void @g() 16; CHECK-NEXT: br i1 [[B:%.*]], label [[EXIT1]], label [[EXIT2]] 17; CHECK: EXIT1: 18; CHECK-NEXT: ret i32 0 19; CHECK: EXIT2: 20; CHECK-NEXT: ret i32 1 21; 22 br i1 %cond, label %A, label %B 23A: 24 call void @f() 25 br label %C 26B: 27 call void @g() 28 br label %C 29C: 30 %p = phi i1 [%a, %A], [%b, %B] ; Check that this is removed 31 br i1 %p, label %EXIT1, label %EXIT2 32EXIT1: 33 ret i32 0 34EXIT2: 35 ret i32 1 36} 37 38define i32 @test2(i1 %cond, i1 %a, i1 %b) { 39; CHECK-LABEL: @test2( 40; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]] 41; CHECK: A: 42; CHECK-NEXT: call void @f() 43; CHECK-NEXT: [[P_FR1:%.*]] = freeze i1 [[A:%.*]] 44; CHECK-NEXT: br i1 [[P_FR1]], label [[EXIT1:%.*]], label [[EXIT2:%.*]] 45; CHECK: C: 46; CHECK-NEXT: call void @g() 47; CHECK-NEXT: [[P_FR:%.*]] = freeze i1 [[B:%.*]] 48; CHECK-NEXT: br i1 [[P_FR]], label [[EXIT1]], label [[EXIT2]] 49; CHECK: EXIT1: 50; CHECK-NEXT: ret i32 0 51; CHECK: EXIT2: 52; CHECK-NEXT: ret i32 1 53; 54 br i1 %cond, label %A, label %B 55A: 56 call void @f() 57 br label %C 58B: 59 call void @g() 60 br label %C 61C: 62 %p = phi i1 [%a, %A], [%b, %B] ; Check that this is removed 63 %p.fr = freeze i1 %p 64 br i1 %p.fr, label %EXIT1, label %EXIT2 65EXIT1: 66 ret i32 0 67EXIT2: 68 ret i32 1 69} 70