Skip to content

Commit 7ac79ed

Browse files
committed
AMDGPU: Legalize more bitcasts
llvm-svn: 351700
1 parent a519582 commit 7ac79ed

File tree

2 files changed

+176
-10
lines changed

2 files changed

+176
-10
lines changed

llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
using namespace llvm;
2424
using namespace LegalizeActions;
25+
using namespace LegalityPredicates;
2526

2627
AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST,
2728
const GCNTargetMachine &TM) {
@@ -103,11 +104,12 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST,
103104
G_UADDE, G_SADDE, G_USUBE, G_SSUBE})
104105
.legalFor({{S32, S1}});
105106

106-
setAction({G_BITCAST, V2S16}, Legal);
107-
setAction({G_BITCAST, 1, S32}, Legal);
108-
109-
setAction({G_BITCAST, S32}, Legal);
110-
setAction({G_BITCAST, 1, V2S16}, Legal);
107+
getActionDefinitionsBuilder(G_BITCAST)
108+
.legalForCartesianProduct({S32, V2S16})
109+
.legalForCartesianProduct({S64, V2S32, V4S16})
110+
.legalForCartesianProduct({V2S64, V4S32})
111+
// Don't worry about the size constraint.
112+
.legalIf(all(isPointer(0), isPointer(1)));
111113

112114
getActionDefinitionsBuilder(G_FCONSTANT)
113115
.legalFor({S32, S64, S16});

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-bitcast.mir

Lines changed: 169 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,181 @@
22
# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji -run-pass=legalizer %s -o - | FileCheck %s
33

