Dan Gohman | 3c7d308 | 2009-09-11 18:01:28 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -jump-threading -simplifycfg -mem2reg -S | grep {ret i32 %v1} |
Chris Lattner | d57b6b8 | 2008-04-22 06:35:14 +0000 | [diff] [blame] | 2 | ; There should be no uncond branches left. |
Dan Gohman | 3c7d308 | 2009-09-11 18:01:28 +0000 | [diff] [blame] | 3 | ; RUN: opt < %s -jump-threading -simplifycfg -mem2reg -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 | |
| 9 | define i32 @test(i1 %cond) { |
| 10 | br i1 %cond, label %T1, label %F1 |
| 11 | |
| 12 | T1: |
| 13 | %v1 = call i32 @f1() |
| 14 | br label %Merge |
| 15 | |
| 16 | F1: |
| 17 | %v2 = call i32 @f2() |
| 18 | br label %Merge |
| 19 | |
| 20 | Merge: |
| 21 | %A = phi i1 [true, %T1], [false, %F1] |
| 22 | %B = phi i32 [%v1, %T1], [%v2, %F1] |
| 23 | br i1 %A, label %T2, label %F2 |
| 24 | |
| 25 | T2: |
| 26 | call void @f3() |
| 27 | ret i32 %B |
| 28 | |
| 29 | F2: |
| 30 | ret i32 %B |
| 31 | } |
Chris Lattner | f4b9ed2 | 2008-12-03 07:48:08 +0000 | [diff] [blame] | 32 | |
| 33 | |
| 34 | ;; cond is known false on Entry -> F1 edge! |
| 35 | define i32 @test2(i1 %cond) { |
| 36 | Entry: |
| 37 | br i1 %cond, label %T1, label %F1 |
| 38 | |
| 39 | T1: |
| 40 | %v1 = call i32 @f1() |
| 41 | br label %Merge |
| 42 | |
| 43 | F1: |
| 44 | br i1 %cond, label %Merge, label %F2 |
| 45 | |
| 46 | Merge: |
| 47 | %B = phi i32 [47, %T1], [192, %F1] |
| 48 | ret i32 %B |
| 49 | |
| 50 | F2: |
| 51 | call void @f3() |
| 52 | ret i32 12 |
| 53 | } |