@@ -28,3 +28,122 @@ define void @store(ptr %x, <vscale x 1 x i32> %y, <vscale x 1 x i32> %z) {
28
28
store %struct.test %b , ptr %x
29
29
ret void
30
30
}
31
+
32
+ define {<vscale x 16 x i8 >, <vscale x 16 x i8 >} @split_load (ptr %p ) nounwind {
33
+ ; CHECK-LABEL: define { <vscale x 16 x i8>, <vscale x 16 x i8> } @split_load
34
+ ; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
35
+ ; CHECK-NEXT: entry:
36
+ ; CHECK-NEXT: [[R:%.*]] = load { <vscale x 16 x i8>, <vscale x 16 x i8> }, ptr [[P]], align 16
37
+ ; CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[R]]
38
+ ;
39
+ entry:
40
+ %r = load {<vscale x 16 x i8 >, <vscale x 16 x i8 >}, ptr %p
41
+ ret {<vscale x 16 x i8 >, <vscale x 16 x i8 >} %r
42
+ }
43
+
44
+ define {<vscale x 16 x i8 >} @split_load_one (ptr %p ) nounwind {
45
+ ; CHECK-LABEL: define { <vscale x 16 x i8> } @split_load_one
46
+ ; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0]] {
47
+ ; CHECK-NEXT: entry:
48
+ ; CHECK-NEXT: [[R_UNPACK:%.*]] = load <vscale x 16 x i8>, ptr [[P]], align 16
49
+ ; CHECK-NEXT: [[R1:%.*]] = insertvalue { <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[R_UNPACK]], 0
50
+ ; CHECK-NEXT: ret { <vscale x 16 x i8> } [[R1]]
51
+ ;
52
+ entry:
53
+ %r = load {<vscale x 16 x i8 >}, ptr %p
54
+ ret {<vscale x 16 x i8 >} %r
55
+ }
56
+
57
+ define void @split_store ({<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p ) nounwind {
58
+ ; CHECK-LABEL: define void @split_store
59
+ ; CHECK-SAME: ({ <vscale x 4 x i32>, <vscale x 4 x i32> } [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
60
+ ; CHECK-NEXT: entry:
61
+ ; CHECK-NEXT: store { <vscale x 4 x i32>, <vscale x 4 x i32> } [[X]], ptr [[P]], align 16
62
+ ; CHECK-NEXT: ret void
63
+ ;
64
+ entry:
65
+ store {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p
66
+ ret void
67
+ }
68
+
69
+ define void @split_store_one ({<vscale x 4 x i32 >} %x , ptr %p ) nounwind {
70
+ ; CHECK-LABEL: define void @split_store_one
71
+ ; CHECK-SAME: ({ <vscale x 4 x i32> } [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
72
+ ; CHECK-NEXT: entry:
73
+ ; CHECK-NEXT: [[TMP0:%.*]] = extractvalue { <vscale x 4 x i32> } [[X]], 0
74
+ ; CHECK-NEXT: store <vscale x 4 x i32> [[TMP0]], ptr [[P]], align 16
75
+ ; CHECK-NEXT: ret void
76
+ ;
77
+ entry:
78
+ store {<vscale x 4 x i32 >} %x , ptr %p
79
+ ret void
80
+ }
81
+
82
+ define {<16 x i8 >, <16 x i8 >} @check_v16i8_v4i32 ({<4 x i32 >, <4 x i32 >} %x , ptr %p ) nounwind {
83
+ ; CHECK-LABEL: define { <16 x i8>, <16 x i8> } @check_v16i8_v4i32
84
+ ; CHECK-SAME: ({ <4 x i32>, <4 x i32> } [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
85
+ ; CHECK-NEXT: entry:
86
+ ; CHECK-NEXT: [[X_ELT:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[X]], 0
87
+ ; CHECK-NEXT: store <4 x i32> [[X_ELT]], ptr [[P]], align 16
88
+ ; CHECK-NEXT: [[P_REPACK1:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 16
89
+ ; CHECK-NEXT: [[X_ELT2:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[X]], 1
90
+ ; CHECK-NEXT: store <4 x i32> [[X_ELT2]], ptr [[P_REPACK1]], align 16
91
+ ; CHECK-NEXT: [[R_UNPACK_CAST:%.*]] = bitcast <4 x i32> [[X_ELT]] to <16 x i8>
92
+ ; CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <16 x i8>, <16 x i8> } poison, <16 x i8> [[R_UNPACK_CAST]], 0
93
+ ; CHECK-NEXT: [[R_UNPACK4_CAST:%.*]] = bitcast <4 x i32> [[X_ELT2]] to <16 x i8>
94
+ ; CHECK-NEXT: [[R5:%.*]] = insertvalue { <16 x i8>, <16 x i8> } [[TMP0]], <16 x i8> [[R_UNPACK4_CAST]], 1
95
+ ; CHECK-NEXT: ret { <16 x i8>, <16 x i8> } [[R5]]
96
+ ;
97
+ entry:
98
+ store {<4 x i32 >, <4 x i32 >} %x , ptr %p
99
+ %r = load {<16 x i8 >, <16 x i8 >}, ptr %p
100
+ ret {<16 x i8 >, <16 x i8 >} %r
101
+ }
102
+
103
+ define {<vscale x 16 x i8 >, <vscale x 16 x i8 >} @check_nxv16i8_nxv4i32 ({<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p ) nounwind {
104
+ ; CHECK-LABEL: define { <vscale x 16 x i8>, <vscale x 16 x i8> } @check_nxv16i8_nxv4i32
105
+ ; CHECK-SAME: ({ <vscale x 4 x i32>, <vscale x 4 x i32> } [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
106
+ ; CHECK-NEXT: entry:
107
+ ; CHECK-NEXT: store { <vscale x 4 x i32>, <vscale x 4 x i32> } [[X]], ptr [[P]], align 16
108
+ ; CHECK-NEXT: [[R:%.*]] = load { <vscale x 16 x i8>, <vscale x 16 x i8> }, ptr [[P]], align 16
109
+ ; CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[R]]
110
+ ;
111
+ entry:
112
+ store {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p
113
+ %r = load {<vscale x 16 x i8 >, <vscale x 16 x i8 >}, ptr %p
114
+ ret {<vscale x 16 x i8 >, <vscale x 16 x i8 >} %r
115
+ }
116
+
117
+ define {<vscale x 16 x i8 >, <vscale x 16 x i8 >} @alloca_nxv16i8_nxv4i32 ({<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x ) nounwind {
118
+ ; CHECK-LABEL: define { <vscale x 16 x i8>, <vscale x 16 x i8> } @alloca_nxv16i8_nxv4i32
119
+ ; CHECK-SAME: ({ <vscale x 4 x i32>, <vscale x 4 x i32> } [[X:%.*]]) #[[ATTR0]] {
120
+ ; CHECK-NEXT: entry:
121
+ ; CHECK-NEXT: [[P:%.*]] = alloca { <vscale x 4 x i32>, <vscale x 4 x i32> }, align 16
122
+ ; CHECK-NEXT: store { <vscale x 4 x i32>, <vscale x 4 x i32> } [[X]], ptr [[P]], align 16
123
+ ; CHECK-NEXT: [[R:%.*]] = load { <vscale x 16 x i8>, <vscale x 16 x i8> }, ptr [[P]], align 16
124
+ ; CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[R]]
125
+ ;
126
+ entry:
127
+ %p = alloca {<vscale x 4 x i32 >, <vscale x 4 x i32 >}
128
+ store {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p
129
+ %r = load {<vscale x 16 x i8 >, <vscale x 16 x i8 >}, ptr %p
130
+ ret {<vscale x 16 x i8 >, <vscale x 16 x i8 >} %r
131
+ }
132
+
133
+ define { <16 x i8 >, <32 x i8 > } @differenttypes ({ <4 x i32 >, <8 x i32 > } %a , ptr %p ) {
134
+ ; CHECK-LABEL: define { <16 x i8>, <32 x i8> } @differenttypes
135
+ ; CHECK-SAME: ({ <4 x i32>, <8 x i32> } [[A:%.*]], ptr [[P:%.*]]) {
136
+ ; CHECK-NEXT: entry:
137
+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull [[P]])
138
+ ; CHECK-NEXT: store { <4 x i32>, <8 x i32> } [[A]], ptr [[P]], align 16
139
+ ; CHECK-NEXT: [[TMP0:%.*]] = load { <16 x i8>, <32 x i8> }, ptr [[P]], align 16
140
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull [[P]])
141
+ ; CHECK-NEXT: ret { <16 x i8>, <32 x i8> } [[TMP0]]
142
+ ;
143
+ entry:
144
+ call void @llvm.lifetime.start.p0 (i64 -1 , ptr nonnull %p ) #5
145
+ store { <4 x i32 >, <8 x i32 > } %a , ptr %p , align 16
146
+ %2 = load { <16 x i8 >, <32 x i8 > }, ptr %p , align 16
147
+ call void @llvm.lifetime.end.p0 (i64 -1 , ptr nonnull %p ) #5
148
+ ret { <16 x i8 >, <32 x i8 > } %2
149
+ }
0 commit comments