Skip to content

Commit 666e9e9

Browse files
committed
Add a complex test with mismatched types
1 parent d30e27a commit 666e9e9

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=load-store-vectorizer -S -o - %s | FileCheck %s
3+
4+
define void @merge_i32_v2i16_f32_v4i8(ptr addrspace(1) %ptr1, ptr addrspace(2) %ptr2) {
5+
; CHECK-LABEL: define void @merge_i32_v2i16_f32_v4i8(
6+
; CHECK-SAME: ptr addrspace(1) [[PTR1:%.*]], ptr addrspace(2) [[PTR2:%.*]]) {
7+
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[PTR1]], i64 0
8+
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr addrspace(1) [[GEP1]], align 4
9+
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds <2 x i16>, ptr addrspace(1) [[PTR1]], i64 1
10+
; CHECK-NEXT: [[LOAD2:%.*]] = load <2 x i16>, ptr addrspace(1) [[GEP2]], align 4
11+
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[PTR1]], i64 2
12+
; CHECK-NEXT: [[LOAD3:%.*]] = load float, ptr addrspace(1) [[GEP3]], align 4
13+
; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds <4 x i8>, ptr addrspace(1) [[PTR1]], i64 3
14+
; CHECK-NEXT: [[LOAD4:%.*]] = load <4 x i8>, ptr addrspace(1) [[GEP4]], align 4
15+
; CHECK-NEXT: [[STORE_GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(2) [[PTR2]], i64 0
16+
; CHECK-NEXT: store i32 [[LOAD1]], ptr addrspace(2) [[STORE_GEP1]], align 4
17+
; CHECK-NEXT: [[STORE_GEP2:%.*]] = getelementptr inbounds <2 x i16>, ptr addrspace(2) [[PTR2]], i64 1
18+
; CHECK-NEXT: store <2 x i16> [[LOAD2]], ptr addrspace(2) [[STORE_GEP2]], align 4
19+
; CHECK-NEXT: [[STORE_GEP3:%.*]] = getelementptr inbounds float, ptr addrspace(2) [[PTR2]], i64 2
20+
; CHECK-NEXT: store float [[LOAD3]], ptr addrspace(2) [[STORE_GEP3]], align 4
21+
; CHECK-NEXT: [[STORE_GEP4:%.*]] = getelementptr inbounds <4 x i8>, ptr addrspace(2) [[PTR2]], i64 3
22+
; CHECK-NEXT: store <4 x i8> [[LOAD4]], ptr addrspace(2) [[STORE_GEP4]], align 4
23+
; CHECK-NEXT: ret void
24+
;
25+
%gep1 = getelementptr inbounds i32, ptr addrspace(1) %ptr1, i64 0
26+
%load1 = load i32, ptr addrspace(1) %gep1, align 4
27+
%gep2 = getelementptr inbounds <2 x i16>, ptr addrspace(1) %ptr1, i64 1
28+
%load2 = load <2 x i16>, ptr addrspace(1) %gep2, align 4
29+
%gep3 = getelementptr inbounds float, ptr addrspace(1) %ptr1, i64 2
30+
%load3 = load float, ptr addrspace(1) %gep3, align 4
31+
%gep4 = getelementptr inbounds <4 x i8>, ptr addrspace(1) %ptr1, i64 3
32+
%load4 = load <4 x i8>, ptr addrspace(1) %gep4, align 4
33+
%store.gep1 = getelementptr inbounds i32, ptr addrspace(2) %ptr2, i64 0
34+
store i32 %load1, ptr addrspace(2) %store.gep1, align 4
35+
%store.gep2 = getelementptr inbounds <2 x i16>, ptr addrspace(2) %ptr2, i64 1
36+
store <2 x i16> %load2, ptr addrspace(2) %store.gep2, align 4
37+
%store.gep3 = getelementptr inbounds float, ptr addrspace(2) %ptr2, i64 2
38+
store float %load3, ptr addrspace(2) %store.gep3, align 4
39+
%store.gep4 = getelementptr inbounds <4 x i8>, ptr addrspace(2) %ptr2, i64 3
40+
store <4 x i8> %load4, ptr addrspace(2) %store.gep4, align 4
41+
ret void
42+
}
43+
44+
define void @merge_f32_v2f16_type(ptr addrspace(1) %ptr1, ptr addrspace(2) %ptr2) {
45+
; CHECK-LABEL: define void @merge_f32_v2f16_type(
46+
; CHECK-SAME: ptr addrspace(1) [[PTR1:%.*]], ptr addrspace(2) [[PTR2:%.*]]) {
47+
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[PTR1]], i64 0
48+
; CHECK-NEXT: [[LOAD1:%.*]] = load float, ptr addrspace(1) [[GEP1]], align 4
49+
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds <2 x half>, ptr addrspace(1) [[PTR1]], i64 1
50+
; CHECK-NEXT: [[LOAD2:%.*]] = load <2 x half>, ptr addrspace(1) [[GEP2]], align 4
51+
; CHECK-NEXT: [[STORE_GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(2) [[PTR2]], i64 0
52+
; CHECK-NEXT: store float [[LOAD1]], ptr addrspace(2) [[STORE_GEP1]], align 4
53+
; CHECK-NEXT: [[STORE_GEP2:%.*]] = getelementptr inbounds <2 x half>, ptr addrspace(2) [[PTR2]], i64 1
54+
; CHECK-NEXT: store <2 x half> [[LOAD2]], ptr addrspace(2) [[STORE_GEP2]], align 4
55+
; CHECK-NEXT: ret void
56+
;
57+
%gep1 = getelementptr inbounds float, ptr addrspace(1) %ptr1, i64 0
58+
%load1 = load float, ptr addrspace(1) %gep1, align 4
59+
%gep2 = getelementptr inbounds <2 x half>, ptr addrspace(1) %ptr1, i64 1
60+
%load2 = load <2 x half>, ptr addrspace(1) %gep2, align 4
61+
%store.gep1 = getelementptr inbounds i32, ptr addrspace(2) %ptr2, i64 0
62+
store float %load1, ptr addrspace(2) %store.gep1, align 4
63+
%store.gep2 = getelementptr inbounds <2 x half>, ptr addrspace(2) %ptr2, i64 1
64+
store <2 x half> %load2, ptr addrspace(2) %store.gep2, align 4
65+
ret void
66+
}
67+
68+
define void @merge_v2f16_bfloat_type(ptr addrspace(1) %ptr1, ptr addrspace(2) %ptr2) {
69+
; CHECK-LABEL: define void @merge_v2f16_bfloat_type(
70+
; CHECK-SAME: ptr addrspace(1) [[PTR1:%.*]], ptr addrspace(2) [[PTR2:%.*]]) {
71+
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds bfloat, ptr addrspace(1) [[PTR1]], i64 0
72+
; CHECK-NEXT: [[LOAD1:%.*]] = load bfloat, ptr addrspace(1) [[GEP1]], align 4
73+
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds <2 x half>, ptr addrspace(1) [[PTR1]], i64 1
74+
; CHECK-NEXT: [[LOAD2:%.*]] = load <2 x half>, ptr addrspace(1) [[GEP2]], align 4
75+
; CHECK-NEXT: [[STORE_GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(2) [[PTR2]], i64 0
76+
; CHECK-NEXT: store bfloat [[LOAD1]], ptr addrspace(2) [[STORE_GEP1]], align 4
77+
; CHECK-NEXT: [[STORE_GEP2:%.*]] = getelementptr inbounds <2 x half>, ptr addrspace(2) [[PTR2]], i64 1
78+
; CHECK-NEXT: store <2 x half> [[LOAD2]], ptr addrspace(2) [[STORE_GEP2]], align 4
79+
; CHECK-NEXT: ret void
80+
;
81+
%gep1 = getelementptr inbounds bfloat, ptr addrspace(1) %ptr1, i64 0
82+
%load1 = load bfloat, ptr addrspace(1) %gep1, align 4
83+
%gep2 = getelementptr inbounds <2 x half>, ptr addrspace(1) %ptr1, i64 1
84+
%load2 = load <2 x half>, ptr addrspace(1) %gep2, align 4
85+
%store.gep1 = getelementptr inbounds i32, ptr addrspace(2) %ptr2, i64 0
86+
store bfloat %load1, ptr addrspace(2) %store.gep1, align 4
87+
%store.gep2 = getelementptr inbounds <2 x half>, ptr addrspace(2) %ptr2, i64 1
88+
store <2 x half> %load2, ptr addrspace(2) %store.gep2, align 4
89+
ret void
90+
}
91+
92+
define void @no_merge_mixed_ptr_addrspaces(ptr addrspace(1) %ptr1, ptr addrspace(2) %ptr2) {
93+
; CHECK-LABEL: define void @no_merge_mixed_ptr_addrspaces(
94+
; CHECK-SAME: ptr addrspace(1) [[PTR1:%.*]], ptr addrspace(2) [[PTR2:%.*]]) {
95+
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds ptr addrspace(1), ptr addrspace(1) [[PTR1]], i64 0
96+
; CHECK-NEXT: [[LOAD1:%.*]] = load ptr addrspace(1), ptr addrspace(1) [[GEP1]], align 4
97+
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds ptr addrspace(2), ptr addrspace(1) [[PTR1]], i64 1
98+
; CHECK-NEXT: [[LOAD2:%.*]] = load ptr addrspace(2), ptr addrspace(1) [[GEP2]], align 4
99+
; CHECK-NEXT: [[STORE_GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(2) [[PTR2]], i64 0
100+
; CHECK-NEXT: store ptr addrspace(1) [[LOAD1]], ptr addrspace(2) [[STORE_GEP1]], align 4
101+
; CHECK-NEXT: [[STORE_GEP2:%.*]] = getelementptr inbounds ptr addrspace(2), ptr addrspace(2) [[PTR2]], i64 1
102+
; CHECK-NEXT: store ptr addrspace(2) [[LOAD2]], ptr addrspace(2) [[STORE_GEP2]], align 4
103+
; CHECK-NEXT: ret void
104+
;
105+
%gep1 = getelementptr inbounds ptr addrspace(1), ptr addrspace(1) %ptr1, i64 0
106+
%load1 = load ptr addrspace(1), ptr addrspace(1) %gep1, align 4
107+
%gep2 = getelementptr inbounds ptr addrspace(2), ptr addrspace(1) %ptr1, i64 1
108+
%load2 = load ptr addrspace(2), ptr addrspace(1) %gep2, align 4
109+
%store.gep1 = getelementptr inbounds i32, ptr addrspace(2) %ptr2, i64 0
110+
store ptr addrspace(1) %load1, ptr addrspace(2) %store.gep1, align 4
111+
%store.gep2 = getelementptr inbounds ptr addrspace(2), ptr addrspace(2) %ptr2, i64 1
112+
store ptr addrspace(2) %load2, ptr addrspace(2) %store.gep2, align 4
113+
ret void
114+
}

0 commit comments

Comments
 (0)