summaryrefslogtreecommitdiff
path: root/test/Transforms/InstCombine/sub.ll
blob: 8ca2e783ca2960ddc9fc55ab325b835c17e515ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
; This test makes sure that these instructions are properly eliminated.
;

; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep -v 'sub int %Cok, %Bok' | not grep sub

implementation

int %test1(int %A) {
	%B = sub int %A, %A    ; ISA constant 0
	ret int %B
}

int %test2(int %A) {
	%B = sub int %A, 0
	ret int %B
}

int %test3(int %A) {
	%B = sub int 0, %A       ; B = -A
	%C = sub int 0, %B       ; C = -B = A
	ret int %C
}

int %test4(int %A, int %x) {
	%B = sub int 0, %A
	%C = sub int %x, %B
	ret int %C
}

int %test5(int %A, int %Bok, int %Cok) {
	%D = sub int %Bok, %Cok
	%E = sub int %A, %D
	ret int %E
}

int %test6(int %A, int %B) {
	%C = and int %A, %B   ; A - (A & B) => A & ~B
	%D = sub int %A, %C
	ret int %D
}

int %test7(int %A) {
	%B = sub int -1, %A   ; B = ~A
	ret int %B
}

int %test8(int %A) {
        %B = mul int 9, %A
        %C = sub int %B, %A      ; C = 9*A-A == A*8 == A << 3
        ret int %C
}

int %test9(int %A) {
        %B = mul int 3, %A
        %C = sub int %A, %B      ; C = A-3*A == A*-2
        ret int %C
}

int %test10(int %A, int %B) {    ; -A*-B == A*B
	%C = sub int 0, %A
	%D = sub int 0, %B
	%E = mul int %C, %D
	ret int %E
}

int %test10(int %A) {    ; -A *c1 == A * -c1
	%C = sub int 0, %A
	%E = mul int %C, 7
	ret int %E
}

bool %test11(ubyte %A, ubyte %B) {
        %C = sub ubyte %A, %B
        %cD = setne ubyte %C, 0    ; == setne A, B
        ret bool %cD
}

int %test12(int %A) {
	%B = shr int %A, ubyte 31
	%C = sub int 0, %B         ; == ushr A, 31
	ret int %C 
}

uint %test13(uint %A) {
	%B = shr uint %A, ubyte 31
	%C = sub uint 0, %B        ; == sar A, 31
	ret uint %C
}

int %test14(uint %A) {
        %B = shr uint %A, ubyte 31
        %C = cast uint %B to int
        %D = sub int 0, %C
        ret int %D
}

int %test15(int %A, int %B) {
	%C = sub int 0, %A
	%D = rem int %B, %C   ;; X % -Y === X % Y
	ret int %D
}

int %test16(int %A) {
	%X = div int %A, 1123
	%Y = sub int 0, %X
	ret int %Y
}

int %test17(int %A) {
	%B = sub int 0, %A
	%C = div int %B, 1234
	ret int %C
}

long %test18(long %Y) {
        %tmp.4 = shl long %Y, ubyte 2
        %tmp.12 = shl long %Y, ubyte 2
        %tmp.8 = sub long %tmp.4, %tmp.12 ;; 0
        ret long %tmp.8
}

int %test19(int %X, int %Y) {
	%Z = sub int %X, %Y
	%Q = add int %Z, %Y
	ret int %Q
}

bool %test20(int %g, int %h) {
        %tmp.2 = sub int %g, %h
        %tmp.4 = setne int %tmp.2, %g
        ret bool %tmp.4
}

bool %test21(int %g, int %h) {
        %tmp.2 = sub int %g, %h
        %tmp.4 = setne int %tmp.2, %g
        ret bool %tmp.4
}