1; RUN: opt -S -mtriple=amdgcn--amdhsa -load-store-vectorizer < %s | FileCheck %s
2
3; Check that vectorizer can find a GEP through bitcast
4; CHECK-LABEL: @vect_zext_bitcast_f32_to_i32_idx
5; CHECK: load <4 x i32>
6define void @vect_zext_bitcast_f32_to_i32_idx(float addrspace(1)* %arg1, i32 %base) {
7  %add1 = add nuw i32 %base, 0
8  %zext1 = zext i32 %add1 to i64
9  %gep1 = getelementptr inbounds float, float addrspace(1)* %arg1, i64 %zext1
10  %f2i1 = bitcast float addrspace(1)* %gep1 to i32 addrspace(1)*
11  %load1 = load i32, i32 addrspace(1)* %f2i1, align 4
12  %add2 = add nuw i32 %base, 1
13  %zext2 = zext i32 %add2 to i64
14  %gep2 = getelementptr inbounds float, float addrspace(1)* %arg1, i64 %zext2
15  %f2i2 = bitcast float addrspace(1)* %gep2 to i32 addrspace(1)*
16  %load2 = load i32, i32 addrspace(1)* %f2i2, align 4
17  %add3 = add nuw i32 %base, 2
18  %zext3 = zext i32 %add3 to i64
19  %gep3 = getelementptr inbounds float, float addrspace(1)* %arg1, i64 %zext3
20  %f2i3 = bitcast float addrspace(1)* %gep3 to i32 addrspace(1)*
21  %load3 = load i32, i32 addrspace(1)* %f2i3, align 4
22  %add4 = add nuw i32 %base, 3
23  %zext4 = zext i32 %add4 to i64
24  %gep4 = getelementptr inbounds float, float addrspace(1)* %arg1, i64 %zext4
25  %f2i4 = bitcast float addrspace(1)* %gep4 to i32 addrspace(1)*
26  %load4 = load i32, i32 addrspace(1)* %f2i4, align 4
27  ret void
28}
29
30; CHECK-LABEL: @vect_zext_bitcast_i8_st1_to_i32_idx
31; CHECK: load i32
32; CHECK: load i32
33; CHECK: load i32
34; CHECK: load i32
35define void @vect_zext_bitcast_i8_st1_to_i32_idx(i8 addrspace(1)* %arg1, i32 %base) {
36  %add1 = add nuw i32 %base, 0
37  %zext1 = zext i32 %add1 to i64
38  %gep1 = getelementptr inbounds i8, i8 addrspace(1)* %arg1, i64 %zext1
39  %f2i1 = bitcast i8 addrspace(1)* %gep1 to i32 addrspace(1)*
40  %load1 = load i32, i32 addrspace(1)* %f2i1, align 4
41  %add2 = add nuw i32 %base, 1
42  %zext2 = zext i32 %add2 to i64
43  %gep2 = getelementptr inbounds i8,i8 addrspace(1)* %arg1, i64 %zext2
44  %f2i2 = bitcast i8 addrspace(1)* %gep2 to i32 addrspace(1)*
45  %load2 = load i32, i32 addrspace(1)* %f2i2, align 4
46  %add3 = add nuw i32 %base, 2
47  %zext3 = zext i32 %add3 to i64
48  %gep3 = getelementptr inbounds i8, i8 addrspace(1)* %arg1, i64 %zext3
49  %f2i3 = bitcast i8 addrspace(1)* %gep3 to i32 addrspace(1)*
50  %load3 = load i32, i32 addrspace(1)* %f2i3, align 4
51  %add4 = add nuw i32 %base, 3
52  %zext4 = zext i32 %add4 to i64
53  %gep4 = getelementptr inbounds i8, i8 addrspace(1)* %arg1, i64 %zext4
54  %f2i4 = bitcast i8 addrspace(1)* %gep4 to i32 addrspace(1)*
55  %load4 = load i32, i32 addrspace(1)* %f2i4, align 4
56  ret void
57}
58
59; TODO: This can be vectorized, but currently vectorizer unable to do it.
60; CHECK-LABEL: @vect_zext_bitcast_i8_st4_to_i32_idx
61define void @vect_zext_bitcast_i8_st4_to_i32_idx(i8 addrspace(1)* %arg1, i32 %base) {
62  %add1 = add nuw i32 %base, 0
63  %zext1 = zext i32 %add1 to i64
64  %gep1 = getelementptr inbounds i8, i8 addrspace(1)* %arg1, i64 %zext1
65  %f2i1 = bitcast i8 addrspace(1)* %gep1 to i32 addrspace(1)*
66  %load1 = load i32, i32 addrspace(1)* %f2i1, align 4
67  %add2 = add nuw i32 %base, 4
68  %zext2 = zext i32 %add2 to i64
69  %gep2 = getelementptr inbounds i8,i8 addrspace(1)* %arg1, i64 %zext2
70  %f2i2 = bitcast i8 addrspace(1)* %gep2 to i32 addrspace(1)*
71  %load2 = load i32, i32 addrspace(1)* %f2i2, align 4
72  %add3 = add nuw i32 %base, 8
73  %zext3 = zext i32 %add3 to i64
74  %gep3 = getelementptr inbounds i8, i8 addrspace(1)* %arg1, i64 %zext3
75  %f2i3 = bitcast i8 addrspace(1)* %gep3 to i32 addrspace(1)*
76  %load3 = load i32, i32 addrspace(1)* %f2i3, align 4
77  %add4 = add nuw i32 %base, 16
78  %zext4 = zext i32 %add4 to i64
79  %gep4 = getelementptr inbounds i8, i8 addrspace(1)* %arg1, i64 %zext4
80  %f2i4 = bitcast i8 addrspace(1)* %gep4 to i32 addrspace(1)*
81  %load4 = load i32, i32 addrspace(1)* %f2i4, align 4
82  ret void
83}
84