summaryrefslogtreecommitdiff
path: root/test/Transforms/InstCombine/shift.ll
blob: 9756880bcc3b5b8e5c9273010189db79ab3e7c66 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
; This test makes sure that these instructions are properly eliminated.
;

; RUN: llvm-as < %s | opt -instcombine -disable-output &&
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep sh

implementation

int %test1(int %A) {
	%B = shl int %A, ubyte 0
	ret int %B
}

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

int %test3(int %A) {
	%B = shr int %A, ubyte 0
	ret int %B
}

int %test4(ubyte %A) {
	%B = shr int 0, ubyte %A
	ret int %B
}

uint %test5(uint %A) {
	%B = shr uint %A, ubyte 32  ;; shift all bits out
	ret uint %B
}

uint %test5a(uint %A) {
	%B = shl uint %A, ubyte 32  ;; shift all bits out
	ret uint %B
}

uint %test6(uint %A) {
	%B = shl uint %A, ubyte 1   ;; convert to an mul instruction
	%C = mul uint %B, 3
	ret uint %C
}

int %test7(ubyte %A) {
	%B = shr int -1, ubyte %A   ;; Always equal to -1
	ret int %B
}

ubyte %test8(ubyte %A) {              ;; (A << 5) << 3 === A << 8 == 0
	%B = shl ubyte %A, ubyte 5
	%C = shl ubyte %B, ubyte 3
	ret ubyte %C
}

ubyte %test9(ubyte %A) {              ;; (A << 7) >> 7 === A & 1
	%B = shl ubyte %A, ubyte 7
	%C = shr ubyte %B, ubyte 7
	ret ubyte %C
}

ubyte %test10(ubyte %A) {              ;; (A >> 7) << 7 === A & 128
	%B = shr ubyte %A, ubyte 7
	%C = shl ubyte %B, ubyte 7
	ret ubyte %C
}

ubyte %test11(ubyte %A) {              ;; (A >> 3) << 4 === (A & 0x1F) << 1
	%a = mul ubyte %A, 3
	%B = shr ubyte %a, ubyte 3
	%C = shl ubyte %B, ubyte 4
	ret ubyte %C
}

int %test12(int %A) {
        %B = shr int %A, ubyte 8    ;; (A >> 8) << 8 === A & -256
        %C = shl int %B, ubyte 8
        ret int %C
}

sbyte %test13(sbyte %A) {           ;; (A >> 3) << 4 === (A & -8) * 2
	%a = mul sbyte %A, 3
	%B = shr sbyte %a, ubyte 3
	%C = shl sbyte %B, ubyte 4
	ret sbyte %C
}

uint %test14(uint %A) {
	%B = shr uint %A, ubyte 4
	%C = or uint %B, 1234
	%D = shl uint %C, ubyte 4   ;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4)
	ret uint %D
}
uint %test14a(uint %A) {
	%B = shl uint %A, ubyte 4
	%C = and uint %B, 1234
	%D = shr uint %C, ubyte 4   ;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4)
	ret uint %D
}

int %test15(bool %C) {
        %A = select bool %C, int 3, int 1
        %V = shl int %A, ubyte 2
        ret int %V
}

int %test15a(bool %C) {
        %A = select bool %C, ubyte 3, ubyte 1
        %V = shl int 64, ubyte %A
        ret int %V
}

bool %test16(int %X) {
        %tmp.3 = shr int %X, ubyte 4
        %tmp.6 = and int %tmp.3, 1
        %tmp.7 = setne int %tmp.6, 0  ;; X & 16 != 0
        ret bool %tmp.7
}

bool %test17(uint %A) {
	%B = shr uint %A, ubyte 3
	%C = seteq uint %B, 1234
	ret bool %C
}

bool %test18(ubyte %A) {
	%B = shr ubyte %A, ubyte 7
	%C = seteq ubyte %B, 123    ;; false
	ret bool %C
}

bool %test19(int %A) {
	%B = shr int %A, ubyte 2
	%C = seteq int %B, 0        ;; (X & -4) == 0
	ret bool %C
}

bool %test19a(int %A) {
	%B = shr int %A, ubyte 2
	%C = seteq int %B, -1        ;; (X & -4) == -4
	ret bool %C
}

bool %test20(sbyte %A) {
	%B = shr sbyte %A, ubyte 7
	%C = seteq sbyte %B, 123    ;; false
	ret bool %C
}

bool %test21(ubyte %A) {
	%B = shl ubyte %A, ubyte 4
	%C = seteq ubyte %B, 128
	ret bool %C
}

bool %test22(ubyte %A) {
	%B = shl ubyte %A, ubyte 4
	%C = seteq ubyte %B, 0
	ret bool %C
}

sbyte %test23(int %A) {
	%B = shl int %A, ubyte 24  ;; casts not needed
	%C = shr int %B, ubyte 24
	%D = cast int %C to sbyte
	ret sbyte %D
}

sbyte %test24(sbyte %X) {
        %Y = and sbyte %X, -5 ; ~4
        %Z = shl sbyte %Y, ubyte 5
        %Q = shr sbyte %Z, ubyte 5
        ret sbyte %Q
}

uint %test25(uint %tmp.2, uint %AA) {
	%x = shr uint %AA, ubyte 17
        %tmp.3 = shr uint %tmp.2, ubyte 17              ; <uint> [#uses=1]
        %tmp.5 = add uint %tmp.3, %x            ; <uint> [#uses=1]
        %tmp.6 = shl uint %tmp.5, ubyte 17              ; <uint> [#uses=1]
	ret uint %tmp.6
}

int %test26(uint %A) { ;; handle casts between shifts.
	%B = shr uint %A, ubyte 1
	%C = cast uint %B to int
        %D = shl int %C, ubyte 1
	ret int %D
}