; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -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, i32* @x, align 4 ; CHECK-NEXT: br label [[YES:%.*]] ; CHECK: C: ; CHECK-NEXT: [[A_PR:%.*]] = load i32, i32* @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, i32* @x br label %C B: br label %C C: %ptr = phi i32* [@x, %A], [@y, %B] %a = load i32, i32* %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, i32* @x, align 4 ; CHECK-NEXT: br label [[YES:%.*]] ; CHECK: C: ; CHECK-NEXT: [[A_PR:%.*]] = load i32, i32* @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, i32* @x br label %C B: br label %C C: %ptr = phi i32* [@x, %A], [@y, %B] %a = load i32, i32* %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 }