44
---
5-
name: test_bitcast
5+
name: test_bitcast_s32_to_v2s16
66
body: |
77
bb.0:
88
liveins: $vgpr0
99
10-
; CHECK-LABEL: name: test_bitcast
10+
; CHECK-LABEL: name: test_bitcast_s32_to_v2s16
1111
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
1212
; CHECK: [[BITCAST:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[COPY]](s32)
13-
; CHECK: [[BITCAST1:%[0-9]+]]:_(s32) = G_BITCAST [[BITCAST]](<2 x s16>)
13+
; CHECK: $vgpr0 = COPY [[BITCAST]](<2 x s16>)
1414
%0:_(s32) = COPY $vgpr0
1515
%1:_(<2 x s16>) = G_BITCAST %0
16-
%2:_(s32) = G_BITCAST %1
17-
$vgpr0 = COPY %2
16+
$vgpr0 = COPY %1
17+
...
18+
19+
---
20+
name: test_bitcast_v2s16_to_s32
21+
body: |
22+
bb.0:
23+
liveins: $vgpr0
24+
25+
; CHECK-LABEL: name: test_bitcast_v2s16_to_s32
26+
; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
27+
; CHECK: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
28+
; CHECK: $vgpr0 = COPY [[BITCAST]](s32)
29+
%0:_(<2 x s16>) = COPY $vgpr0
30+
%1:_(s32) = G_BITCAST %0
31+
$vgpr0 = COPY %1
32+
...
33+
34+
---
35+
name: test_bitcast_v2s32_to_s64
36+
body: |
37+
bb.0:
38+
liveins: $vgpr0_vgpr1
39+
40+
; CHECK-LABEL: name: test_bitcast_v2s32_to_s64
41+
; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1
42+
; CHECK: [[BITCAST:%[0-9]+]]:_(s64) = G_BITCAST [[COPY]](<2 x s32>)
43+
; CHECK: $vgpr0_vgpr1 = COPY [[BITCAST]](s64)
44+
%0:_(<2 x s32>) = COPY $vgpr0_vgpr1
45+
%1:_(s64) = G_BITCAST %0
46+
$vgpr0_vgpr1 = COPY %1
47+
...
48+
49+
---
50+
name: test_bitcast_s64_to_v2s32
51+
body: |
52+
bb.0:
53+
liveins: $vgpr0_vgpr1
54+
55+
; CHECK-LABEL: name: test_bitcast_s64_to_v2s32
56+
; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
57+
; CHECK: [[BITCAST:%[0-9]+]]:_(<2 x s32>) = G_BITCAST [[COPY]](s64)
58+
; CHECK: $vgpr0_vgpr1 = COPY [[BITCAST]](<2 x s32>)
59+
%0:_(s64) = COPY $vgpr0_vgpr1
60+
%1:_(<2 x s32>) = G_BITCAST %0
61+
$vgpr0_vgpr1 = COPY %1
62+
...
63+
64+
---
65+
name: test_bitcast_v2s64_to_v4s32
66+
body: |
67+
bb.0:
68+
liveins: $vgpr0_vgpr1_vgpr2_vgpr3
69+
70+
; CHECK-LABEL: name: test_bitcast_v2s64_to_v4s32
71+
; CHECK: [[COPY:%[0-9]+]]:_(<2 x s64>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
72+
; CHECK: [[BITCAST:%[0-9]+]]:_(<4 x s32>) = G_BITCAST [[COPY]](<2 x s64>)
73+
; CHECK: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[BITCAST]](<4 x s32>)
74+
%0:_(<2 x s64>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
75+
%1:_(<4 x s32>) = G_BITCAST %0
76+
$vgpr0_vgpr1_vgpr2_vgpr3 = COPY %1
77+
...
78+
79+
---
80+
name: test_bitcast_v4s32_to_v2s64
81+
body: |
82+
bb.0:
83+
liveins: $vgpr0_vgpr1_vgpr2_vgpr3
84+
85+
; CHECK-LABEL: name: test_bitcast_v4s32_to_v2s64
86+
; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
87+
; CHECK: [[BITCAST:%[0-9]+]]:_(<2 x s64>) = G_BITCAST [[COPY]](<4 x s32>)
88+
; CHECK: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[BITCAST]](<2 x s64>)
89+
%0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
90+
%1:_(<2 x s64>) = G_BITCAST %0
91+
$vgpr0_vgpr1_vgpr2_vgpr3 = COPY %1
92+
...
93+
94+
---
95+
name: test_bitcast_v4s16_to_s64
96+
body: |
97+
bb.0:
98+
liveins: $vgpr0_vgpr1
99+
100+
; CHECK-LABEL: name: test_bitcast_v4s16_to_s64
101+
; CHECK: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1
102+
; CHECK: [[BITCAST:%[0-9]+]]:_(s64) = G_BITCAST [[COPY]](<4 x s16>)
103+
; CHECK: $vgpr0_vgpr1 = COPY [[BITCAST]](s64)
104+
%0:_(<4 x s16>) = COPY $vgpr0_vgpr1
105+
%1:_(s64) = G_BITCAST %0
106+
$vgpr0_vgpr1 = COPY %1
107+
...
108+
109+
---
110+
name: test_bitcast_s64_to_v4s16
111+
body: |
112+
bb.0:
113+
liveins: $vgpr0_vgpr1
114+
115+
; CHECK-LABEL: name: test_bitcast_s64_to_v4s16
116+
; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
117+
; CHECK: [[BITCAST:%[0-9]+]]:_(<4 x s16>) = G_BITCAST [[COPY]](s64)
118+
; CHECK: $vgpr0_vgpr1 = COPY [[BITCAST]](<4 x s16>)
119+
%0:_(s64) = COPY $vgpr0_vgpr1
120+
%1:_(<4 x s16>) = G_BITCAST %0
121+
$vgpr0_vgpr1 = COPY %1
122+
...
123+
124+
---
125+
name: test_bitcast_p0_to_p1
126+
body: |
127+
bb.0:
128+
liveins: $vgpr0_vgpr1
129+
130+
; CHECK-LABEL: name: test_bitcast_p0_to_p1
131+
; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $vgpr0_vgpr1
132+
; CHECK: [[BITCAST:%[0-9]+]]:_(p1) = G_BITCAST [[COPY]](p0)
133+
; CHECK: $vgpr0_vgpr1 = COPY [[BITCAST]](p1)
134+
%0:_(p0) = COPY $vgpr0_vgpr1
135+
%1:_(p1) = G_BITCAST %0
136+
$vgpr0_vgpr1 = COPY %1
137+
...
138+
139+
---
140+
name: test_bitcast_p1_to_p0
141+
body: |
142+
bb.0:
143+
liveins: $vgpr0_vgpr1
144+
145+
; CHECK-LABEL: name: test_bitcast_p1_to_p0
146+
; CHECK: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
147+
; CHECK: [[BITCAST:%[0-9]+]]:_(p0) = G_BITCAST [[COPY]](p1)
148+
; CHECK: $vgpr0_vgpr1 = COPY [[BITCAST]](p0)
149+
%0:_(p1) = COPY $vgpr0_vgpr1
150+
%1:_(p0) = G_BITCAST %0
151+
$vgpr0_vgpr1 = COPY %1
152+
...
153+
154+
---
155+
name: test_bitcast_p999_to_p0
156+
body: |
157+
bb.0:
158+
liveins: $vgpr0_vgpr1
159+
160+
; CHECK-LABEL: name: test_bitcast_p999_to_p0
161+
; CHECK: [[COPY:%[0-9]+]]:_(p999) = COPY $vgpr0_vgpr1
162+
; CHECK: [[BITCAST:%[0-9]+]]:_(p0) = G_BITCAST [[COPY]](p999)
163+
; CHECK: $vgpr0_vgpr1 = COPY [[BITCAST]](p0)
164+
%0:_(p999) = COPY $vgpr0_vgpr1
165+
%1:_(p0) = G_BITCAST %0
166+
$vgpr0_vgpr1 = COPY %1
167+
...
168+
169+
---
170+
name: test_bitcast_p123_to_p999
171+
body: |
172+
bb.0:
173+
liveins: $vgpr0_vgpr1
174+
175+
; CHECK-LABEL: name: test_bitcast_p123_to_p999
176+
; CHECK: [[COPY:%[0-9]+]]:_(p123) = COPY $vgpr0_vgpr1
177+
; CHECK: [[BITCAST:%[0-9]+]]:_(p999) = G_BITCAST [[COPY]](p123)
178+
; CHECK: $vgpr0_vgpr1 = COPY [[BITCAST]](p999)
179+
%0:_(p123) = COPY $vgpr0_vgpr1
180+
%1:_(p999) = G_BITCAST %0
181+
$vgpr0_vgpr1 = COPY %1
18182
...

0 commit comments

Comments
 (0)