summaryrefslogtreecommitdiff
path: root/test/Transforms/InstCombine/apint-shift.ll
blob: f5764c2d5e8a6473278f5f10f1ff9bf152bcbb14 (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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
; This test makes sure that shift instructions are properly eliminated
; even with arbitrary precision integers.
; RUN: opt < %s -instcombine -S | FileCheck %s

; CHECK-LABEL: @test1(
; CHECK-NOT: sh
define i47 @test1(i47 %A) {
	%B = shl i47 %A, 0		; <i47> [#uses=1]
	ret i47 %B
}

; CHECK-LABEL: @test2(
; CHECK-NOT: sh
define i41 @test2(i7 %X) {
	%A = zext i7 %X to i41		; <i41> [#uses=1]
	%B = shl i41 0, %A		; <i41> [#uses=1]
	ret i41 %B
}

; CHECK-LABEL: @test3(
; CHECK-NOT: sh
define i41 @test3(i41 %A) {
	%B = ashr i41 %A, 0		; <i41> [#uses=1]
	ret i41 %B
}

; CHECK-LABEL: @test4(
; CHECK-NOT: sh
define i39 @test4(i7 %X) {
	%A = zext i7 %X to i39		; <i39> [#uses=1]
	%B = ashr i39 0, %A		; <i39> [#uses=1]
	ret i39 %B
}

; CHECK-LABEL: @test5(
; CHECK-NOT: sh
define i55 @test5(i55 %A) {
	%B = lshr i55 %A, 55		; <i55> [#uses=1]
	ret i55 %B
}

; CHECK-LABEL: @test5a(
; CHECK-NOT: sh
define i32 @test5a(i32 %A) {
	%B = shl i32 %A, 32		; <i32> [#uses=1]
	ret i32 %B
}

; CHECK-LABEL: @test6(
; CHECK: mul i55 %A, 6
define i55 @test6(i55 %A) {
	%B = shl i55 %A, 1		; <i55> [#uses=1]
	%C = mul i55 %B, 3		; <i55> [#uses=1]
	ret i55 %C
}

; CHECK-LABEL: @test6a(
; CHECK: mul i55 %A, 6
define i55 @test6a(i55 %A) {
	%B = mul i55 %A, 3		; <i55> [#uses=1]
	%C = shl i55 %B, 1		; <i55> [#uses=1]
	ret i55 %C
}

; CHECK-LABEL: @test7(
; CHECK-NOT: sh
define i29 @test7(i8 %X) {
	%A = zext i8 %X to i29		; <i29> [#uses=1]
	%B = ashr i29 -1, %A		; <i29> [#uses=1]
	ret i29 %B
}

; CHECK-LABEL: @test8(
; CHECK-NOT: sh
define i7 @test8(i7 %A) {
	%B = shl i7 %A, 4		; <i7> [#uses=1]
	%C = shl i7 %B, 3		; <i7> [#uses=1]
	ret i7 %C
}

; CHECK-LABEL: @test9(
; CHECK-NOT: sh
define i17 @test9(i17 %A) {
	%B = shl i17 %A, 16		; <i17> [#uses=1]
	%C = lshr i17 %B, 16		; <i17> [#uses=1]
	ret i17 %C
}

; CHECK-LABEL: @test10(
; CHECK-NOT: sh
define i19 @test10(i19 %A) {
	%B = lshr i19 %A, 18		; <i19> [#uses=1]
	%C = shl i19 %B, 18		; <i19> [#uses=1]
	ret i19 %C
}

; CHECK-LABEL: @test11(
; Don't hide the shl from scalar evolution. DAGCombine will get it.
; CHECK: shl
define i23 @test11(i23 %A) {
	%a = mul i23 %A, 3		; <i23> [#uses=1]
	%B = lshr i23 %a, 11		; <i23> [#uses=1]
	%C = shl i23 %B, 12		; <i23> [#uses=1]
	ret i23 %C
}

; CHECK-LABEL: @test12(
; CHECK-NOT: sh
define i47 @test12(i47 %A) {
	%B = ashr i47 %A, 8		; <i47> [#uses=1]
	%C = shl i47 %B, 8		; <i47> [#uses=1]
	ret i47 %C
}

; CHECK-LABEL: @test13(
; Don't hide the shl from scalar evolution. DAGCombine will get it.
; CHECK: shl
define i18 @test13(i18 %A) {
	%a = mul i18 %A, 3		; <i18> [#uses=1]
	%B = ashr i18 %a, 8		; <i18> [#uses=1]
	%C = shl i18 %B, 9		; <i18> [#uses=1]
	ret i18 %C
}

; CHECK-LABEL: @test14(
; CHECK-NOT: sh
define i35 @test14(i35 %A) {
	%B = lshr i35 %A, 4		; <i35> [#uses=1]
	%C = or i35 %B, 1234		; <i35> [#uses=1]
	%D = shl i35 %C, 4		; <i35> [#uses=1]
	ret i35 %D
}

; CHECK-LABEL: @test14a(
; CHECK-NOT: sh
define i79 @test14a(i79 %A) {
	%B = shl i79 %A, 4		; <i79> [#uses=1]
	%C = and i79 %B, 1234		; <i79> [#uses=1]
	%D = lshr i79 %C, 4		; <i79> [#uses=1]
	ret i79 %D
}

; CHECK-LABEL: @test15(
; CHECK-NOT: sh
define i45 @test15(i1 %C) {
	%A = select i1 %C, i45 3, i45 1	; <i45> [#uses=1]
	%V = shl i45 %A, 2		; <i45> [#uses=1]
	ret i45 %V
}

; CHECK-LABEL: @test15a(
; CHECK-NOT: sh
define i53 @test15a(i1 %X) {
	%A = select i1 %X, i8 3, i8 1	; <i8> [#uses=1]
	%B = zext i8 %A to i53		; <i53> [#uses=1]
	%V = shl i53 64, %B		; <i53> [#uses=1]
	ret i53 %V
}

; CHECK-LABEL: @test16(
; CHECK-NOT: sh
define i1 @test16(i84 %X) {
	%tmp.3 = ashr i84 %X, 4		; <i84> [#uses=1]
	%tmp.6 = and i84 %tmp.3, 1	; <i84> [#uses=1]
	%tmp.7 = icmp ne i84 %tmp.6, 0	; <i1> [#uses=1]
	ret i1 %tmp.7
}

; CHECK-LABEL: @test17(
; CHECK-NOT: sh
define i1 @test17(i106 %A) {
	%B = lshr i106 %A, 3		; <i106> [#uses=1]
	%C = icmp eq i106 %B, 1234	; <i1> [#uses=1]
	ret i1 %C
}

; CHECK-LABEL: @test18(
; CHECK-NOT: sh
define i1 @test18(i11 %A) {
	%B = lshr i11 %A, 10		; <i11> [#uses=1]
	%C = icmp eq i11 %B, 123	; <i1> [#uses=1]
	ret i1 %C
}

; CHECK-LABEL: @test19(
; CHECK-NOT: sh
define i1 @test19(i37 %A) {
	%B = ashr i37 %A, 2		; <i37> [#uses=1]
	%C = icmp eq i37 %B, 0		; <i1> [#uses=1]
	ret i1 %C
}

; CHECK-LABEL: @test19a(
; CHECK-NOT: sh
define i1 @test19a(i39 %A) {
	%B = ashr i39 %A, 2		; <i39> [#uses=1]
	%C = icmp eq i39 %B, -1		; <i1> [#uses=1]
	ret i1 %C
}

; CHECK-LABEL: @test20(
; CHECK-NOT: sh
define i1 @test20(i13 %A) {
	%B = ashr i13 %A, 12		; <i13> [#uses=1]
	%C = icmp eq i13 %B, 123	; <i1> [#uses=1]
	ret i1 %C
}

; CHECK-LABEL: @test21(
; CHECK-NOT: sh
define i1 @test21(i12 %A) {
	%B = shl i12 %A, 6		; <i12> [#uses=1]
	%C = icmp eq i12 %B, -128		; <i1> [#uses=1]
	ret i1 %C
}

; CHECK-LABEL: @test22(
; CHECK-NOT: sh
define i1 @test22(i14 %A) {
	%B = shl i14 %A, 7		; <i14> [#uses=1]
	%C = icmp eq i14 %B, 0		; <i1> [#uses=1]
	ret i1 %C
}

; CHECK-LABEL: @test23(
; CHECK-NOT: sh
define i11 @test23(i44 %A) {
	%B = shl i44 %A, 33		; <i44> [#uses=1]
	%C = ashr i44 %B, 33		; <i44> [#uses=1]
	%D = trunc i44 %C to i11	; <i8> [#uses=1]
	ret i11 %D
}

; CHECK-LABEL: @test25(
; CHECK-NOT: sh
define i37 @test25(i37 %tmp.2, i37 %AA) {
	%x = lshr i37 %AA, 17		; <i37> [#uses=1]
	%tmp.3 = lshr i37 %tmp.2, 17		; <i37> [#uses=1]
	%tmp.5 = add i37 %tmp.3, %x		; <i37> [#uses=1]
	%tmp.6 = shl i37 %tmp.5, 17		; <i37> [#uses=1]
	ret i37 %tmp.6
}

; CHECK-LABEL: @test26(
; CHECK-NOT: sh
define i40 @test26(i40 %A) {
	%B = lshr i40 %A, 1		; <i40> [#uses=1]
	%C = bitcast i40 %B to i40		; <i40> [#uses=1]
	%D = shl i40 %C, 1		; <i40> [#uses=1]
	ret i40 %D
}