Chris Lattner | 4f68e0c | 2009-10-11 03:54:21 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -jump-threading -S | FileCheck %s |
Chris Lattner | d57b6b8 | 2008-04-22 06:35:14 +0000 | [diff] [blame] | 2 | ; There should be no uncond branches left. |
Chris Lattner | 4f68e0c | 2009-10-11 03:54:21 +0000 | [diff] [blame] | 3 | ; RUN: opt < %s -jump-threading -S | not grep {br label} |
Chris Lattner | d57b6b8 | 2008-04-22 06:35:14 +0000 | [diff] [blame] | 4 | |
| 5 | declare i32 @f1() |
| 6 | declare i32 @f2() |
| 7 | declare void @f3() |
| 8 | |
Chris Lattner | 3733adb | 2009-10-11 03:55:30 +0000 | [diff] [blame^] | 9 | define i32 @test1(i1 %cond) { |
| 10 | ; CHECK: @test1 |
| 11 | |
Chris Lattner | d57b6b8 | 2008-04-22 06:35:14 +0000 | [diff] [blame] | 12 | br i1 %cond, label %T1, label %F1 |
| 13 | |
| 14 | T1: |
| 15 | %v1 = call i32 @f1() |
| 16 | br label %Merge |
| 17 | |
| 18 | F1: |
| 19 | %v2 = call i32 @f2() |
| 20 | br label %Merge |
| 21 | |
| 22 | Merge: |
| 23 | %A = phi i1 [true, %T1], [false, %F1] |
| 24 | %B = phi i32 [%v1, %T1], [%v2, %F1] |
| 25 | br i1 %A, label %T2, label %F2 |
| 26 | |
| 27 | T2: |
Chris Lattner | 4f68e0c | 2009-10-11 03:54:21 +0000 | [diff] [blame] | 28 | ; CHECK: T2: |
| 29 | ; CHECK: ret i32 %v1 |
Chris Lattner | d57b6b8 | 2008-04-22 06:35:14 +0000 | [diff] [blame] | 30 | call void @f3() |
| 31 | ret i32 %B |
| 32 | |
| 33 | F2: |
Chris Lattner | 4f68e0c | 2009-10-11 03:54:21 +0000 | [diff] [blame] | 34 | ; CHECK: F2: |
| 35 | ; CHECK: ret i32 %v2 |
Chris Lattner | d57b6b8 | 2008-04-22 06:35:14 +0000 | [diff] [blame] | 36 | ret i32 %B |
| 37 | } |
Chris Lattner | f4b9ed2 | 2008-12-03 07:48:08 +0000 | [diff] [blame] | 38 | |
| 39 | |
| 40 | ;; cond is known false on Entry -> F1 edge! |
| 41 | define i32 @test2(i1 %cond) { |
Chris Lattner | 3733adb | 2009-10-11 03:55:30 +0000 | [diff] [blame^] | 42 | ; CHECK: @test2 |
Chris Lattner | f4b9ed2 | 2008-12-03 07:48:08 +0000 | [diff] [blame] | 43 | Entry: |
| 44 | br i1 %cond, label %T1, label %F1 |
| 45 | |
| 46 | T1: |
Chris Lattner | 4f68e0c | 2009-10-11 03:54:21 +0000 | [diff] [blame] | 47 | ; CHECK: %v1 = call i32 @f1() |
| 48 | ; CHECK: ret i32 47 |
Chris Lattner | f4b9ed2 | 2008-12-03 07:48:08 +0000 | [diff] [blame] | 49 | %v1 = call i32 @f1() |
| 50 | br label %Merge |
| 51 | |
| 52 | F1: |
| 53 | br i1 %cond, label %Merge, label %F2 |
| 54 | |
| 55 | Merge: |
| 56 | %B = phi i32 [47, %T1], [192, %F1] |
| 57 | ret i32 %B |
| 58 | |
| 59 | F2: |
| 60 | call void @f3() |
| 61 | ret i32 12 |
| 62 | } |
Chris Lattner | 3733adb | 2009-10-11 03:55:30 +0000 | [diff] [blame^] | 63 | |
| 64 | |
| 65 | ; Undef handling. |
| 66 | define i32 @test3(i1 %cond) { |
| 67 | ; CHECK: @test3 |
| 68 | ; CHECK-NEXT: T1: |
| 69 | ; CHECK-NEXT: ret i32 42 |
| 70 | br i1 undef, label %T1, label %F1 |
| 71 | |
| 72 | T1: |
| 73 | ret i32 42 |
| 74 | |
| 75 | F1: |
| 76 | ret i32 17 |
| 77 | } |