1 ; RUN: llvm-upgrade < %s | llvm-as | opt -cee -constprop -instcombine -dce | \
2 ; RUN: llvm-dis | not grep REMOVE
5 %cond = seteq int %A, 40
6 br bool %cond, label %T, label %F
8 %REMOVE = add int %A, 2 ; Should become = 42
15 %cond = seteq int %A, 40
16 br bool %cond, label %T, label %F
18 %REMOVE = seteq int %A, 2 ; Should become = false
25 %cond = setlt int %A, 40
26 br bool %cond, label %T, label %F
28 %REMOVE = setgt int %A, 47 ; Should become = false
31 %REMOVE2 = setge int %A, 40 ; Should become = true
36 %cond = setlt int %A, 40
37 br bool %cond, label %T, label %F
39 %REMOVE = setgt int %A, 47 ; Should become = false
45 int %test5(int %A, int %B) {
46 %cond = setne int %A, %B
47 br bool %cond, label %F, label %T
49 %C = sub int %A, %B ; = 0
56 %REMOVE = setlt int %A, 47 ; Should become dead
57 %cond = setlt int %A, 40
58 br bool %cond, label %T, label %F
60 ret bool %REMOVE ;; == true
66 %cond = setlt int %A, 40
67 br bool %cond, label %T, label %F
69 %REMOVE = xor bool %cond, true
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
82 %REMOVE1 = seteq int %A, 9 ; false
83 %REMOVE2 = setge int %B, 9 ; false
84 %REMOVE = or bool %REMOVE1, %REMOVE2 ; false
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
99 %REMOVE1 = setge int %A, 8 ; true
100 %REMOVE2 = setge int %B, 8 ; true
101 %REMOVE = or bool %REMOVE1, %REMOVE2 ; true
105 bool %test10(int %A) {
106 %cond = setle int %A, 7
107 br bool %cond, label %T, label %F
111 %REMOVE = setge int %A, 8
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
120 %REMOVE1 = seteq int %A, %B ; false
121 %REMOVE2 = setle int %A, %B ; true
122 %cond2 = and bool %REMOVE1, %REMOVE2
128 bool %test12(int %A) {
129 %cond = setlt int %A, 0
130 br bool %cond, label %T, label %F
132 %REMOVE = setne int %A, 0 ; true