Skip to content

Commit 0ed6038

Browse files
arsenmnikic
authored andcommitted
GlobalISel: Restrict narrow scalar for fptoui/fptosi results
This practically only works for the f16 case AMDGPU uses, not wider types. Fixes bug 49710 by failing legalization.
1 parent ea6bb26 commit 0ed6038

File tree

3 files changed

+57
-16
lines changed

3 files changed

+57
-16
lines changed

llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h

+1
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ class LegalizerHelper {
316316

317317
LegalizeResult narrowScalarShift(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
318318
LegalizeResult narrowScalarMul(MachineInstr &MI, LLT Ty);
319+
LegalizeResult narrowScalarFPTOI(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
319320
LegalizeResult narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
320321
LegalizeResult narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
321322

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

+28-16
Original file line numberDiff line numberDiff line change
@@ -1257,22 +1257,9 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
12571257
Observer.changedInstr(MI);
12581258
return Legalized;
12591259
}
1260-
case TargetOpcode::G_FPTOUI: {
1261-
if (TypeIdx != 0)
1262-
return UnableToLegalize;
1263-
Observer.changingInstr(MI);
1264-
narrowScalarDst(MI, NarrowTy, 0, TargetOpcode::G_ZEXT);
1265-
Observer.changedInstr(MI);
1266-
return Legalized;
1267-
}
1268-
case TargetOpcode::G_FPTOSI: {
1269-
if (TypeIdx != 0)
1270-
return UnableToLegalize;
1271-
Observer.changingInstr(MI);
1272-
narrowScalarDst(MI, NarrowTy, 0, TargetOpcode::G_SEXT);
1273-
Observer.changedInstr(MI);
1274-
return Legalized;
1275-
}
1260+
case TargetOpcode::G_FPTOUI:
1261+
case TargetOpcode::G_FPTOSI:
1262+
return narrowScalarFPTOI(MI, TypeIdx, NarrowTy);
12761263
case TargetOpcode::G_FPEXT:
12771264
if (TypeIdx != 0)
12781265
return UnableToLegalize;
@@ -4496,6 +4483,31 @@ LegalizerHelper::narrowScalarMul(MachineInstr &MI, LLT NarrowTy) {
44964483
return Legalized;
44974484
}
44984485

4486+
LegalizerHelper::LegalizeResult
4487+
LegalizerHelper::narrowScalarFPTOI(MachineInstr &MI, unsigned TypeIdx,
4488+
LLT NarrowTy) {
4489+
if (TypeIdx != 0)
4490+
return UnableToLegalize;
4491+
4492+
bool IsSigned = MI.getOpcode() == TargetOpcode::G_FPTOSI;
4493+
4494+
Register Src = MI.getOperand(1).getReg();
4495+
LLT SrcTy = MRI.getType(Src);
4496+
4497+
// If all finite floats fit into the narrowed integer type, we can just swap
4498+
// out the result type. This is practically only useful for conversions from
4499+
// half to at least 16-bits, so just handle the one case.
4500+
if (SrcTy.getScalarType() != LLT::scalar(16) ||
4501+
NarrowTy.getScalarSizeInBits() < (IsSigned ? 17 : 16))
4502+
return UnableToLegalize;
4503+
4504+
Observer.changingInstr(MI);
4505+
narrowScalarDst(MI, NarrowTy, 0,
4506+
IsSigned ? TargetOpcode::G_SEXT : TargetOpcode::G_ZEXT);
4507+
Observer.changedInstr(MI);
4508+
return Legalized;
4509+
}
4510+
44994511
LegalizerHelper::LegalizeResult
45004512
LegalizerHelper::narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx,
45014513
LLT NarrowTy) {

llvm/test/CodeGen/AArch64/GlobalISel/legalize-fptoi.mir

+28
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,31 @@ body: |
265265
%1:_(<4 x s32>) = G_FPTOSI %0
266266
$q0 = COPY %1
267267
...
268+
269+
---
270+
name: test_fptoui_s128_s32
271+
body: |
272+
bb.0:
273+
liveins: $w0
274+
; CHECK-LABEL: name: test_fptoui_s128_s32
275+
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
276+
; CHECK: [[FPTOUI:%[0-9]+]]:_(s128) = G_FPTOUI [[COPY]](s32)
277+
; CHECK: $q0 = COPY [[FPTOUI]](s128)
278+
%0:_(s32) = COPY $w0
279+
%1:_(s128) = G_FPTOUI %0
280+
$q0 = COPY %1
281+
...
282+
283+
---
284+
name: test_fptosi_s128_s32
285+
body: |
286+
bb.0:
287+
liveins: $w0
288+
; CHECK-LABEL: name: test_fptosi_s128_s32
289+
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
290+
; CHECK: [[FPTOSI:%[0-9]+]]:_(s128) = G_FPTOSI [[COPY]](s32)
291+
; CHECK: $q0 = COPY [[FPTOSI]](s128)
292+
%0:_(s32) = COPY $w0
293+
%1:_(s128) = G_FPTOSI %0
294+
$q0 = COPY %1
295+
...

0 commit comments

Comments
 (0)