Revert rGe6ccb57bb3f6b761f2310e97fd6ca99eff42f73e "[SLP] Add cost model for `llvm...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / ds-combine-with-dependence.ll
blob0f4b2778b591547092e93966e73b1c58fd916bb3
1 ; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN %s
4 ; There is no dependence between the store and the two loads. So we can combine
5 ; the loads and schedule it freely.
7 ; GCN-LABEL: {{^}}ds_combine_nodep
9 ; GCN-DAG: ds_write2_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset0:26 offset1:27
10 ; GCN-DAG: ds_read2_b32 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:7 offset1:8
11 ; GCN: s_waitcnt lgkmcnt({{[0-9]+}})
12 define amdgpu_kernel void @ds_combine_nodep(float addrspace(1)* %out, float addrspace(3)* %inptr) {
14   %base = bitcast float addrspace(3)* %inptr to i8 addrspace(3)*
15   %addr0 = getelementptr i8, i8 addrspace(3)* %base, i32 24
16   %tmp0 = bitcast i8 addrspace(3)* %addr0 to float addrspace(3)*
17   %vaddr0 = bitcast float addrspace(3)* %tmp0 to <3 x float> addrspace(3)*
18   %load0 = load <3 x float>, <3 x float> addrspace(3)* %vaddr0, align 4
19   %v0 = extractelement <3 x float> %load0, i32 2
21   %tmp1 = insertelement <2 x float> undef, float 1.0, i32 0
22   %data = insertelement <2 x float> %tmp1, float 2.0, i32 1
24   %tmp2 = getelementptr float, float addrspace(3)* %inptr, i32 26
25   %vaddrs = bitcast float addrspace(3)* %tmp2 to <2 x float> addrspace(3)*
26   store <2 x float> %data, <2 x float> addrspace(3)* %vaddrs, align 4
28   %vaddr1 = getelementptr float, float addrspace(3)* %inptr, i32 7
29   %v1 = load float, float addrspace(3)* %vaddr1, align 4
31   %sum = fadd float %v0, %v1
32   store float %sum, float addrspace(1)* %out, align 4
33   ret void
37 ; The store depends on the first load, so we could not move the first load down to combine with
38 ; the second load directly. However, we can move the store after the combined load.
40 ; GCN-LABEL: {{^}}ds_combine_WAR
42 ; GCN:      ds_read2_b32 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:7 offset1:27
43 ; GCN-NEXT: ds_write2_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset0:26 offset1:27
44 define amdgpu_kernel void @ds_combine_WAR(float addrspace(1)* %out, float addrspace(3)* %inptr) {
46   %base = bitcast float addrspace(3)* %inptr to i8 addrspace(3)*
47   %addr0 = getelementptr i8, i8 addrspace(3)* %base, i32 100
48   %tmp0 = bitcast i8 addrspace(3)* %addr0 to float addrspace(3)*
49   %vaddr0 = bitcast float addrspace(3)* %tmp0 to <3 x float> addrspace(3)*
50   %load0 = load <3 x float>, <3 x float> addrspace(3)* %vaddr0, align 4
51   %v0 = extractelement <3 x float> %load0, i32 2
53   %tmp1 = insertelement <2 x float> undef, float 1.0, i32 0
54   %data = insertelement <2 x float> %tmp1, float 2.0, i32 1
56   %tmp2 = getelementptr float, float addrspace(3)* %inptr, i32 26
57   %vaddrs = bitcast float addrspace(3)* %tmp2 to <2 x float> addrspace(3)*
58   store <2 x float> %data, <2 x float> addrspace(3)* %vaddrs, align 4
60   %vaddr1 = getelementptr float, float addrspace(3)* %inptr, i32 7
61   %v1 = load float, float addrspace(3)* %vaddr1, align 4
63   %sum = fadd float %v0, %v1
64   store float %sum, float addrspace(1)* %out, align 4
65   ret void
69 ; The second load depends on the store. We could combine the two loads, putting
70 ; the combined load at the original place of the second load, but we prefer to
71 ; leave the first load near the start of the function to hide its latency.
73 ; GCN-LABEL: {{^}}ds_combine_RAW
75 ; GCN:      ds_write2_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset0:26 offset1:27
76 ; GCN-NEXT: ds_read_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:32
77 ; GCN-NEXT: ds_read_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:104
78 define amdgpu_kernel void @ds_combine_RAW(float addrspace(1)* %out, float addrspace(3)* %inptr) {
80   %base = bitcast float addrspace(3)* %inptr to i8 addrspace(3)*
81   %addr0 = getelementptr i8, i8 addrspace(3)* %base, i32 24
82   %tmp0 = bitcast i8 addrspace(3)* %addr0 to float addrspace(3)*
83   %vaddr0 = bitcast float addrspace(3)* %tmp0 to <3 x float> addrspace(3)*
84   %load0 = load <3 x float>, <3 x float> addrspace(3)* %vaddr0, align 4
85   %v0 = extractelement <3 x float> %load0, i32 2
87   %tmp1 = insertelement <2 x float> undef, float 1.0, i32 0
88   %data = insertelement <2 x float> %tmp1, float 2.0, i32 1
90   %tmp2 = getelementptr float, float addrspace(3)* %inptr, i32 26
91   %vaddrs = bitcast float addrspace(3)* %tmp2 to <2 x float> addrspace(3)*
92   store <2 x float> %data, <2 x float> addrspace(3)* %vaddrs, align 4
94   %vaddr1 = getelementptr float, float addrspace(3)* %inptr, i32 26
95   %v1 = load float, float addrspace(3)* %vaddr1, align 4
97   %sum = fadd float %v0, %v1
98   store float %sum, float addrspace(1)* %out, align 4
99   ret void
103 ; The store depends on the first load, also the second load depends on the store.
104 ; So we can not combine the two loads.
106 ; GCN-LABEL: {{^}}ds_combine_WAR_RAW
108 ; GCN:      ds_read_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:108
109 ; GCN-NEXT: ds_write2_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset0:26 offset1:27
110 ; GCN-NEXT: ds_read_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:104
111 define amdgpu_kernel void @ds_combine_WAR_RAW(float addrspace(1)* %out, float addrspace(3)* %inptr) {
113   %base = bitcast float addrspace(3)* %inptr to i8 addrspace(3)*
114   %addr0 = getelementptr i8, i8 addrspace(3)* %base, i32 100
115   %tmp0 = bitcast i8 addrspace(3)* %addr0 to float addrspace(3)*
116   %vaddr0 = bitcast float addrspace(3)* %tmp0 to <3 x float> addrspace(3)*
117   %load0 = load <3 x float>, <3 x float> addrspace(3)* %vaddr0, align 4
118   %v0 = extractelement <3 x float> %load0, i32 2
120   %tmp1 = insertelement <2 x float> undef, float 1.0, i32 0
121   %data = insertelement <2 x float> %tmp1, float 2.0, i32 1
123   %tmp2 = getelementptr float, float addrspace(3)* %inptr, i32 26
124   %vaddrs = bitcast float addrspace(3)* %tmp2 to <2 x float> addrspace(3)*
125   store <2 x float> %data, <2 x float> addrspace(3)* %vaddrs, align 4
127   %vaddr1 = getelementptr float, float addrspace(3)* %inptr, i32 26
128   %v1 = load float, float addrspace(3)* %vaddr1, align 4
130   %sum = fadd float %v0, %v1
131   store float %sum, float addrspace(1)* %out, align 4
132   ret void