[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / regcoalescer-resolve-lane-conflict-by-subranges.mir
blob4167f5f6a8f61900fefc5a8834bb44070ecfd502
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -march=amdgcn -run-pass simple-register-coalescing -verify-machineinstrs -o - %s | FileCheck --check-prefix=GCN %s
6 ---
7 # the COPY can be coalesced based on subregister liveness
8 name:            subrange_coalesce_liveout
9 tracksRegLiveness: true
10 body:             |
11   ; GCN-LABEL: name: subrange_coalesce_liveout
12   ; GCN: bb.0:
13   ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
14   ; GCN:   liveins: $vgpr0_vgpr1
15   ; GCN:   [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
16   ; GCN:   [[GLOBAL_LOAD_DWORDX4_:%[0-9]+]]:vreg_128 = GLOBAL_LOAD_DWORDX4 [[COPY]], 0, 0, implicit $exec
17   ; GCN:   S_CBRANCH_EXECZ %bb.2, implicit $exec
18   ; GCN:   S_BRANCH %bb.1
19   ; GCN: bb.1:
20   ; GCN:   successors: %bb.2(0x80000000)
21   ; GCN:   [[GLOBAL_LOAD_DWORDX4_]].sub0:vreg_128 = V_AND_B32_e64 [[GLOBAL_LOAD_DWORDX4_]].sub0, [[GLOBAL_LOAD_DWORDX4_]].sub1, implicit $exec
22   ; GCN:   S_BRANCH %bb.2
23   ; GCN: bb.2:
24   ; GCN:   dead %3:vgpr_32 = V_ADD_U32_e32 [[GLOBAL_LOAD_DWORDX4_]].sub2, [[GLOBAL_LOAD_DWORDX4_]].sub0, implicit $exec
25   ; GCN:   S_ENDPGM 0
26   bb.0:
27     successors: %bb.1, %bb.2
28     liveins: $vgpr0_vgpr1
30     %0:vreg_64 = COPY $vgpr0_vgpr1
31     %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
32     %2:vgpr_32 = COPY %1.sub0
33     S_CBRANCH_EXECZ %bb.2, implicit $exec
34     S_BRANCH %bb.1
36   bb.1:
37     successors: %bb.2
39     %2:vgpr_32 = V_AND_B32_e64 %1.sub0, %1.sub1, implicit $exec
40     S_BRANCH %bb.2
42   bb.2:
43     %4:vgpr_32 = V_ADD_U32_e32 %1.sub2, %2, implicit $exec
44     S_ENDPGM 0
45 ...
47 ---
48 # early-clobber stops the coalescer from coalescing the COPY
49 name:            subrange_coalesce_early_clobber
50 tracksRegLiveness: true
51 body:             |
52   ; GCN-LABEL: name: subrange_coalesce_early_clobber
53   ; GCN: bb.0:
54   ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
55   ; GCN:   liveins: $vgpr0_vgpr1
56   ; GCN:   [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
57   ; GCN:   [[GLOBAL_LOAD_DWORDX4_:%[0-9]+]]:vreg_128 = GLOBAL_LOAD_DWORDX4 [[COPY]], 0, 0, implicit $exec
58   ; GCN:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[GLOBAL_LOAD_DWORDX4_]].sub0
59   ; GCN:   S_CBRANCH_EXECZ %bb.2, implicit $exec
60   ; GCN:   S_BRANCH %bb.1
61   ; GCN: bb.1:
62   ; GCN:   successors: %bb.2(0x80000000)
63   ; GCN:   early-clobber [[COPY1]]:vgpr_32 = V_AND_B32_e64 [[GLOBAL_LOAD_DWORDX4_]].sub0, [[GLOBAL_LOAD_DWORDX4_]].sub2, implicit $exec
64   ; GCN:   S_BRANCH %bb.2
65   ; GCN: bb.2:
66   ; GCN:   dead %3:vgpr_32 = V_ADD_U32_e32 [[GLOBAL_LOAD_DWORDX4_]].sub2, [[COPY1]], implicit $exec
67   ; GCN:   S_ENDPGM 0
68   bb.0:
69     successors: %bb.1, %bb.2
70     liveins: $vgpr0_vgpr1
72     %0:vreg_64 = COPY $vgpr0_vgpr1
73     %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
74     %2:vgpr_32 = COPY %1.sub0
75     S_CBRANCH_EXECZ %bb.2, implicit $exec
76     S_BRANCH %bb.1
78   bb.1:
79     successors: %bb.2
81     early-clobber %2:vgpr_32 = V_AND_B32_e64 %1.sub0, %1.sub2, implicit $exec
82     S_BRANCH %bb.2
84   bb.2:
85     %4:vgpr_32 = V_ADD_U32_e32 %1.sub2, %2, implicit $exec
86     S_ENDPGM 0
87 ...
89 ---
90 # non-conflict lane(sub1) was redefined, coalescable
91 name:            subrange_coalesce_unrelated_sub_redefined
92 tracksRegLiveness: true
93 body:             |
94   ; GCN-LABEL: name: subrange_coalesce_unrelated_sub_redefined
95   ; GCN: bb.0:
96   ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
97   ; GCN:   liveins: $vgpr0_vgpr1
98   ; GCN:   [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
99   ; GCN:   [[GLOBAL_LOAD_DWORDX4_:%[0-9]+]]:vreg_128 = GLOBAL_LOAD_DWORDX4 [[COPY]], 0, 0, implicit $exec
100   ; GCN:   S_CBRANCH_EXECZ %bb.2, implicit $exec
101   ; GCN:   S_BRANCH %bb.1
102   ; GCN: bb.1:
103   ; GCN:   successors: %bb.2(0x80000000)
104   ; GCN:   [[GLOBAL_LOAD_DWORDX4_]].sub0:vreg_128 = V_AND_B32_e64 [[GLOBAL_LOAD_DWORDX4_]].sub0, [[GLOBAL_LOAD_DWORDX4_]].sub1, implicit $exec
105   ; GCN:   [[GLOBAL_LOAD_DWORDX4_]].sub1:vreg_128 = V_AND_B32_e64 [[GLOBAL_LOAD_DWORDX4_]].sub0, [[GLOBAL_LOAD_DWORDX4_]].sub0, implicit $exec
106   ; GCN:   S_BRANCH %bb.2
107   ; GCN: bb.2:
108   ; GCN:   dead %3:vgpr_32 = V_ADD_U32_e32 [[GLOBAL_LOAD_DWORDX4_]].sub1, [[GLOBAL_LOAD_DWORDX4_]].sub0, implicit $exec
109   ; GCN:   S_ENDPGM 0
110   bb.0:
111     successors: %bb.1, %bb.2
112     liveins: $vgpr0_vgpr1
114     %0:vreg_64 = COPY $vgpr0_vgpr1
115     %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
116     %2:vgpr_32 = COPY %1.sub0
117     S_CBRANCH_EXECZ %bb.2, implicit $exec
118     S_BRANCH %bb.1
120   bb.1:
121     successors: %bb.2
123     %2:vgpr_32 = V_AND_B32_e64 %1.sub0, %1.sub1, implicit $exec
124     ; %1.sub1 was re-defined
125     %1.sub1:vreg_128 = V_AND_B32_e64 %2, %2, implicit $exec
126     S_BRANCH %bb.2
128   bb.2:
129     %4:vgpr_32 = V_ADD_U32_e32 %1.sub1, %2, implicit $exec
130     S_ENDPGM 0
134 # Another complex example showing the capability of resolving lane conflict
135 # based on subranges.
136 name:            subrange_coalesce_complex_pattern
137 tracksRegLiveness: true
138 body:             |
139   ; GCN-LABEL: name: subrange_coalesce_complex_pattern
140   ; GCN: bb.0:
141   ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
142   ; GCN:   liveins: $vgpr0_vgpr1
143   ; GCN:   [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
144   ; GCN:   [[GLOBAL_LOAD_DWORDX4_:%[0-9]+]]:vreg_128 = GLOBAL_LOAD_DWORDX4 [[COPY]], 0, 0, implicit $exec
145   ; GCN:   S_CBRANCH_EXECZ %bb.2, implicit $exec
146   ; GCN:   S_BRANCH %bb.1
147   ; GCN: bb.1:
148   ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
149   ; GCN:   [[GLOBAL_LOAD_DWORDX4_]].sub0:vreg_128 = V_AND_B32_e64 [[GLOBAL_LOAD_DWORDX4_]].sub1, [[GLOBAL_LOAD_DWORDX4_]].sub0, implicit $exec
150   ; GCN:   [[GLOBAL_LOAD_DWORDX4_]].sub2:vreg_128 = V_AND_B32_e64 [[GLOBAL_LOAD_DWORDX4_]].sub0, [[GLOBAL_LOAD_DWORDX4_]].sub0, implicit $exec
151   ; GCN:   S_CBRANCH_EXECZ %bb.1, implicit $exec
152   ; GCN:   S_BRANCH %bb.2
153   ; GCN: bb.2:
154   ; GCN:   dead %3:vgpr_32 = V_ADD_U32_e32 [[GLOBAL_LOAD_DWORDX4_]].sub1, [[GLOBAL_LOAD_DWORDX4_]].sub2, implicit $exec
155   ; GCN:   S_ENDPGM 0
156   bb.0:
157     successors: %bb.1, %bb.2
158     liveins: $vgpr0_vgpr1
160     %0:vreg_64 = COPY $vgpr0_vgpr1
161     %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
162     %2:vgpr_32 = COPY %1.sub0
163     S_CBRANCH_EXECZ %bb.2, implicit $exec
164     S_BRANCH %bb.1
166   bb.1:
167     successors: %bb.1, %bb.2
169     %2:vgpr_32 = V_AND_B32_e64 %1.sub1, %2, implicit $exec
170     %1.sub2:vreg_128 = V_AND_B32_e64 %2, %2, implicit $exec
171     S_CBRANCH_EXECZ %bb.1, implicit $exec
172     S_BRANCH %bb.2
174   bb.2:
175     %4:vgpr_32 = V_ADD_U32_e32 %1.sub1, %1.sub2, implicit $exec
176     S_ENDPGM 0