For PR1319:
[oota-llvm.git] / test / Transforms / CorrelatedExprs / basictest.ll
1 ; RUN: llvm-upgrade < %s | llvm-as | opt -cee -constprop -instcombine -dce | \
2 ; RUN:   llvm-dis | not grep REMOVE
3
4 int %test1(int %A) {
5         %cond = seteq int %A, 40
6         br bool %cond, label %T, label %F
7 T:
8         %REMOVE = add int %A, 2  ; Should become = 42
9         ret int %REMOVE
10 F:
11         ret int 8
12 }
13
14 bool %test2(int %A) {
15         %cond = seteq int %A, 40
16         br bool %cond, label %T, label %F
17 T:
18         %REMOVE = seteq int %A, 2  ; Should become = false
19         ret bool %REMOVE
20 F:
21         ret bool false
22 }
23
24 bool %test3(int %A) {
25         %cond = setlt int %A, 40
26         br bool %cond, label %T, label %F
27 T:
28         %REMOVE = setgt int %A, 47  ; Should become = false
29         ret bool %REMOVE
30 F:
31         %REMOVE2 = setge int %A, 40  ; Should become = true
32         ret bool %REMOVE2
33 }
34
35 bool %test4(int %A) {
36         %cond = setlt int %A, 40
37         br bool %cond, label %T, label %F
38 T:
39         %REMOVE = setgt int %A, 47  ; Should become = false
40         ret bool %REMOVE
41 F:
42         ret bool false
43 }
44
45 int %test5(int %A, int %B) {
46         %cond = setne int %A, %B
47         br bool %cond, label %F, label %T
48 T:
49         %C = sub int %A, %B  ; = 0
50         ret int %C
51 F:
52         ret int 0
53 }
54
55 bool %test6(int %A) {
56         %REMOVE = setlt int %A, 47  ; Should become dead
57         %cond = setlt int %A, 40
58         br bool %cond, label %T, label %F
59 T:
60         ret bool %REMOVE  ;; == true
61 F:
62         ret bool false
63 }
64
65 bool %test7(int %A) {
66         %cond = setlt int %A, 40
67         br bool %cond, label %T, label %F
68 T:
69         %REMOVE = xor bool %cond, true
70         ret bool %REMOVE
71 F:
72         ret bool false
73 }
74
75 ; Test that and expressions are handled...
76 bool %test8(int %A, int %B) {
77         %cond1 = setle int %A, 7
78         %cond2 = setle int %B, 7
79         %cond = and bool %cond1, %cond2
80         br bool %cond, label %T, label %F
81 T:
82         %REMOVE1 = seteq int %A, 9             ; false
83         %REMOVE2 = setge int %B, 9             ; false
84         %REMOVE = or bool %REMOVE1, %REMOVE2   ; false
85         ret bool %REMOVE
86 F:
87         ret bool false
88 }
89
90 ; Test that or expressions are handled...
91 bool %test9(int %A, int %B) {
92         %cond1 = setle int %A, 7
93         %cond2 = setle int %B, 7
94         %cond = or bool %cond1, %cond2
95         br bool %cond, label %T, label %F
96 T:
97         ret bool false
98 F:
99         %REMOVE1 = setge int %A, 8             ; true
100         %REMOVE2 = setge int %B, 8             ; true
101         %REMOVE = or bool %REMOVE1, %REMOVE2   ; true
102         ret bool %REMOVE
103 }
104
105 bool %test10(int %A) {
106         %cond = setle int %A, 7
107         br bool %cond, label %T, label %F
108 T:
109         ret bool false
110 F:
111         %REMOVE = setge int %A, 8
112         ret bool %REMOVE
113 }
114
115 ; Implement correlated comparisons against non-constants
116 bool %test11(int %A, int %B) {
117         %cond = setlt int %A, %B
118         br bool %cond, label %T, label %F
119 T:
120         %REMOVE1 = seteq int %A, %B    ; false
121         %REMOVE2 = setle int %A, %B    ; true
122         %cond2 = and bool %REMOVE1, %REMOVE2
123         ret bool %cond2
124 F:
125         ret bool true
126 }
127
128 bool %test12(int %A) {
129         %cond = setlt int %A, 0
130         br bool %cond, label %T, label %F
131 T:
132         %REMOVE = setne int %A, 0    ; true
133         ret bool %REMOVE
134 F:
135         ret bool false
136 }