Skip to content

Commit ec102fc

Browse files
Move from a custom legalize function to lowering
1 parent 8b85744 commit ec102fc

File tree

2 files changed

+28
-36
lines changed

2 files changed

+28
-36
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8477,7 +8477,8 @@ LegalizerHelper::lowerFPTOINT_SAT(MachineInstr &MI) {
84778477
return Legalized;
84788478
}
84798479

8480-
// f64 -> f16 conversion using round-to-nearest-even rounding mode.
8480+
// f64 -> f16 conversion using round-to-nearest-even rounding mode for scalars
8481+
// and round-to-odd for vectors.
84818482
LegalizerHelper::LegalizeResult
84828483
LegalizerHelper::lowerFPTRUNC_F64_TO_F16(MachineInstr &MI) {
84838484
const LLT S1 = LLT::scalar(1);
@@ -8487,8 +8488,31 @@ LegalizerHelper::lowerFPTRUNC_F64_TO_F16(MachineInstr &MI) {
84878488
assert(MRI.getType(Dst).getScalarType() == LLT::scalar(16) &&
84888489
MRI.getType(Src).getScalarType() == LLT::scalar(64));
84898490

8490-
if (MRI.getType(Src).isVector()) // TODO: Handle vectors directly.
8491-
return UnableToLegalize;
8491+
if (MRI.getType(Src).isVector()) {
8492+
Register Dst = MI.getOperand(0).getReg();
8493+
Register Src = MI.getOperand(1).getReg();
8494+
LLT DstTy = MRI.getType(Dst);
8495+
LLT SrcTy = MRI.getType(Src);
8496+
8497+
LLT MidTy = LLT::fixed_vector(SrcTy.getNumElements(), LLT::scalar(32));
8498+
8499+
MachineInstrBuilder Mid;
8500+
MachineInstrBuilder Fin;
8501+
MIRBuilder.setInstrAndDebugLoc(MI);
8502+
switch (MI.getOpcode()) {
8503+
default:
8504+
return UnableToLegalize;
8505+
case TargetOpcode::G_FPTRUNC: {
8506+
Mid = MIRBuilder.buildFPTruncOdd(MidTy, Src);
8507+
Fin = MIRBuilder.buildFPTrunc(DstTy, Mid.getReg(0));
8508+
break;
8509+
}
8510+
}
8511+
8512+
MRI.replaceRegWith(Dst, Fin.getReg(0));
8513+
MI.eraseFromParent();
8514+
return Legalized;
8515+
}
84928516

84938517
if (MI.getFlag(MachineInstr::FmAfn)) {
84948518
unsigned Flags = MI.getFlags();

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
819819
{{s16, s32}, {s16, s64}, {s32, s64}, {v4s16, v4s32}, {v2s32, v2s64}})
820820
.libcallFor({{s16, s128}, {s32, s128}, {s64, s128}})
821821
.moreElementsToNextPow2(1)
822-
.customIf([](const LegalityQuery &Q) {
822+
.lowerIf([](const LegalityQuery &Q) {
823823
LLT DstTy = Q.Types[0];
824824
LLT SrcTy = Q.Types[1];
825825
return SrcTy.isFixedVector() && DstTy.isFixedVector() &&
@@ -1479,10 +1479,6 @@ bool AArch64LegalizerInfo::legalizeCustom(
14791479
return legalizeICMP(MI, MRI, MIRBuilder);
14801480
case TargetOpcode::G_BITCAST:
14811481
return legalizeBitcast(MI, Helper);
1482-
case TargetOpcode::G_FPTRUNC:
1483-
// In order to vectorise f16 to f64 properly, we need to use f32 as an
1484-
// intermediary
1485-
return legalizeFptrunc(MI, MIRBuilder, MRI);
14861482
}
14871483

14881484
llvm_unreachable("expected switch to return");
@@ -2408,32 +2404,4 @@ bool AArch64LegalizerInfo::legalizePrefetch(MachineInstr &MI,
24082404
MIB.buildInstr(AArch64::G_AARCH64_PREFETCH).addImm(PrfOp).add(AddrVal);
24092405
MI.eraseFromParent();
24102406
return true;
2411-
}
2412-
2413-
bool AArch64LegalizerInfo::legalizeFptrunc(
2414-
MachineInstr &MI, MachineIRBuilder &MIRBuilder,
2415-
MachineRegisterInfo &MRI) const {
2416-
Register Dst = MI.getOperand(0).getReg();
2417-
Register Src = MI.getOperand(1).getReg();
2418-
LLT DstTy = MRI.getType(Dst);
2419-
LLT SrcTy = MRI.getType(Src);
2420-
2421-
LLT MidTy = LLT::fixed_vector(SrcTy.getNumElements(), LLT::scalar(32));
2422-
2423-
MachineInstrBuilder Mid;
2424-
MachineInstrBuilder Fin;
2425-
MIRBuilder.setInstrAndDebugLoc(MI);
2426-
switch (MI.getOpcode()) {
2427-
default:
2428-
return false;
2429-
case TargetOpcode::G_FPTRUNC: {
2430-
Mid = MIRBuilder.buildFPTruncOdd(MidTy, Src);
2431-
Fin = MIRBuilder.buildFPTrunc(DstTy, Mid.getReg(0));
2432-
break;
2433-
}
2434-
}
2435-
2436-
MRI.replaceRegWith(Dst, Fin.getReg(0));
2437-
MI.eraseFromParent();
2438-
return true;
24392407
}

0 commit comments

Comments
 (0)