| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | 
 | ; RUN: opt -passes=jump-threading -S < %s | FileCheck %s | 
 |  | 
 | @x = global i32 0 | 
 | @y = global i32 0 | 
 |  | 
 | declare void @f() | 
 | declare void @g() | 
 |  | 
 | define i32 @pre(i1 %cond, i32 %n) { | 
 | ; CHECK-LABEL: @pre( | 
 | ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[C_THREAD:%.*]], label [[C:%.*]] | 
 | ; CHECK:       C.thread: | 
 | ; CHECK-NEXT:    store i32 0, ptr @x, align 4 | 
 | ; CHECK-NEXT:    br label [[YES:%.*]] | 
 | ; CHECK:       C: | 
 | ; CHECK-NEXT:    [[A_PR:%.*]] = load i32, ptr @y, align 4 | 
 | ; CHECK-NEXT:    [[COND2:%.*]] = icmp eq i32 [[A_PR]], 0 | 
 | ; CHECK-NEXT:    br i1 [[COND2]], label [[YES]], label [[NO:%.*]] | 
 | ; CHECK:       YES: | 
 | ; CHECK-NEXT:    [[A4:%.*]] = phi i32 [ 0, [[C_THREAD]] ], [ [[A_PR]], [[C]] ] | 
 | ; CHECK-NEXT:    call void @f() | 
 | ; CHECK-NEXT:    ret i32 [[A4]] | 
 | ; CHECK:       NO: | 
 | ; CHECK-NEXT:    call void @g() | 
 | ; CHECK-NEXT:    ret i32 1 | 
 | ; | 
 |   br i1 %cond, label %A, label %B | 
 | A: | 
 |   store i32 0, ptr @x | 
 |   br label %C | 
 | B: | 
 |   br label %C | 
 | C: | 
 |   %ptr = phi ptr [@x, %A], [@y, %B] | 
 |   %a = load i32, ptr %ptr | 
 |   %cond2 = icmp eq i32 %a, 0 | 
 |   br i1 %cond2, label %YES, label %NO | 
 | YES: | 
 |   call void @f() | 
 |   ret i32 %a | 
 | NO: | 
 |   call void @g() | 
 |   ret i32 1 | 
 | } | 
 |  | 
 | define i32 @pre_freeze(i1 %cond, i32 %n) { | 
 | ; CHECK-LABEL: @pre_freeze( | 
 | ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[C_THREAD:%.*]], label [[C:%.*]] | 
 | ; CHECK:       C.thread: | 
 | ; CHECK-NEXT:    store i32 0, ptr @x, align 4 | 
 | ; CHECK-NEXT:    br label [[YES:%.*]] | 
 | ; CHECK:       C: | 
 | ; CHECK-NEXT:    [[A_PR:%.*]] = load i32, ptr @y, align 4 | 
 | ; CHECK-NEXT:    [[COND2:%.*]] = icmp eq i32 [[A_PR]], 0 | 
 | ; CHECK-NEXT:    [[COND2_FR:%.*]] = freeze i1 [[COND2]] | 
 | ; CHECK-NEXT:    br i1 [[COND2_FR]], label [[YES]], label [[NO:%.*]] | 
 | ; CHECK:       YES: | 
 | ; CHECK-NEXT:    [[A5:%.*]] = phi i32 [ 0, [[C_THREAD]] ], [ [[A_PR]], [[C]] ] | 
 | ; CHECK-NEXT:    call void @f() | 
 | ; CHECK-NEXT:    ret i32 [[A5]] | 
 | ; CHECK:       NO: | 
 | ; CHECK-NEXT:    call void @g() | 
 | ; CHECK-NEXT:    ret i32 1 | 
 | ; | 
 |   br i1 %cond, label %A, label %B | 
 | A: | 
 |   store i32 0, ptr @x | 
 |   br label %C | 
 | B: | 
 |   br label %C | 
 | C: | 
 |   %ptr = phi ptr [@x, %A], [@y, %B] | 
 |   %a = load i32, ptr %ptr | 
 |   %cond2 = icmp eq i32 %a, 0 | 
 |   %cond2.fr = freeze i1 %cond2 | 
 |   br i1 %cond2.fr, label %YES, label %NO | 
 | YES: | 
 |   call void @f() | 
 |   ret i32 %a | 
 | NO: | 
 |   call void @g() | 
 |   ret i32 1 | 
 | } |