12
12
13
13
define i16 @t0 (i32 %x , i16 %y ) {
14
14
; CHECK-LABEL: @t0(
15
- ; CHECK-NEXT: [[T0:%.*]] = sub i16 32, [[Y:%.*]]
16
- ; CHECK-NEXT: [[T1:%.*]] = zext i16 [[T0]] to i32
17
- ; CHECK-NEXT: [[T2:%.*]] = shl i32 [[X:%.*]], [[T1]]
18
- ; CHECK-NEXT: [[T3:%.*]] = trunc i32 [[T2]] to i16
19
- ; CHECK-NEXT: [[T4:%.*]] = add i16 [[Y]], -24
20
- ; CHECK-NEXT: [[T5:%.*]] = shl i16 [[T3]], [[T4]]
15
+ ; CHECK-NEXT: [[X_TR:%.*]] = trunc i32 [[X:%.*]] to i16
16
+ ; CHECK-NEXT: [[T5:%.*]] = shl i16 [[X_TR]], 8
21
17
; CHECK-NEXT: ret i16 [[T5]]
22
18
;
23
19
%t0 = sub i16 32 , %y
@@ -31,12 +27,8 @@ define i16 @t0(i32 %x, i16 %y) {
31
27
32
28
define <2 x i16 > @t1_vec_splat (<2 x i32 > %x , <2 x i16 > %y ) {
33
29
; CHECK-LABEL: @t1_vec_splat(
34
- ; CHECK-NEXT: [[T0:%.*]] = sub <2 x i16> <i16 32, i16 32>, [[Y:%.*]]
35
- ; CHECK-NEXT: [[T1:%.*]] = zext <2 x i16> [[T0]] to <2 x i32>
36
- ; CHECK-NEXT: [[T2:%.*]] = shl <2 x i32> [[X:%.*]], [[T1]]
37
- ; CHECK-NEXT: [[T3:%.*]] = trunc <2 x i32> [[T2]] to <2 x i16>
38
- ; CHECK-NEXT: [[T4:%.*]] = add <2 x i16> [[Y]], <i16 -24, i16 -24>
39
- ; CHECK-NEXT: [[T5:%.*]] = shl <2 x i16> [[T3]], [[T4]]
30
+ ; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i32> [[X:%.*]], <i32 8, i32 8>
31
+ ; CHECK-NEXT: [[T5:%.*]] = trunc <2 x i32> [[TMP1]] to <2 x i16>
40
32
; CHECK-NEXT: ret <2 x i16> [[T5]]
41
33
;
42
34
%t0 = sub <2 x i16 > <i16 32 , i16 32 >, %y
@@ -50,12 +42,8 @@ define <2 x i16> @t1_vec_splat(<2 x i32> %x, <2 x i16> %y) {
50
42
51
43
define <2 x i16 > @t2_vec_nonsplat (<2 x i32 > %x , <2 x i16 > %y ) {
52
44
; CHECK-LABEL: @t2_vec_nonsplat(
53
- ; CHECK-NEXT: [[T0:%.*]] = sub <2 x i16> <i16 32, i16 30>, [[Y:%.*]]
54
- ; CHECK-NEXT: [[T1:%.*]] = zext <2 x i16> [[T0]] to <2 x i32>
55
- ; CHECK-NEXT: [[T2:%.*]] = shl <2 x i32> [[X:%.*]], [[T1]]
56
- ; CHECK-NEXT: [[T3:%.*]] = trunc <2 x i32> [[T2]] to <2 x i16>
57
- ; CHECK-NEXT: [[T4:%.*]] = add <2 x i16> [[Y]], <i16 -24, i16 0>
58
- ; CHECK-NEXT: [[T5:%.*]] = shl <2 x i16> [[T3]], [[T4]]
45
+ ; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i32> [[X:%.*]], <i32 8, i32 30>
46
+ ; CHECK-NEXT: [[T5:%.*]] = trunc <2 x i32> [[TMP1]] to <2 x i16>
59
47
; CHECK-NEXT: ret <2 x i16> [[T5]]
60
48
;
61
49
%t0 = sub <2 x i16 > <i16 32 , i16 30 >, %y
@@ -71,12 +59,8 @@ define <2 x i16> @t2_vec_nonsplat(<2 x i32> %x, <2 x i16> %y) {
71
59
72
60
define <3 x i16 > @t3_vec_nonsplat_undef0 (<3 x i32 > %x , <3 x i16 > %y ) {
73
61
; CHECK-LABEL: @t3_vec_nonsplat_undef0(
74
- ; CHECK-NEXT: [[T0:%.*]] = sub <3 x i16> <i16 32, i16 undef, i16 32>, [[Y:%.*]]
75
- ; CHECK-NEXT: [[T1:%.*]] = zext <3 x i16> [[T0]] to <3 x i32>
76
- ; CHECK-NEXT: [[T2:%.*]] = shl <3 x i32> [[X:%.*]], [[T1]]
77
- ; CHECK-NEXT: [[T3:%.*]] = trunc <3 x i32> [[T2]] to <3 x i16>
78
- ; CHECK-NEXT: [[T4:%.*]] = add <3 x i16> [[Y]], <i16 -24, i16 -24, i16 -24>
79
- ; CHECK-NEXT: [[T5:%.*]] = shl <3 x i16> [[T3]], [[T4]]
62
+ ; CHECK-NEXT: [[TMP1:%.*]] = shl <3 x i32> [[X:%.*]], <i32 8, i32 0, i32 8>
63
+ ; CHECK-NEXT: [[T5:%.*]] = trunc <3 x i32> [[TMP1]] to <3 x i16>
80
64
; CHECK-NEXT: ret <3 x i16> [[T5]]
81
65
;
82
66
%t0 = sub <3 x i16 > <i16 32 , i16 undef , i16 32 >, %y
@@ -90,12 +74,8 @@ define <3 x i16> @t3_vec_nonsplat_undef0(<3 x i32> %x, <3 x i16> %y) {
90
74
91
75
define <3 x i16 > @t4_vec_nonsplat_undef1 (<3 x i32 > %x , <3 x i16 > %y ) {
92
76
; CHECK-LABEL: @t4_vec_nonsplat_undef1(
93
- ; CHECK-NEXT: [[T0:%.*]] = sub <3 x i16> <i16 32, i16 32, i16 32>, [[Y:%.*]]
94
- ; CHECK-NEXT: [[T1:%.*]] = zext <3 x i16> [[T0]] to <3 x i32>
95
- ; CHECK-NEXT: [[T2:%.*]] = shl <3 x i32> [[X:%.*]], [[T1]]
96
- ; CHECK-NEXT: [[T3:%.*]] = trunc <3 x i32> [[T2]] to <3 x i16>
97
- ; CHECK-NEXT: [[T4:%.*]] = add <3 x i16> [[Y]], <i16 -24, i16 undef, i16 -24>
98
- ; CHECK-NEXT: [[T5:%.*]] = shl <3 x i16> [[T3]], [[T4]]
77
+ ; CHECK-NEXT: [[TMP1:%.*]] = shl <3 x i32> [[X:%.*]], <i32 8, i32 0, i32 8>
78
+ ; CHECK-NEXT: [[T5:%.*]] = trunc <3 x i32> [[TMP1]] to <3 x i16>
99
79
; CHECK-NEXT: ret <3 x i16> [[T5]]
100
80
;
101
81
%t0 = sub <3 x i16 > <i16 32 , i16 32 , i16 32 >, %y
@@ -109,12 +89,8 @@ define <3 x i16> @t4_vec_nonsplat_undef1(<3 x i32> %x, <3 x i16> %y) {
109
89
110
90
define <3 x i16 > @t5_vec_nonsplat_undef1 (<3 x i32 > %x , <3 x i16 > %y ) {
111
91
; CHECK-LABEL: @t5_vec_nonsplat_undef1(
112
- ; CHECK-NEXT: [[T0:%.*]] = sub <3 x i16> <i16 32, i16 undef, i16 32>, [[Y:%.*]]
113
- ; CHECK-NEXT: [[T1:%.*]] = zext <3 x i16> [[T0]] to <3 x i32>
114
- ; CHECK-NEXT: [[T2:%.*]] = shl <3 x i32> [[X:%.*]], [[T1]]
115
- ; CHECK-NEXT: [[T3:%.*]] = trunc <3 x i32> [[T2]] to <3 x i16>
116
- ; CHECK-NEXT: [[T4:%.*]] = add <3 x i16> [[Y]], <i16 -24, i16 undef, i16 -24>
117
- ; CHECK-NEXT: [[T5:%.*]] = shl <3 x i16> [[T3]], [[T4]]
92
+ ; CHECK-NEXT: [[TMP1:%.*]] = shl <3 x i32> [[X:%.*]], <i32 8, i32 0, i32 8>
93
+ ; CHECK-NEXT: [[T5:%.*]] = trunc <3 x i32> [[TMP1]] to <3 x i16>
118
94
; CHECK-NEXT: ret <3 x i16> [[T5]]
119
95
;
120
96
%t0 = sub <3 x i16 > <i16 32 , i16 undef , i16 32 >, %y
@@ -137,9 +113,9 @@ define i16 @t6_extrause0(i32 %x, i16 %y) {
137
113
; CHECK-NEXT: [[T1:%.*]] = zext i16 [[T0]] to i32
138
114
; CHECK-NEXT: [[T2:%.*]] = shl i32 [[X:%.*]], [[T1]]
139
115
; CHECK-NEXT: [[T3:%.*]] = trunc i32 [[T2]] to i16
140
- ; CHECK-NEXT: [[T4:%.*]] = add i16 [[Y]], -24
141
116
; CHECK-NEXT: call void @use16(i16 [[T3]])
142
- ; CHECK-NEXT: [[T5:%.*]] = shl i16 [[T3]], [[T4]]
117
+ ; CHECK-NEXT: [[X_TR:%.*]] = trunc i32 [[X]] to i16
118
+ ; CHECK-NEXT: [[T5:%.*]] = shl i16 [[X_TR]], 8
143
119
; CHECK-NEXT: ret i16 [[T5]]
144
120
;
145
121
%t0 = sub i16 32 , %y
@@ -154,13 +130,10 @@ define i16 @t6_extrause0(i32 %x, i16 %y) {
154
130
155
131
define i16 @t7_extrause1 (i32 %x , i16 %y ) {
156
132
; CHECK-LABEL: @t7_extrause1(
157
- ; CHECK-NEXT: [[T0:%.*]] = sub i16 32, [[Y:%.*]]
158
- ; CHECK-NEXT: [[T1:%.*]] = zext i16 [[T0]] to i32
159
- ; CHECK-NEXT: [[T2:%.*]] = shl i32 [[X:%.*]], [[T1]]
160
- ; CHECK-NEXT: [[T3:%.*]] = trunc i32 [[T2]] to i16
161
- ; CHECK-NEXT: [[T4:%.*]] = add i16 [[Y]], -24
133
+ ; CHECK-NEXT: [[T4:%.*]] = add i16 [[Y:%.*]], -24
162
134
; CHECK-NEXT: call void @use16(i16 [[T4]])
163
- ; CHECK-NEXT: [[T5:%.*]] = shl i16 [[T3]], [[T4]]
135
+ ; CHECK-NEXT: [[X_TR:%.*]] = trunc i32 [[X:%.*]] to i16
136
+ ; CHECK-NEXT: [[T5:%.*]] = shl i16 [[X_TR]], 8
164
137
; CHECK-NEXT: ret i16 [[T5]]
165
138
;
166
139
%t0 = sub i16 32 , %y
@@ -252,3 +225,20 @@ define i16 @n11(i32 %x, i16 %y) {
252
225
%t5 = shl i16 %t3 , %t4
253
226
ret i16 %t3
254
227
}
228
+
229
+ ; Bit width mismatch of shit amount
230
+
231
+ @Y32 = global i32 42
232
+ @Y16 = global i16 42
233
+ define i16 @t01 (i32 %x ) {
234
+ ; CHECK-LABEL: @t01(
235
+ ; CHECK-NEXT: [[T0:%.*]] = shl i32 [[X:%.*]], ptrtoint (i32* @Y32 to i32)
236
+ ; CHECK-NEXT: [[T1:%.*]] = trunc i32 [[T0]] to i16
237
+ ; CHECK-NEXT: [[T2:%.*]] = shl i16 [[T1]], ptrtoint (i16* @Y16 to i16)
238
+ ; CHECK-NEXT: ret i16 [[T2]]
239
+ ;
240
+ %t0 = shl i32 %x , ptrtoint (i32* @Y32 to i32 )
241
+ %t1 = trunc i32 %t0 to i16
242
+ %t2 = shl i16 %t1 , ptrtoint (i16* @Y16 to i16 )
243
+ ret i16 %t2
244
+ }
0 commit comments