1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2; RUN: llc -O0 -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=gfx900 -mattr=-flat-for-global -verify-machineinstrs -stop-after=regallocfast < %s | FileCheck -check-prefixes=GCN %s 3 4; Verify that we consider the xor at the end of the waterfall loop emitted for 5; divergent indirect addressing as a terminator. 6 7declare i32 @llvm.amdgcn.workitem.id.x() #1 8 9; There should be no spill code inserted between the xor and the real terminator 10define amdgpu_kernel void @extract_w_offset_vgpr(i32 addrspace(1)* %out) { 11 ; GCN-LABEL: name: extract_w_offset_vgpr 12 ; GCN: bb.0.entry: 13 ; GCN: successors: %bb.1(0x80000000) 14 ; GCN: liveins: $vgpr0, $sgpr0_sgpr1 15 ; GCN: SI_SPILL_V32_SAVE killed $vgpr0, %stack.3, $sgpr32, 0, implicit $exec :: (store 4 into %stack.3, addrspace 5) 16 ; GCN: renamable $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM killed renamable $sgpr0_sgpr1, 36, 0, 0 :: (dereferenceable invariant load 8 from %ir.out.kernarg.offset.cast, align 4, addrspace 4) 17 ; GCN: renamable $sgpr6 = COPY renamable $sgpr1 18 ; GCN: renamable $sgpr0 = COPY renamable $sgpr0, implicit killed $sgpr0_sgpr1 19 ; GCN: renamable $sgpr4 = S_MOV_B32 61440 20 ; GCN: renamable $sgpr5 = S_MOV_B32 -1 21 ; GCN: undef renamable $sgpr0 = COPY killed renamable $sgpr0, implicit-def $sgpr0_sgpr1_sgpr2_sgpr3 22 ; GCN: renamable $sgpr1 = COPY killed renamable $sgpr6 23 ; GCN: renamable $sgpr2 = COPY killed renamable $sgpr5 24 ; GCN: renamable $sgpr3 = COPY killed renamable $sgpr4 25 ; GCN: SI_SPILL_S128_SAVE killed $sgpr0_sgpr1_sgpr2_sgpr3, %stack.2, implicit $exec, implicit $sgpr32 :: (store 16 into %stack.2, align 4, addrspace 5) 26 ; GCN: renamable $sgpr0 = S_MOV_B32 16 27 ; GCN: renamable $sgpr1 = S_MOV_B32 15 28 ; GCN: renamable $sgpr2 = S_MOV_B32 14 29 ; GCN: renamable $sgpr3 = S_MOV_B32 13 30 ; GCN: renamable $sgpr4 = S_MOV_B32 12 31 ; GCN: renamable $sgpr5 = S_MOV_B32 11 32 ; GCN: renamable $sgpr6 = S_MOV_B32 10 33 ; GCN: renamable $sgpr7 = S_MOV_B32 9 34 ; GCN: renamable $sgpr8 = S_MOV_B32 8 35 ; GCN: renamable $sgpr9 = S_MOV_B32 7 36 ; GCN: renamable $sgpr10 = S_MOV_B32 6 37 ; GCN: renamable $sgpr11 = S_MOV_B32 5 38 ; GCN: renamable $sgpr12 = S_MOV_B32 3 39 ; GCN: renamable $sgpr13 = S_MOV_B32 2 40 ; GCN: renamable $sgpr14 = S_MOV_B32 1 41 ; GCN: renamable $sgpr15 = S_MOV_B32 0 42 ; GCN: renamable $vgpr0 = COPY killed renamable $sgpr15 43 ; GCN: renamable $vgpr30 = COPY killed renamable $sgpr14 44 ; GCN: renamable $vgpr29 = COPY killed renamable $sgpr13 45 ; GCN: renamable $vgpr28 = COPY killed renamable $sgpr12 46 ; GCN: renamable $vgpr27 = COPY killed renamable $sgpr11 47 ; GCN: renamable $vgpr26 = COPY killed renamable $sgpr10 48 ; GCN: renamable $vgpr25 = COPY killed renamable $sgpr9 49 ; GCN: renamable $vgpr24 = COPY killed renamable $sgpr8 50 ; GCN: renamable $vgpr23 = COPY killed renamable $sgpr7 51 ; GCN: renamable $vgpr22 = COPY killed renamable $sgpr6 52 ; GCN: renamable $vgpr21 = COPY killed renamable $sgpr5 53 ; GCN: renamable $vgpr20 = COPY killed renamable $sgpr4 54 ; GCN: renamable $vgpr19 = COPY killed renamable $sgpr3 55 ; GCN: renamable $vgpr18 = COPY killed renamable $sgpr2 56 ; GCN: renamable $vgpr17 = COPY killed renamable $sgpr1 57 ; GCN: renamable $vgpr16 = COPY killed renamable $sgpr0 58 ; GCN: undef renamable $vgpr0 = COPY killed renamable $vgpr0, implicit-def $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15 59 ; GCN: renamable $vgpr1 = COPY killed renamable $vgpr30 60 ; GCN: renamable $vgpr2 = COPY killed renamable $vgpr29 61 ; GCN: renamable $vgpr3 = COPY killed renamable $vgpr28 62 ; GCN: renamable $vgpr4 = COPY killed renamable $vgpr27 63 ; GCN: renamable $vgpr5 = COPY killed renamable $vgpr26 64 ; GCN: renamable $vgpr6 = COPY killed renamable $vgpr25 65 ; GCN: renamable $vgpr7 = COPY killed renamable $vgpr24 66 ; GCN: renamable $vgpr8 = COPY killed renamable $vgpr23 67 ; GCN: renamable $vgpr9 = COPY killed renamable $vgpr22 68 ; GCN: renamable $vgpr10 = COPY killed renamable $vgpr21 69 ; GCN: renamable $vgpr11 = COPY killed renamable $vgpr20 70 ; GCN: renamable $vgpr12 = COPY killed renamable $vgpr19 71 ; GCN: renamable $vgpr13 = COPY killed renamable $vgpr18 72 ; GCN: renamable $vgpr14 = COPY killed renamable $vgpr17 73 ; GCN: renamable $vgpr15 = COPY killed renamable $vgpr16 74 ; GCN: SI_SPILL_V512_SAVE killed $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15, %stack.1, $sgpr32, 0, implicit $exec :: (store 64 into %stack.1, align 4, addrspace 5) 75 ; GCN: renamable $sgpr0_sgpr1 = S_MOV_B64 $exec 76 ; GCN: SI_SPILL_S64_SAVE killed $sgpr0_sgpr1, %stack.0, implicit $exec, implicit $sgpr32 :: (store 8 into %stack.0, align 4, addrspace 5) 77 ; GCN: renamable $vgpr0 = IMPLICIT_DEF 78 ; GCN: renamable $sgpr0_sgpr1 = IMPLICIT_DEF 79 ; GCN: bb.1: 80 ; GCN: successors: %bb.1(0x40000000), %bb.3(0x40000000) 81 ; GCN: $sgpr0_sgpr1 = SI_SPILL_S64_RESTORE %stack.4, implicit $exec, implicit $sgpr32 :: (load 8 from %stack.4, align 4, addrspace 5) 82 ; GCN: $vgpr17 = SI_SPILL_V32_RESTORE %stack.5, $sgpr32, 0, implicit $exec :: (load 4 from %stack.5, addrspace 5) 83 ; GCN: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15 = SI_SPILL_V512_RESTORE %stack.1, $sgpr32, 0, implicit $exec :: (load 64 from %stack.1, align 4, addrspace 5) 84 ; GCN: $vgpr16 = SI_SPILL_V32_RESTORE %stack.3, $sgpr32, 0, implicit $exec :: (load 4 from %stack.3, addrspace 5) 85 ; GCN: renamable $sgpr2 = V_READFIRSTLANE_B32 $vgpr16, implicit $exec 86 ; GCN: renamable $sgpr0_sgpr1 = V_CMP_EQ_U32_e64 $sgpr2, $vgpr16, implicit $exec 87 ; GCN: renamable $sgpr0_sgpr1 = S_AND_SAVEEXEC_B64 killed renamable $sgpr0_sgpr1, implicit-def $exec, implicit-def dead $scc, implicit $exec 88 ; GCN: renamable $vgpr0 = V_INDIRECT_REG_READ_GPR_IDX_B32_V16 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15, killed $sgpr2, 11, implicit-def $m0, implicit $m0, implicit $exec 89 ; GCN: SI_SPILL_V32_SAVE $vgpr0, %stack.6, $sgpr32, 0, implicit $exec :: (store 4 into %stack.6, addrspace 5) 90 ; GCN: SI_SPILL_V32_SAVE killed $vgpr0, %stack.5, $sgpr32, 0, implicit $exec :: (store 4 into %stack.5, addrspace 5) 91 ; GCN: renamable $sgpr2_sgpr3 = COPY renamable $sgpr0_sgpr1 92 ; GCN: SI_SPILL_S64_SAVE killed $sgpr2_sgpr3, %stack.4, implicit $exec, implicit $sgpr32 :: (store 8 into %stack.4, align 4, addrspace 5) 93 ; GCN: $exec = S_XOR_B64_term $exec, killed renamable $sgpr0_sgpr1, implicit-def dead $scc 94 ; GCN: S_CBRANCH_EXECNZ %bb.1, implicit $exec 95 ; GCN: bb.3: 96 ; GCN: successors: %bb.2(0x80000000) 97 ; GCN: $sgpr0_sgpr1 = SI_SPILL_S64_RESTORE %stack.0, implicit $exec, implicit $sgpr32 :: (load 8 from %stack.0, align 4, addrspace 5) 98 ; GCN: $exec = S_MOV_B64 renamable $sgpr0_sgpr1 99 ; GCN: bb.2: 100 ; GCN: $vgpr0 = SI_SPILL_V32_RESTORE %stack.6, $sgpr32, 0, implicit $exec :: (load 4 from %stack.6, addrspace 5) 101 ; GCN: $sgpr0_sgpr1_sgpr2_sgpr3 = SI_SPILL_S128_RESTORE %stack.2, implicit $exec, implicit $sgpr32 :: (load 16 from %stack.2, align 4, addrspace 5) 102 ; GCN: BUFFER_STORE_DWORD_OFFSET killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (store 4 into %ir.out.load, addrspace 1) 103 ; GCN: S_ENDPGM 0 104entry: 105 %id = call i32 @llvm.amdgcn.workitem.id.x() #1 106 %index = add i32 %id, 1 107 %value = extractelement <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16>, i32 %index 108 store i32 %value, i32 addrspace(1)* %out 109 ret void 110} 111