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