1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2
+ ; RUN: opt -passes='instcombine' -S %s | FileCheck %s
3
+
4
+ define <4 x i8 > @splat_binop_non_splat_x (<4 x i8 > %x , <4 x i8 > %y ) {
5
+ ; CHECK-LABEL: @splat_binop_non_splat_x(
6
+ ; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
7
+ ; CHECK-NEXT: call void @use(<4 x i8> [[XSPLAT]])
8
+ ; CHECK-NEXT: [[B:%.*]] = add <4 x i8> [[XSPLAT]], [[Y:%.*]]
9
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> zeroinitializer
10
+ ; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
11
+ ;
12
+ %xsplat = shufflevector <4 x i8 > %x , <4 x i8 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
13
+ call void @use (<4 x i8 > %xsplat )
14
+ %b = add <4 x i8 > %xsplat , %y
15
+ %bsplat = shufflevector <4 x i8 > %b , <4 x i8 > poison, <4 x i32 > zeroinitializer
16
+ ret <4 x i8 > %bsplat
17
+ }
18
+
19
+ define <4 x i8 > @non_splat_binop_splat_x (<4 x i8 > %x , <4 x i8 > %y ) {
20
+ ; CHECK-LABEL: @non_splat_binop_splat_x(
21
+ ; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
22
+ ; CHECK-NEXT: call void @use(<4 x i8> [[XSPLAT]])
23
+ ; CHECK-NEXT: [[B:%.*]] = sub <4 x i8> [[XSPLAT]], [[Y:%.*]]
24
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
25
+ ; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
26
+ ;
27
+ %xsplat = shufflevector <4 x i8 > %x , <4 x i8 > poison, <4 x i32 > zeroinitializer
28
+ call void @use (<4 x i8 > %xsplat )
29
+ %b = sub <4 x i8 > %xsplat , %y
30
+ %bsplat = shufflevector <4 x i8 > %b , <4 x i8 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
31
+ ret <4 x i8 > %bsplat
32
+ }
33
+
34
+ define <4 x i32 > @splat_binop_splat_changes_x_length (<8 x i32 > %x , <4 x i32 > %y ) {
35
+ ; CHECK-LABEL: @splat_binop_splat_changes_x_length(
36
+ ; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <8 x i32> [[X:%.*]], <8 x i32> poison, <4 x i32> zeroinitializer
37
+ ; CHECK-NEXT: call void @use(<4 x i32> [[XSPLAT]])
38
+ ; CHECK-NEXT: [[B:%.*]] = mul <4 x i32> [[XSPLAT]], [[Y:%.*]]
39
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> poison, <4 x i32> zeroinitializer
40
+ ; CHECK-NEXT: ret <4 x i32> [[BSPLAT]]
41
+ ;
42
+ %xsplat = shufflevector <8 x i32 > %x , <8 x i32 > poison, <4 x i32 > zeroinitializer
43
+ call void @use (<4 x i32 > %xsplat )
44
+ %b = mul <4 x i32 > %xsplat , %y
45
+ %bsplat = shufflevector <4 x i32 > %b , <4 x i32 > poison, <4 x i32 > zeroinitializer
46
+ ret <4 x i32 > %bsplat
47
+ }
48
+
49
+ define <4 x i8 > @splat_binop_splat_x (<4 x i8 > %x , <4 x i8 > %y ) {
50
+ ; CHECK-LABEL: @splat_binop_splat_x(
51
+ ; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
52
+ ; CHECK-NEXT: call void @use(<4 x i8> [[XSPLAT]])
53
+ ; CHECK-NEXT: [[B:%.*]] = add <4 x i8> [[XSPLAT]], [[Y:%.*]]
54
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> zeroinitializer
55
+ ; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
56
+ ;
57
+ %xsplat = shufflevector <4 x i8 > %x , <4 x i8 > poison, <4 x i32 > zeroinitializer
58
+ call void @use (<4 x i8 > %xsplat )
59
+ %b = add <4 x i8 > %xsplat , %y
60
+ %bsplat = shufflevector <4 x i8 > %b , <4 x i8 > poison, <4 x i32 > zeroinitializer
61
+ ret <4 x i8 > %bsplat
62
+ }
63
+
64
+ define <4 x i8 > @splat_binop_splat_y (<4 x i8 > %x , <4 x i8 > %y ) {
65
+ ; CHECK-LABEL: @splat_binop_splat_y(
66
+ ; CHECK-NEXT: [[YSPLAT:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
67
+ ; CHECK-NEXT: call void @use(<4 x i8> [[YSPLAT]])
68
+ ; CHECK-NEXT: [[B:%.*]] = sub <4 x i8> [[X:%.*]], [[YSPLAT]]
69
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> zeroinitializer
70
+ ; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
71
+ ;
72
+ %ysplat = shufflevector <4 x i8 > %y , <4 x i8 > poison, <4 x i32 > zeroinitializer
73
+ call void @use (<4 x i8 > %ysplat )
74
+ %b = sub <4 x i8 > %x , %ysplat
75
+ %bsplat = shufflevector <4 x i8 > %b , <4 x i8 > poison, <4 x i32 > zeroinitializer
76
+ ret <4 x i8 > %bsplat
77
+ }
78
+
79
+ define <4 x i8 > @splat_binop_splat_x_splat_y (<4 x i8 > %x , <4 x i8 > %y ) {
80
+ ; CHECK-LABEL: @splat_binop_splat_x_splat_y(
81
+ ; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
82
+ ; CHECK-NEXT: call void @use(<4 x i8> [[XSPLAT]])
83
+ ; CHECK-NEXT: [[YSPLAT:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
84
+ ; CHECK-NEXT: call void @use(<4 x i8> [[YSPLAT]])
85
+ ; CHECK-NEXT: [[B:%.*]] = mul <4 x i8> [[XSPLAT]], [[YSPLAT]]
86
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> zeroinitializer
87
+ ; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
88
+ ;
89
+ %xsplat = shufflevector <4 x i8 > %x , <4 x i8 > poison, <4 x i32 > zeroinitializer
90
+ call void @use (<4 x i8 > %xsplat )
91
+ %ysplat = shufflevector <4 x i8 > %y , <4 x i8 > poison, <4 x i32 > zeroinitializer
92
+ call void @use (<4 x i8 > %ysplat )
93
+ %b = mul <4 x i8 > %xsplat , %ysplat
94
+ %bsplat = shufflevector <4 x i8 > %b , <4 x i8 > poison, <4 x i32 > zeroinitializer
95
+ ret <4 x i8 > %bsplat
96
+ }
97
+
98
+ define <vscale x 4 x i32 > @vscale_splat_binop_splat_x (<vscale x 4 x i32 > %x , <vscale x 4 x i32 > %y ) {
99
+ ; CHECK-LABEL: @vscale_splat_binop_splat_x(
100
+ ; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[X:%.*]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
101
+ ; CHECK-NEXT: [[B:%.*]] = udiv <vscale x 4 x i32> [[XSPLAT]], [[Y:%.*]]
102
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[B]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
103
+ ; CHECK-NEXT: ret <vscale x 4 x i32> [[BSPLAT]]
104
+ ;
105
+ %xsplat = shufflevector <vscale x 4 x i32 > %x , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
106
+ %b = udiv <vscale x 4 x i32 > %xsplat , %y
107
+ %bsplat = shufflevector <vscale x 4 x i32 > %b , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
108
+ ret <vscale x 4 x i32 > %bsplat
109
+ }
110
+
111
+ define <vscale x 4 x i32 > @vscale_splat_binop_splat_y (<vscale x 4 x i32 > %x , <vscale x 4 x i32 > %y ) {
112
+ ; CHECK-LABEL: @vscale_splat_binop_splat_y(
113
+ ; CHECK-NEXT: [[YSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[Y:%.*]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
114
+ ; CHECK-NEXT: [[B:%.*]] = sdiv <vscale x 4 x i32> [[X:%.*]], [[YSPLAT]]
115
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[B]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
116
+ ; CHECK-NEXT: ret <vscale x 4 x i32> [[BSPLAT]]
117
+ ;
118
+ %ysplat = shufflevector <vscale x 4 x i32 > %y , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
119
+ %b = sdiv <vscale x 4 x i32 > %x , %ysplat
120
+ %bsplat = shufflevector <vscale x 4 x i32 > %b , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
121
+ ret <vscale x 4 x i32 > %bsplat
122
+ }
123
+
124
+ define <vscale x 4 x i32 > @vscale_splat_binop_splat_x_splat_y (<vscale x 4 x i32 > %x , <vscale x 4 x i32 > %y ) {
125
+ ; CHECK-LABEL: @vscale_splat_binop_splat_x_splat_y(
126
+ ; CHECK-NEXT: [[TMP1:%.*]] = ashr <vscale x 4 x i32> [[X:%.*]], [[Y:%.*]]
127
+ ; CHECK-NEXT: [[B:%.*]] = shufflevector <vscale x 4 x i32> [[TMP1]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
128
+ ; CHECK-NEXT: ret <vscale x 4 x i32> [[B]]
129
+ ;
130
+ %xsplat = shufflevector <vscale x 4 x i32 > %x , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
131
+ %ysplat = shufflevector <vscale x 4 x i32 > %y , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
132
+ %b = ashr <vscale x 4 x i32 > %xsplat , %ysplat
133
+ %bsplat = shufflevector <vscale x 4 x i32 > %b , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
134
+ ret <vscale x 4 x i32 > %bsplat
135
+ }
136
+
137
+ define <vscale x 4 x i32 > @vscale_splat_binop_splat_x_splat_y_calls (<vscale x 4 x i32 > %x , <vscale x 4 x i32 > %y ) {
138
+ ; CHECK-LABEL: @vscale_splat_binop_splat_x_splat_y_calls(
139
+ ; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[X:%.*]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
140
+ ; CHECK-NEXT: call void @use_v(<vscale x 4 x i32> [[XSPLAT]])
141
+ ; CHECK-NEXT: [[YSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[Y:%.*]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
142
+ ; CHECK-NEXT: call void @use_v(<vscale x 4 x i32> [[YSPLAT]])
143
+ ; CHECK-NEXT: [[B:%.*]] = lshr <vscale x 4 x i32> [[XSPLAT]], [[YSPLAT]]
144
+ ; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[B]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
145
+ ; CHECK-NEXT: ret <vscale x 4 x i32> [[BSPLAT]]
146
+ ;
147
+ %xsplat = shufflevector <vscale x 4 x i32 > %x , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
148
+ call void @use_v (<vscale x 4 x i32 > %xsplat )
149
+ %ysplat = shufflevector <vscale x 4 x i32 > %y , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
150
+ call void @use_v (<vscale x 4 x i32 > %ysplat )
151
+ %b = lshr <vscale x 4 x i32 > %xsplat , %ysplat
152
+ %bsplat = shufflevector <vscale x 4 x i32 > %b , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
153
+ ret <vscale x 4 x i32 > %bsplat
154
+ }
155
+
156
+ declare void @use (<4 x i8 >)
157
+ declare void @use_v (<vscale x 4 x i32 >)
0 commit comments