| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 | 
 | ; RUN: opt -S -passes=jump-threading < %s | FileCheck %s | 
 |  | 
 | @f = external global i32 | 
 |  | 
 | ; Make sure the value of @f is reloaded prior to the final comparison. | 
 | define i32 @test(i64 %idx, i32 %val) { | 
 | ; CHECK-LABEL: define i32 @test( | 
 | ; CHECK-SAME: i64 [[IDX:%.*]], i32 [[VAL:%.*]]) { | 
 | ; CHECK-NEXT:  entry: | 
 | ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[IDX]], 1 | 
 | ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[RETURN:%.*]] | 
 | ; CHECK:       for.body: | 
 | ; CHECK-NEXT:    [[F:%.*]] = load i32, ptr @f, align 4 | 
 | ; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[F]], 0 | 
 | ; CHECK-NEXT:    br i1 [[CMP1]], label [[COND_END_THREAD:%.*]], label [[COND_END:%.*]] | 
 | ; CHECK:       cond.end: | 
 | ; CHECK-NEXT:    [[CMP_I:%.*]] = icmp sgt i32 [[VAL]], 0 | 
 | ; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[CMP_I]] | 
 | ; CHECK-NEXT:    br i1 [[COND_FR]], label [[COND_END_THREAD]], label [[TMP0:%.*]] | 
 | ; CHECK:       cond.end.thread: | 
 | ; CHECK-NEXT:    br label [[TMP0]] | 
 | ; CHECK:       0: | 
 | ; CHECK-NEXT:    [[TMP1:%.*]] = phi i32 [ 0, [[COND_END_THREAD]] ], [ [[VAL]], [[COND_END]] ] | 
 | ; CHECK-NEXT:    [[F_IDX:%.*]] = getelementptr inbounds i32, ptr @f, i64 [[IDX]] | 
 | ; CHECK-NEXT:    store i32 [[TMP1]], ptr [[F_IDX]], align 4 | 
 | ; CHECK-NEXT:    [[F_RELOAD:%.*]] = load i32, ptr @f, align 4 | 
 | ; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i32 [[F_RELOAD]], 1 | 
 | ; CHECK-NEXT:    br i1 [[CMP3]], label [[RETURN2:%.*]], label [[RETURN]] | 
 | ; CHECK:       return: | 
 | ; CHECK-NEXT:    ret i32 0 | 
 | ; CHECK:       return2: | 
 | ; CHECK-NEXT:    ret i32 1 | 
 | ; | 
 | entry: | 
 |   %cmp = icmp slt i64 %idx, 1 | 
 |   br i1 %cmp, label %for.body, label %return | 
 |  | 
 | for.body: | 
 |   %f = load i32, ptr @f, align 4 | 
 |   %cmp1 = icmp eq i32 %f, 0 | 
 |   br i1 %cmp1, label %cond.end, label %cond.false | 
 |  | 
 | cond.false: | 
 |   br label %cond.end | 
 |  | 
 | cond.end: | 
 |   %phi = phi i32 [ %val, %cond.false ], [ 1, %for.body ] | 
 |   %cmp.i = icmp sgt i32 %phi, 0 | 
 |   %sel = select i1 %cmp.i, i32 0, i32 %phi | 
 |   %f.idx = getelementptr inbounds i32, ptr @f, i64 %idx | 
 |   store i32 %sel, ptr %f.idx, align 4 | 
 |   %f.reload = load i32, ptr @f, align 4 | 
 |   %cmp3 = icmp slt i32 %f.reload, 1 | 
 |   br i1 %cmp3, label %return2, label %return | 
 |  | 
 | return: | 
 |   ret i32 0 | 
 |  | 
 | return2: | 
 |   ret i32 1 | 
 | } |