1# RUN: llc -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs -run-pass si-load-store-opt -o - %s | FileCheck %s
2
3# CHECK-LABEL: name: merge_s_buffer_load_x2
4# CHECK: S_BUFFER_LOAD_DWORDX2_IMM %0, 0, 0 :: (dereferenceable invariant load (s64), align 4)
5
6name: merge_s_buffer_load_x2
7tracksRegLiveness: true
8body:             |
9  bb.0:
10    liveins: $sgpr0_sgpr1_sgpr2_sgpr3
11
12    %0:sgpr_128 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
13    %1:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 0, 0 :: (dereferenceable invariant load (s32))
14    %2:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 4, 0 :: (dereferenceable invariant load (s32))
15
16    S_ENDPGM 0
17...
18---
19
20# CHECK-LABEL: name: merge_s_buffer_load_x4
21# CHECK: S_BUFFER_LOAD_DWORDX4_IMM %0, 0, 0 :: (dereferenceable invariant load (s128), align 4)
22name: merge_s_buffer_load_x4
23tracksRegLiveness: true
24body:             |
25  bb.0:
26    liveins: $sgpr0_sgpr1_sgpr2_sgpr3
27
28    %0:sgpr_128 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
29    %1:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 0, 0 :: (dereferenceable invariant load (s32))
30    %2:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 4, 0 :: (dereferenceable invariant load (s32))
31    %3:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 8, 0 :: (dereferenceable invariant load (s32))
32    %4:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 12, 0 :: (dereferenceable invariant load (s32))
33
34    S_ENDPGM 0
35...
36---
37
38# CHECK-LABEL: name: merge_s_buffer_load_x8
39# CHECK: S_BUFFER_LOAD_DWORDX8_IMM %0, 0, 0 :: (dereferenceable invariant load (s256), align 4)
40name: merge_s_buffer_load_x8
41tracksRegLiveness: true
42body:             |
43  bb.0:
44    liveins: $sgpr0_sgpr1_sgpr2_sgpr3
45
46    %0:sgpr_128 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
47    %1:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 0, 0 :: (dereferenceable invariant load (s32))
48    %2:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 4, 0 :: (dereferenceable invariant load (s32))
49    %3:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 8, 0 :: (dereferenceable invariant load (s32))
50    %4:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 12, 0 :: (dereferenceable invariant load (s32))
51    %5:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 16, 0 :: (dereferenceable invariant load (s32))
52    %6:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 20, 0 :: (dereferenceable invariant load (s32))
53    %7:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 24, 0 :: (dereferenceable invariant load (s32))
54    %8:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 28, 0 :: (dereferenceable invariant load (s32))
55
56    S_ENDPGM 0
57...
58---
59
60# CHECK-LABEL: name: merge_s_buffer_load_x8_reordered
61# CHECK: S_BUFFER_LOAD_DWORDX8_IMM %0, 0, 0 :: (dereferenceable invariant load (s256), align 4)
62name: merge_s_buffer_load_x8_reordered
63tracksRegLiveness: true
64body:             |
65  bb.0:
66    liveins: $sgpr0_sgpr1_sgpr2_sgpr3
67
68    %0:sgpr_128 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
69    %1:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 20, 0 :: (dereferenceable invariant load (s32))
70    %2:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 4, 0 :: (dereferenceable invariant load (s32))
71    %3:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 0, 0 :: (dereferenceable invariant load (s32))
72    %4:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 28, 0 :: (dereferenceable invariant load (s32))
73    %5:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 12, 0 :: (dereferenceable invariant load (s32))
74    %6:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 16, 0 :: (dereferenceable invariant load (s32))
75    %7:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 8, 0 :: (dereferenceable invariant load (s32))
76    %8:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 24, 0 :: (dereferenceable invariant load (s32))
77
78    S_ENDPGM 0
79...
80---
81
82# CHECK-LABEL: name: merge_s_buffer_load_x8_out_of_x2
83# CHECK: S_BUFFER_LOAD_DWORDX8_IMM %0, 0, 0 :: (dereferenceable invariant load (s256), align 8)
84name: merge_s_buffer_load_x8_out_of_x2
85tracksRegLiveness: true
86body:             |
87  bb.0:
88    liveins: $sgpr0_sgpr1_sgpr2_sgpr3
89
90    %0:sgpr_128 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
91    %1:sgpr_64 = S_BUFFER_LOAD_DWORDX2_IMM %0:sgpr_128, 16, 0 :: (dereferenceable invariant load (s64))
92    %2:sgpr_64 = S_BUFFER_LOAD_DWORDX2_IMM %0:sgpr_128, 8, 0 :: (dereferenceable invariant load (s64))
93    %3:sgpr_64 = S_BUFFER_LOAD_DWORDX2_IMM %0:sgpr_128, 0, 0 :: (dereferenceable invariant load (s64))
94    %4:sgpr_64 = S_BUFFER_LOAD_DWORDX2_IMM %0:sgpr_128, 24, 0 :: (dereferenceable invariant load (s64))
95
96    S_ENDPGM 0
97...
98---
99
100# CHECK-LABEL: name: merge_s_buffer_load_x8_out_of_x4
101# CHECK: S_BUFFER_LOAD_DWORDX8_IMM %0, 0, 0 :: (dereferenceable invariant load (s256), align 16)
102name: merge_s_buffer_load_x8_out_of_x4
103tracksRegLiveness: true
104body:             |
105  bb.0:
106    liveins: $sgpr0_sgpr1_sgpr2_sgpr3
107
108    %0:sgpr_128 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
109    %1:sgpr_128 = S_BUFFER_LOAD_DWORDX4_IMM %0:sgpr_128, 0, 0 :: (dereferenceable invariant load (s128))
110    %2:sgpr_128 = S_BUFFER_LOAD_DWORDX4_IMM %0:sgpr_128, 16, 0 :: (dereferenceable invariant load (s128))
111
112    S_ENDPGM 0
113...
114---
115
116
117# CHECK-LABEL: name: merge_s_buffer_load_x8_mixed
118# CHECK: S_BUFFER_LOAD_DWORDX8_IMM %0, 0, 0 :: (dereferenceable invariant load (s256), align 16)
119name: merge_s_buffer_load_x8_mixed
120tracksRegLiveness: true
121body:             |
122  bb.0:
123    liveins: $sgpr0_sgpr1_sgpr2_sgpr3
124
125    %0:sgpr_128 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
126    %1:sgpr_128 = S_BUFFER_LOAD_DWORDX4_IMM %0:sgpr_128, 0, 0 :: (dereferenceable invariant load (s128))
127    %2:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 16, 0 :: (dereferenceable invariant load (s32))
128    %3:sgpr_64 = S_BUFFER_LOAD_DWORDX2_IMM %0:sgpr_128, 24, 0 :: (dereferenceable invariant load (s64))
129    %4:sreg_32_xm0_xexec = S_BUFFER_LOAD_DWORD_IMM %0:sgpr_128, 20, 0 :: (dereferenceable invariant load (s32))
130
131    S_ENDPGM 0
132...
133---
134