Fix my previous patch to handle a degenerate case that the llvm-gcc
[oota-llvm.git] / test / Transforms / SimplifyCFG / switch_create.ll
1 ; RUN: opt < %s -simplifycfg -S | FileCheck %s
2
3 declare void @foo1()
4
5 declare void @foo2()
6
7 define void @test1(i32 %V) {
8         %C1 = icmp eq i32 %V, 4         ; <i1> [#uses=1]
9         %C2 = icmp eq i32 %V, 17                ; <i1> [#uses=1]
10         %CN = or i1 %C1, %C2            ; <i1> [#uses=1]
11         br i1 %CN, label %T, label %F
12 T:              ; preds = %0
13         call void @foo1( )
14         ret void
15 F:              ; preds = %0
16         call void @foo2( )
17         ret void
18 ; CHECK: @test1
19 ; CHECK:  switch i32 %V, label %F [
20 ; CHECK:    i32 17, label %T
21 ; CHECK:    i32 4, label %T
22 ; CHECK:  ]
23 }
24
25 define void @test2(i32 %V) {
26         %C1 = icmp ne i32 %V, 4         ; <i1> [#uses=1]
27         %C2 = icmp ne i32 %V, 17                ; <i1> [#uses=1]
28         %CN = and i1 %C1, %C2           ; <i1> [#uses=1]
29         br i1 %CN, label %T, label %F
30 T:              ; preds = %0
31         call void @foo1( )
32         ret void
33 F:              ; preds = %0
34         call void @foo2( )
35         ret void
36 ; CHECK: @test2
37 ; CHECK:  switch i32 %V, label %T [
38 ; CHECK:    i32 17, label %F
39 ; CHECK:    i32 4, label %F
40 ; CHECK:  ]
41 }
42
43 define void @test3(i32 %V) {
44         %C1 = icmp eq i32 %V, 4         ; <i1> [#uses=1]
45         br i1 %C1, label %T, label %N
46 N:              ; preds = %0
47         %C2 = icmp eq i32 %V, 17                ; <i1> [#uses=1]
48         br i1 %C2, label %T, label %F
49 T:              ; preds = %N, %0
50         call void @foo1( )
51         ret void
52 F:              ; preds = %N
53         call void @foo2( )
54         ret void
55
56 ; CHECK: @test3
57 ; CHECK: switch i32 %V, label %F [
58 ; CHECK:     i32 4, label %T
59 ; CHECK:     i32 17, label %T
60 ; CHECK:   ]
61 }
62
63
64
65 define i32 @test4(i8 zeroext %c) nounwind ssp noredzone {
66 entry:
67   %cmp = icmp eq i8 %c, 62
68   br i1 %cmp, label %lor.end, label %lor.lhs.false
69
70 lor.lhs.false:                                    ; preds = %entry
71   %cmp4 = icmp eq i8 %c, 34
72   br i1 %cmp4, label %lor.end, label %lor.rhs
73
74 lor.rhs:                                          ; preds = %lor.lhs.false
75   %cmp8 = icmp eq i8 %c, 92
76   br label %lor.end
77
78 lor.end:                                          ; preds = %lor.rhs, %lor.lhs.false, %entry
79   %0 = phi i1 [ true, %lor.lhs.false ], [ true, %entry ], [ %cmp8, %lor.rhs ]
80   %lor.ext = zext i1 %0 to i32
81   ret i32 %lor.ext
82   
83 ; CHECK: @test4
84 ; CHECK:  switch i8 %c, label %lor.rhs [
85 ; CHECK:    i8 62, label %lor.end
86 ; CHECK:    i8 34, label %lor.end
87 ; CHECK:    i8 92, label %lor.end
88 ; CHECK:  ]
89 }
90
91 define i32 @test5(i8 zeroext %c) nounwind ssp noredzone {
92 entry:
93   switch i8 %c, label %lor.rhs [
94     i8 62, label %lor.end
95     i8 34, label %lor.end
96     i8 92, label %lor.end
97   ]
98
99 lor.rhs:                                          ; preds = %entry
100   %V = icmp eq i8 %c, 92
101   br label %lor.end
102
103 lor.end:                                          ; preds = %entry, %entry, %entry, %lor.rhs
104   %0 = phi i1 [ true, %entry ], [ %V, %lor.rhs ], [ true, %entry ], [ true, %entry ]
105   %lor.ext = zext i1 %0 to i32
106   ret i32 %lor.ext
107 ; CHECK: @test5
108 ; CHECK:  switch i8 %c, label %lor.rhs [
109 ; CHECK:    i8 62, label %lor.end
110 ; CHECK:    i8 34, label %lor.end
111 ; CHECK:    i8 92, label %lor.end
112 ; CHECK:  ]
113 }