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