Skip to content

Commit f2ec705

Browse files
committed
Precommit tests
1 parent a129ca7 commit f2ec705

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes=vector-combine < %s | FileCheck %s
3+
4+
define <4 x i32> @add_v4i32(i32 %x, i32 %y) {
5+
; CHECK-LABEL: define <4 x i32> @add_v4i32(
6+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
7+
; CHECK-NEXT: [[X_HEAD:%.*]] = insertelement <4 x i32> poison, i32 [[X]], i32 0
8+
; CHECK-NEXT: [[X_SPLAT:%.*]] = shufflevector <4 x i32> [[X_HEAD]], <4 x i32> poison, <4 x i32> zeroinitializer
9+
; CHECK-NEXT: [[RES:%.*]] = add <4 x i32> [[X_SPLAT]], splat (i32 42)
10+
; CHECK-NEXT: ret <4 x i32> [[RES]]
11+
;
12+
%x.head = insertelement <4 x i32> poison, i32 %x, i32 0
13+
%x.splat = shufflevector <4 x i32> %x.head, <4 x i32> poison, <4 x i32> zeroinitializer
14+
%res = add <4 x i32> %x.splat, splat (i32 42)
15+
ret <4 x i32> %res
16+
}
17+
18+
define <vscale x 4 x i32> @add_nxv4i32(i32 %x, i32 %y) {
19+
; CHECK-LABEL: define <vscale x 4 x i32> @add_nxv4i32(
20+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
21+
; CHECK-NEXT: [[Y_HEAD1:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[X]], i32 0
22+
; CHECK-NEXT: [[Y_SPLAT1:%.*]] = shufflevector <vscale x 4 x i32> [[Y_HEAD1]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
23+
; CHECK-NEXT: [[RES:%.*]] = add <vscale x 4 x i32> [[Y_SPLAT1]], splat (i32 42)
24+
; CHECK-NEXT: ret <vscale x 4 x i32> [[RES]]
25+
;
26+
%x.head = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0
27+
%x.splat = shufflevector <vscale x 4 x i32> %x.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
28+
%res = add <vscale x 4 x i32> %x.splat, splat (i32 42)
29+
ret <vscale x 4 x i32> %res
30+
}
31+
32+
; Make sure that we can scalarize sequences of vector instructions.
33+
define <4 x i32> @add_mul_v4i32(i32 %x, i32 %y, i32 %z) {
34+
; CHECK-LABEL: define <4 x i32> @add_mul_v4i32(
35+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
36+
; CHECK-NEXT: [[Z_HEAD1:%.*]] = insertelement <4 x i32> poison, i32 [[X]], i32 0
37+
; CHECK-NEXT: [[Z_SPLAT1:%.*]] = shufflevector <4 x i32> [[Z_HEAD1]], <4 x i32> poison, <4 x i32> zeroinitializer
38+
; CHECK-NEXT: [[RES0:%.*]] = add <4 x i32> [[Z_SPLAT1]], splat (i32 42)
39+
; CHECK-NEXT: [[RES1:%.*]] = mul <4 x i32> [[RES0]], splat (i32 42)
40+
; CHECK-NEXT: ret <4 x i32> [[RES1]]
41+
;
42+
%x.head = insertelement <4 x i32> poison, i32 %x, i32 0
43+
%x.splat = shufflevector <4 x i32> %x.head, <4 x i32> poison, <4 x i32> zeroinitializer
44+
%res0 = add <4 x i32> %x.splat, splat (i32 42)
45+
%res1 = mul <4 x i32> %res0, splat (i32 42)
46+
ret <4 x i32> %res1
47+
}
48+
49+
; Shouldn't be scalarized since %x.splat and %y.splat have other users.
50+
define <4 x i32> @other_users_v4i32(i32 %x, i32 %y, ptr %p, ptr %q) {
51+
; CHECK-LABEL: define <4 x i32> @other_users_v4i32(
52+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) {
53+
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[X]], i32 0
54+
; CHECK-NEXT: [[RES:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
55+
; CHECK-NEXT: [[RES1:%.*]] = add <4 x i32> [[RES]], splat (i32 42)
56+
; CHECK-NEXT: store <4 x i32> [[RES]], ptr [[P]], align 16
57+
; CHECK-NEXT: store <4 x i32> [[RES]], ptr [[Q]], align 16
58+
; CHECK-NEXT: ret <4 x i32> [[RES1]]
59+
;
60+
%x.head = insertelement <4 x i32> poison, i32 %x, i32 0
61+
%x.splat = shufflevector <4 x i32> %x.head, <4 x i32> poison, <4 x i32> zeroinitializer
62+
%res = add <4 x i32> %x.splat, splat (i32 42)
63+
store <4 x i32> %x.splat, ptr %p
64+
store <4 x i32> %x.splat, ptr %q
65+
ret <4 x i32> %res
66+
}
67+
68+
define <4 x i1> @icmp_v4i32(i32 %x, i32 %y) {
69+
; CHECK-LABEL: define <4 x i1> @icmp_v4i32(
70+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
71+
; CHECK-NEXT: [[X_HEAD:%.*]] = insertelement <4 x i32> poison, i32 [[X]], i32 0
72+
; CHECK-NEXT: [[X_SPLAT:%.*]] = shufflevector <4 x i32> [[X_HEAD]], <4 x i32> poison, <4 x i32> zeroinitializer
73+
; CHECK-NEXT: [[RES:%.*]] = icmp eq <4 x i32> [[X_SPLAT]], splat (i32 42)
74+
; CHECK-NEXT: ret <4 x i1> [[RES]]
75+
;
76+
%x.head = insertelement <4 x i32> poison, i32 %x, i32 0
77+
%x.splat = shufflevector <4 x i32> %x.head, <4 x i32> poison, <4 x i32> zeroinitializer
78+
%res = icmp eq <4 x i32> %x.splat, splat (i32 42)
79+
ret <4 x i1> %res
80+
}
81+
82+
define <vscale x 4 x i1> @icmp_nxv4i32(i32 %x, i32 %y) {
83+
; CHECK-LABEL: define <vscale x 4 x i1> @icmp_nxv4i32(
84+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
85+
; CHECK-NEXT: [[X_HEAD:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[X]], i32 0
86+
; CHECK-NEXT: [[X_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[X_HEAD]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
87+
; CHECK-NEXT: [[RES:%.*]] = icmp eq <vscale x 4 x i32> [[X_SPLAT]], splat (i32 42)
88+
; CHECK-NEXT: ret <vscale x 4 x i1> [[RES]]
89+
;
90+
%x.head = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0
91+
%x.splat = shufflevector <vscale x 4 x i32> %x.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
92+
%res = icmp eq <vscale x 4 x i32> %x.splat, splat (i32 42)
93+
ret <vscale x 4 x i1> %res
94+
}

0 commit comments

Comments
 (0)