| ; 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 |
| } |