forked from OSchip/llvm-project
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.
This commit is contained in:
parent
8fbe04f46b
commit
83a25a1010
|
@ -330,6 +330,7 @@ public:
|
|||
LegalizeResult narrowScalarAddSub(MachineInstr &MI, unsigned TypeIdx,
|
||||
LLT NarrowTy);
|
||||
LegalizeResult narrowScalarMul(MachineInstr &MI, LLT Ty);
|
||||
LegalizeResult narrowScalarFPTOI(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
|
||||
LegalizeResult narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
|
||||
LegalizeResult narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
|
||||
|
||||
|
|
|
@ -1216,22 +1216,9 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
|
|||
Observer.changedInstr(MI);
|
||||
return Legalized;
|
||||
}
|
||||
case TargetOpcode::G_FPTOUI: {
|
||||
if (TypeIdx != 0)
|
||||
return UnableToLegalize;
|
||||
Observer.changingInstr(MI);
|
||||
narrowScalarDst(MI, NarrowTy, 0, TargetOpcode::G_ZEXT);
|
||||
Observer.changedInstr(MI);
|
||||
return Legalized;
|
||||
}
|
||||
case TargetOpcode::G_FPTOSI: {
|
||||
if (TypeIdx != 0)
|
||||
return UnableToLegalize;
|
||||
Observer.changingInstr(MI);
|
||||
narrowScalarDst(MI, NarrowTy, 0, TargetOpcode::G_SEXT);
|
||||
Observer.changedInstr(MI);
|
||||
return Legalized;
|
||||
}
|
||||
case TargetOpcode::G_FPTOUI:
|
||||
case TargetOpcode::G_FPTOSI:
|
||||
return narrowScalarFPTOI(MI, TypeIdx, NarrowTy);
|
||||
case TargetOpcode::G_FPEXT:
|
||||
if (TypeIdx != 0)
|
||||
return UnableToLegalize;
|
||||
|
@ -4846,6 +4833,31 @@ LegalizerHelper::narrowScalarMul(MachineInstr &MI, LLT NarrowTy) {
|
|||
return Legalized;
|
||||
}
|
||||
|
||||
LegalizerHelper::LegalizeResult
|
||||
LegalizerHelper::narrowScalarFPTOI(MachineInstr &MI, unsigned TypeIdx,
|
||||
LLT NarrowTy) {
|
||||
if (TypeIdx != 0)
|
||||
return UnableToLegalize;
|
||||
|
||||
bool IsSigned = MI.getOpcode() == TargetOpcode::G_FPTOSI;
|
||||
|
||||
Register Src = MI.getOperand(1).getReg();
|
||||
LLT SrcTy = MRI.getType(Src);
|
||||
|
||||
// If all finite floats fit into the narrowed integer type, we can just swap
|
||||
// out the result type. This is practically only useful for conversions from
|
||||
// half to at least 16-bits, so just handle the one case.
|
||||
if (SrcTy.getScalarType() != LLT::scalar(16) ||
|
||||
NarrowTy.getScalarSizeInBits() < (IsSigned ? 17 : 16))
|
||||
return UnableToLegalize;
|
||||
|
||||
Observer.changingInstr(MI);
|
||||
narrowScalarDst(MI, NarrowTy, 0,
|
||||
IsSigned ? TargetOpcode::G_SEXT : TargetOpcode::G_ZEXT);
|
||||
Observer.changedInstr(MI);
|
||||
return Legalized;
|
||||
}
|
||||
|
||||
LegalizerHelper::LegalizeResult
|
||||
LegalizerHelper::narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx,
|
||||
LLT NarrowTy) {
|
||||
|
|
|
@ -238,3 +238,31 @@ body: |
|
|||
%1:_(<4 x s32>) = G_FPTOSI %0
|
||||
$q0 = COPY %1
|
||||
...
|
||||
|
||||
---
|
||||
name: test_fptoui_s128_s32
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $w0
|
||||
; CHECK-LABEL: name: test_fptoui_s128_s32
|
||||
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
|
||||
; CHECK: [[FPTOUI:%[0-9]+]]:_(s128) = G_FPTOUI [[COPY]](s32)
|
||||
; CHECK: $q0 = COPY [[FPTOUI]](s128)
|
||||
%0:_(s32) = COPY $w0
|
||||
%1:_(s128) = G_FPTOUI %0
|
||||
$q0 = COPY %1
|
||||
...
|
||||
|
||||
---
|
||||
name: test_fptosi_s128_s32
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $w0
|
||||
; CHECK-LABEL: name: test_fptosi_s128_s32
|
||||
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
|
||||
; CHECK: [[FPTOSI:%[0-9]+]]:_(s128) = G_FPTOSI [[COPY]](s32)
|
||||
; CHECK: $q0 = COPY [[FPTOSI]](s128)
|
||||
%0:_(s32) = COPY $w0
|
||||
%1:_(s128) = G_FPTOSI %0
|
||||
$q0 = COPY %1
|
||||
...
|
||||
|
|
Loading…
Reference in New Issue