For PR761:
[oota-llvm.git] / test / Transforms / InstCombine / sub.ll
1 ; This test makes sure that these instructions are properly eliminated.
2 ;
3
4 ; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \
5 ; RUN:   grep -v 'sub i32 %Cok, %Bok' | not grep sub
6
7 implementation
8
9 int %test1(int %A) {
10         %B = sub int %A, %A    ; ISA constant 0
11         ret int %B
12 }
13
14 int %test2(int %A) {
15         %B = sub int %A, 0
16         ret int %B
17 }
18
19 int %test3(int %A) {
20         %B = sub int 0, %A       ; B = -A
21         %C = sub int 0, %B       ; C = -B = A
22         ret int %C
23 }
24
25 int %test4(int %A, int %x) {
26         %B = sub int 0, %A
27         %C = sub int %x, %B
28         ret int %C
29 }
30
31 int %test5(int %A, int %Bok, int %Cok) {
32         %D = sub int %Bok, %Cok
33         %E = sub int %A, %D
34         ret int %E
35 }
36
37 int %test6(int %A, int %B) {
38         %C = and int %A, %B   ; A - (A & B) => A & ~B
39         %D = sub int %A, %C
40         ret int %D
41 }
42
43 int %test7(int %A) {
44         %B = sub int -1, %A   ; B = ~A
45         ret int %B
46 }
47
48 int %test8(int %A) {
49         %B = mul int 9, %A
50         %C = sub int %B, %A      ; C = 9*A-A == A*8 == A << 3
51         ret int %C
52 }
53
54 int %test9(int %A) {
55         %B = mul int 3, %A
56         %C = sub int %A, %B      ; C = A-3*A == A*-2
57         ret int %C
58 }
59
60 int %test10(int %A, int %B) {    ; -A*-B == A*B
61         %C = sub int 0, %A
62         %D = sub int 0, %B
63         %E = mul int %C, %D
64         ret int %E
65 }
66
67 int %test10(int %A) {    ; -A *c1 == A * -c1
68         %C = sub int 0, %A
69         %E = mul int %C, 7
70         ret int %E
71 }
72
73 bool %test11(ubyte %A, ubyte %B) {
74         %C = sub ubyte %A, %B
75         %cD = setne ubyte %C, 0    ; == setne A, B
76         ret bool %cD
77 }
78
79 int %test12(int %A) {
80         %B = shr int %A, ubyte 31
81         %C = sub int 0, %B         ; == ushr A, 31
82         ret int %C 
83 }
84
85 uint %test13(uint %A) {
86         %B = shr uint %A, ubyte 31
87         %C = sub uint 0, %B        ; == sar A, 31
88         ret uint %C
89 }
90
91 int %test14(uint %A) {
92         %B = shr uint %A, ubyte 31
93         %C = cast uint %B to int
94         %D = sub int 0, %C
95         ret int %D
96 }
97
98 int %test15(int %A, int %B) {
99         %C = sub int 0, %A
100         %D = rem int %B, %C   ;; X % -Y === X % Y
101         ret int %D
102 }
103
104 int %test16(int %A) {
105         %X = div int %A, 1123
106         %Y = sub int 0, %X
107         ret int %Y
108 }
109
110 int %test17(int %A) {
111         %B = sub int 0, %A
112         %C = div int %B, 1234
113         ret int %C
114 }
115
116 long %test18(long %Y) {
117         %tmp.4 = shl long %Y, ubyte 2
118         %tmp.12 = shl long %Y, ubyte 2
119         %tmp.8 = sub long %tmp.4, %tmp.12 ;; 0
120         ret long %tmp.8
121 }
122
123 int %test19(int %X, int %Y) {
124         %Z = sub int %X, %Y
125         %Q = add int %Z, %Y
126         ret int %Q
127 }
128
129 bool %test20(int %g, int %h) {
130         %tmp.2 = sub int %g, %h
131         %tmp.4 = setne int %tmp.2, %g
132         ret bool %tmp.4
133 }
134
135 bool %test21(int %g, int %h) {
136         %tmp.2 = sub int %g, %h
137         %tmp.4 = setne int %tmp.2, %g
138         ret bool %tmp.4
139 }
140