Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / load-local-redundant-copies.ll
blob01bab28a498587f25c7a5f372f375db96f7d0241
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn -verify-machineinstrs < %s | FileCheck %s
4 ; Test that checks for redundant copies to temporary stack slot produced by
5 ; expandUnalignedLoad.
7 define amdgpu_vs void @test(ptr addrspace(8) inreg %arg1, ptr addrspace(3) %arg2) {
8 ; CHECK-LABEL: test:
9 ; CHECK:       ; %bb.0:
10 ; CHECK-NEXT:    v_add_i32_e32 v3, vcc, 12, v0
11 ; CHECK-NEXT:    v_add_i32_e32 v1, vcc, 8, v0
12 ; CHECK-NEXT:    v_add_i32_e32 v4, vcc, 4, v0
13 ; CHECK-NEXT:    s_mov_b32 m0, -1
14 ; CHECK-NEXT:    ds_read_b32 v2, v1
15 ; CHECK-NEXT:    ds_read_b32 v1, v4
16 ; CHECK-NEXT:    ds_read_b32 v3, v3
17 ; CHECK-NEXT:    ds_read_b32 v0, v0
18 ; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
19 ; CHECK-NEXT:    exp mrt0 off, off, off, off
20 ; CHECK-NEXT:    v_mov_b32_e32 v4, 0
21 ; CHECK-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_DATA_FORMAT_32_32_32_32,BUF_NUM_FORMAT_FLOAT] idxen
22 ; CHECK-NEXT:    s_endpgm
23   call void @llvm.amdgcn.exp.f32(i32 0, i32 0, float undef, float undef, float undef, float undef, i1 false, i1 false)
24   %var1 = load <6 x float>, ptr addrspace(3) %arg2, align 4
25   %var2 = shufflevector <6 x float> %var1, <6 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
26   call void @llvm.amdgcn.struct.ptr.tbuffer.store.v4f32(<4 x float> %var2, ptr addrspace(8) %arg1, i32 0, i32 0, i32 0, i32 126, i32 0)
27   ret void
30 define amdgpu_vs void @test_2(ptr addrspace(8) inreg %arg1, i32 %arg2, i32 inreg %arg3, ptr addrspace(3) %arg4) {
31 ; CHECK-LABEL: test_2:
32 ; CHECK:       ; %bb.0:
33 ; CHECK-NEXT:    v_add_i32_e32 v3, vcc, 20, v1
34 ; CHECK-NEXT:    v_add_i32_e32 v2, vcc, 16, v1
35 ; CHECK-NEXT:    v_add_i32_e32 v4, vcc, 28, v1
36 ; CHECK-NEXT:    v_add_i32_e32 v6, vcc, 24, v1
37 ; CHECK-NEXT:    v_add_i32_e32 v7, vcc, 12, v1
38 ; CHECK-NEXT:    v_add_i32_e32 v8, vcc, 8, v1
39 ; CHECK-NEXT:    v_add_i32_e32 v10, vcc, 4, v1
40 ; CHECK-NEXT:    s_mov_b32 m0, -1
41 ; CHECK-NEXT:    ds_read_b32 v2, v2
42 ; CHECK-NEXT:    ds_read_b32 v5, v4
43 ; CHECK-NEXT:    ds_read_b32 v4, v6
44 ; CHECK-NEXT:    ds_read_b32 v9, v7
45 ; CHECK-NEXT:    ds_read_b32 v8, v8
46 ; CHECK-NEXT:    ds_read_b32 v7, v10
47 ; CHECK-NEXT:    ds_read_b32 v6, v1
48 ; CHECK-NEXT:    ds_read_b32 v3, v3
49 ; CHECK-NEXT:    s_waitcnt lgkmcnt(1)
50 ; CHECK-NEXT:    tbuffer_store_format_xyzw v[6:9], v0, s[0:3], s4 format:[BUF_DATA_FORMAT_32_32_32,BUF_NUM_FORMAT_UINT] idxen glc slc
51 ; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
52 ; CHECK-NEXT:    tbuffer_store_format_xyzw v[2:5], v0, s[0:3], s4 format:[BUF_DATA_FORMAT_32_32_32,BUF_NUM_FORMAT_UINT] idxen offset:16 glc slc
53 ; CHECK-NEXT:    s_endpgm
54   %load = load <8 x float>, ptr addrspace(3) %arg4, align 4
55   %vec1 = shufflevector <8 x float> %load, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
56   call void @llvm.amdgcn.struct.ptr.tbuffer.store.v4f32(<4 x float> %vec1, ptr addrspace(8) %arg1, i32 %arg2, i32 0, i32 %arg3, i32 77, i32 3)
57   %vec2 = shufflevector <8 x float> %load, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
58   call void @llvm.amdgcn.struct.ptr.tbuffer.store.v4f32(<4 x float> %vec2, ptr addrspace(8) %arg1, i32 %arg2, i32 16, i32 %arg3, i32 77, i32 3)
59   ret void
62 define amdgpu_vs void @test_3(i32 inreg %arg1, i32 inreg %arg2, ptr addrspace(8) inreg %arg3, i32 %arg4, ptr addrspace(3) %arg5, ptr addrspace(3) %arg6) {
63 ; CHECK-LABEL: test_3:
64 ; CHECK:       ; %bb.0:
65 ; CHECK-NEXT:    s_mov_b32 s7, s5
66 ; CHECK-NEXT:    s_mov_b32 s6, s4
67 ; CHECK-NEXT:    s_mov_b32 s5, s3
68 ; CHECK-NEXT:    s_mov_b32 s4, s2
69 ; CHECK-NEXT:    v_add_i32_e32 v0, vcc, 20, v1
70 ; CHECK-NEXT:    v_add_i32_e32 v3, vcc, 16, v1
71 ; CHECK-NEXT:    v_add_i32_e32 v4, vcc, 12, v1
72 ; CHECK-NEXT:    v_add_i32_e32 v5, vcc, 8, v1
73 ; CHECK-NEXT:    v_add_i32_e32 v8, vcc, 4, v1
74 ; CHECK-NEXT:    v_mov_b32_e32 v9, s0
75 ; CHECK-NEXT:    v_add_i32_e32 v10, vcc, 20, v2
76 ; CHECK-NEXT:    v_add_i32_e32 v11, vcc, 16, v2
77 ; CHECK-NEXT:    s_mov_b32 m0, -1
78 ; CHECK-NEXT:    ds_read_b32 v7, v3
79 ; CHECK-NEXT:    ds_read_b32 v6, v4
80 ; CHECK-NEXT:    ds_read_b32 v5, v5
81 ; CHECK-NEXT:    ds_read_b32 v4, v8
82 ; CHECK-NEXT:    ds_read_b32 v8, v0
83 ; CHECK-NEXT:    ds_read_b32 v3, v1
84 ; CHECK-NEXT:    v_add_i32_e32 v1, vcc, 12, v2
85 ; CHECK-NEXT:    v_add_i32_e32 v12, vcc, 8, v2
86 ; CHECK-NEXT:    v_add_i32_e32 v13, vcc, 4, v2
87 ; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
88 ; CHECK-NEXT:    tbuffer_store_format_xyzw v[3:6], v9, s[4:7], s1 format:[BUF_DATA_FORMAT_32_32_32,BUF_NUM_FORMAT_UINT] idxen offset:264 glc slc
89 ; CHECK-NEXT:    tbuffer_store_format_xy v[7:8], v9, s[4:7], s1 format:[BUF_DATA_FORMAT_INVALID,BUF_NUM_FORMAT_UINT] idxen offset:280 glc slc
90 ; CHECK-NEXT:    ds_read_b32 v0, v11
91 ; CHECK-NEXT:    s_waitcnt expcnt(1)
92 ; CHECK-NEXT:    ds_read_b32 v5, v1
93 ; CHECK-NEXT:    ds_read_b32 v4, v12
94 ; CHECK-NEXT:    ds_read_b32 v3, v13
95 ; CHECK-NEXT:    ds_read_b32 v2, v2
96 ; CHECK-NEXT:    ds_read_b32 v1, v10
97 ; CHECK-NEXT:    s_waitcnt lgkmcnt(5)
98 ; CHECK-NEXT:    exp mrt0 off, off, off, off
99 ; CHECK-NEXT:    s_waitcnt lgkmcnt(1)
100 ; CHECK-NEXT:    tbuffer_store_format_xyzw v[2:5], v9, s[4:7], s1 format:[BUF_DATA_FORMAT_32_32_32,BUF_NUM_FORMAT_UINT] idxen offset:240 glc slc
101 ; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
102 ; CHECK-NEXT:    tbuffer_store_format_xy v[0:1], v9, s[4:7], s1 format:[BUF_DATA_FORMAT_INVALID,BUF_NUM_FORMAT_UINT] idxen offset:256 glc slc
103 ; CHECK-NEXT:    s_endpgm
104   %load1 = load <6 x float>, ptr addrspace(3) %arg5, align 4
105   %vec11 = shufflevector <6 x float> %load1, <6 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
106   call void @llvm.amdgcn.struct.ptr.tbuffer.store.v4f32(<4 x float> %vec11, ptr addrspace(8) %arg3, i32 %arg1, i32 264, i32 %arg2, i32 77, i32 3)
107   %vec12 = shufflevector <6 x float> %load1, <6 x float> undef, <2 x i32> <i32 4, i32 5>
108   call void @llvm.amdgcn.struct.ptr.tbuffer.store.v2f32(<2 x float> %vec12, ptr addrspace(8) %arg3, i32 %arg1, i32 280, i32 %arg2, i32 64, i32 3)
110   call void @llvm.amdgcn.exp.f32(i32 0, i32 0, float undef, float undef, float undef, float undef, i1 false, i1 false)
112   %load2 = load <6 x float>, ptr addrspace(3) %arg6, align 4
113   %vec21 = shufflevector <6 x float> %load2, <6 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
114   call void @llvm.amdgcn.struct.ptr.tbuffer.store.v4f32(<4 x float> %vec21, ptr addrspace(8) %arg3, i32 %arg1, i32 240, i32 %arg2, i32 77, i32 3)
115   %vec22 = shufflevector <6 x float> %load2, <6 x float> undef, <2 x i32> <i32 4, i32 5>
116   call void @llvm.amdgcn.struct.ptr.tbuffer.store.v2f32(<2 x float> %vec22, ptr addrspace(8) %arg3, i32 %arg1, i32 256, i32 %arg2, i32 64, i32 3)
118   ret void
121 declare void @llvm.amdgcn.struct.ptr.tbuffer.store.v4f32(<4 x float>, ptr addrspace(8), i32, i32, i32, i32 immarg, i32 immarg)
122 declare void @llvm.amdgcn.struct.ptr.tbuffer.store.v2f32(<2 x float>, ptr addrspace(8), i32, i32, i32, i32 immarg, i32 immarg)
123 declare void @llvm.amdgcn.exp.f32(i32 immarg, i32 immarg, float, float, float, float, i1 immarg, i1 immarg)