| Shawn Landden | 24f4085 | 2019-06-13 19:36:38 +0000 | [diff] [blame] | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 2 | ; RUN: opt < %s -simplifycfg -S | FileCheck %s | 
|  | 3 |  | 
|  | 4 | ; Test that we can thread a simple known condition through switch statements. | 
|  | 5 |  | 
|  | 6 | declare void @foo1() | 
|  | 7 |  | 
|  | 8 | declare void @foo2() | 
|  | 9 |  | 
|  | 10 | declare void @DEAD() | 
|  | 11 |  | 
|  | 12 | define void @test1(i32 %V) { | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 13 | ; CHECK-LABEL: @test1( | 
| Shawn Landden | 24f4085 | 2019-06-13 19:36:38 +0000 | [diff] [blame] | 14 | ; CHECK-NEXT:    switch i32 [[V:%.*]], label [[A:%.*]] [ | 
|  | 15 | ; CHECK-NEXT:    i32 4, label [[T:%.*]] | 
|  | 16 | ; CHECK-NEXT:    i32 17, label [[DONE:%.*]] | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 17 | ; CHECK-NEXT:    ] | 
|  | 18 | ; CHECK:       T: | 
|  | 19 | ; CHECK-NEXT:    call void @foo1() | 
|  | 20 | ; CHECK-NEXT:    call void @foo2() | 
| Shawn Landden | 24f4085 | 2019-06-13 19:36:38 +0000 | [diff] [blame] | 21 | ; CHECK-NEXT:    br label [[DONE]] | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 22 | ; CHECK:       A: | 
|  | 23 | ; CHECK-NEXT:    call void @foo1() | 
| Shawn Landden | 24f4085 | 2019-06-13 19:36:38 +0000 | [diff] [blame] | 24 | ; CHECK-NEXT:    br label [[DONE]] | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 25 | ; CHECK:       Done: | 
|  | 26 | ; CHECK-NEXT:    ret void | 
| Shawn Landden | 24f4085 | 2019-06-13 19:36:38 +0000 | [diff] [blame] | 27 | ; | 
|  | 28 | switch i32 %V, label %A [ | 
|  | 29 | i32 4, label %T | 
|  | 30 | i32 17, label %Done | 
|  | 31 | i32 1234, label %A | 
|  | 32 | ] | 
|  | 33 | ;; V == 4 if we get here. | 
|  | 34 | T:              ; preds = %0 | 
|  | 35 | call void @foo1( ) | 
|  | 36 | ;; This switch is always statically determined. | 
|  | 37 | switch i32 %V, label %A2 [ | 
|  | 38 | i32 4, label %B | 
|  | 39 | i32 17, label %C | 
|  | 40 | i32 42, label %C | 
|  | 41 | ] | 
|  | 42 | A2:             ; preds = %T | 
|  | 43 | call void @DEAD( ) | 
|  | 44 | call void @DEAD( ) | 
|  | 45 | ;; always true | 
|  | 46 | %cond2 = icmp eq i32 %V, 4              ; <i1> [#uses=1] | 
|  | 47 | br i1 %cond2, label %Done, label %C | 
|  | 48 | A:              ; preds = %0, %0 | 
|  | 49 | call void @foo1( ) | 
|  | 50 | ;; always true | 
|  | 51 | %cond = icmp ne i32 %V, 4               ; <i1> [#uses=1] | 
|  | 52 | br i1 %cond, label %Done, label %C | 
|  | 53 | Done:           ; preds = %B, %A, %A2, %0 | 
|  | 54 | ret void | 
|  | 55 | B:              ; preds = %T | 
|  | 56 | call void @foo2( ) | 
|  | 57 | ;; always true | 
|  | 58 | %cond3 = icmp eq i32 %V, 4              ; <i1> [#uses=1] | 
|  | 59 | br i1 %cond3, label %Done, label %C | 
|  | 60 | C:              ; preds = %B, %A, %A2, %T, %T | 
|  | 61 | call void @DEAD( ) | 
|  | 62 | ret void | 
|  | 63 |  | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 64 | } | 
|  | 65 |  | 
|  | 66 | define void @test2(i32 %V) { | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 67 | ; CHECK-LABEL: @test2( | 
| Shawn Landden | 24f4085 | 2019-06-13 19:36:38 +0000 | [diff] [blame] | 68 | ; CHECK-NEXT:    switch i32 [[V:%.*]], label [[A:%.*]] [ | 
|  | 69 | ; CHECK-NEXT:    i32 4, label [[T:%.*]] | 
|  | 70 | ; CHECK-NEXT:    i32 17, label [[D:%.*]] | 
|  | 71 | ; CHECK-NEXT:    i32 1234, label [[E:%.*]] | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 72 | ; CHECK-NEXT:    ] | 
|  | 73 | ; CHECK:       A: | 
|  | 74 | ; CHECK-NEXT:    call void @foo1() | 
| Shawn Landden | 24f4085 | 2019-06-13 19:36:38 +0000 | [diff] [blame] | 75 | ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[V]], 42 | 
|  | 76 | ; CHECK-NEXT:    br i1 [[COND]], label [[D]], label [[E]] | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 77 | ; CHECK:       T: | 
|  | 78 | ; CHECK-NEXT:    call void @foo1() | 
|  | 79 | ; CHECK-NEXT:    call void @foo1() | 
|  | 80 | ; CHECK-NEXT:    ret void | 
|  | 81 | ; CHECK:       D: | 
|  | 82 | ; CHECK-NEXT:    call void @foo1() | 
|  | 83 | ; CHECK-NEXT:    ret void | 
|  | 84 | ; CHECK:       E: | 
|  | 85 | ; CHECK-NEXT:    ret void | 
| Shawn Landden | 24f4085 | 2019-06-13 19:36:38 +0000 | [diff] [blame] | 86 | ; | 
|  | 87 | switch i32 %V, label %A [ | 
|  | 88 | i32 4, label %T | 
|  | 89 | i32 17, label %D | 
|  | 90 | i32 1234, label %E | 
|  | 91 | ] | 
|  | 92 | ;; V != 4, 17, 1234 here. | 
|  | 93 | A:              ; preds = %0 | 
|  | 94 | call void @foo1( ) | 
|  | 95 | ;; This switch is always statically determined. | 
|  | 96 | switch i32 %V, label %E [ | 
|  | 97 | i32 4, label %C | 
|  | 98 | i32 17, label %C | 
|  | 99 | i32 42, label %D | 
|  | 100 | ] | 
|  | 101 | ;; unreacahble. | 
|  | 102 | C:              ; preds = %A, %A | 
|  | 103 | call void @DEAD( ) | 
|  | 104 | ret void | 
|  | 105 | T:              ; preds = %0 | 
|  | 106 | call void @foo1( ) | 
|  | 107 | call void @foo1( ) | 
|  | 108 | ret void | 
|  | 109 | D:              ; preds = %A, %0 | 
|  | 110 | call void @foo1( ) | 
|  | 111 | ret void | 
|  | 112 | E:              ; preds = %A, %0 | 
|  | 113 | ret void | 
|  | 114 |  | 
| Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 115 | } | 
|  | 116 |  |