Skip to content

Commit ae3ef1e

Browse files
Address review comments
1 parent 737470e commit ae3ef1e

File tree

3 files changed

+23
-27
lines changed

3 files changed

+23
-27
lines changed

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1483,11 +1483,10 @@ bool AArch64LegalizerInfo::legalizeCustom(
14831483
case TargetOpcode::G_BITCAST:
14841484
return legalizeBitcast(MI, Helper);
14851485
case TargetOpcode::G_FPEXT:
1486+
case TargetOpcode::G_FPTRUNC:
14861487
// In order to vectorise f16 to f64 properly, we need to use f32 as an
14871488
// intermediary
1488-
return legalizeViaF32(MI, MIRBuilder, MRI, TargetOpcode::G_FPEXT);
1489-
case TargetOpcode::G_FPTRUNC:
1490-
return legalizeViaF32(MI, MIRBuilder, MRI, TargetOpcode::G_FPTRUNC);
1489+
return legalizeFpextFptrunc(MI, MIRBuilder, MRI);
14911490
}
14921491

14931492
llvm_unreachable("expected switch to return");
@@ -2415,10 +2414,9 @@ bool AArch64LegalizerInfo::legalizePrefetch(MachineInstr &MI,
24152414
return true;
24162415
}
24172416

2418-
bool AArch64LegalizerInfo::legalizeViaF32(MachineInstr &MI,
2419-
MachineIRBuilder &MIRBuilder,
2420-
MachineRegisterInfo &MRI,
2421-
unsigned Opcode) const {
2417+
bool AArch64LegalizerInfo::legalizeFpextFptrunc(
2418+
MachineInstr &MI, MachineIRBuilder &MIRBuilder,
2419+
MachineRegisterInfo &MRI) const {
24222420
Register Dst = MI.getOperand(0).getReg();
24232421
Register Src = MI.getOperand(1).getReg();
24242422
LLT DstTy = MRI.getType(Dst);
@@ -2429,7 +2427,7 @@ bool AArch64LegalizerInfo::legalizeViaF32(MachineInstr &MI,
24292427
MachineInstrBuilder Mid;
24302428
MachineInstrBuilder Fin;
24312429
MIRBuilder.setInstrAndDebugLoc(MI);
2432-
switch (Opcode) {
2430+
switch (MI.getOpcode()) {
24332431
default:
24342432
return false;
24352433
case TargetOpcode::G_FPEXT: {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class AArch64LegalizerInfo : public LegalizerInfo {
6767
bool legalizeDynStackAlloc(MachineInstr &MI, LegalizerHelper &Helper) const;
6868
bool legalizePrefetch(MachineInstr &MI, LegalizerHelper &Helper) const;
6969
bool legalizeBitcast(MachineInstr &MI, LegalizerHelper &Helper) const;
70-
bool legalizeViaF32(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
71-
MachineRegisterInfo &MRI, unsigned Opcode) const;
70+
bool legalizeFpextFptrunc(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
71+
MachineRegisterInfo &MRI) const;
7272
const AArch64Subtarget *ST;
7373
};
7474
} // End llvm namespace.

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

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,7 @@ unsigned getCmpOperandFoldingProfit(Register CmpOp, MachineRegisterInfo &MRI) {
904904
// Helper function for matchFpTruncFpTrunc.
905905
// Checks that the given definition belongs to an FPTRUNC and that the source is
906906
// not an integer, as no rounding is necessary due to the range of values
907-
bool checkTruncSrc(MachineRegisterInfo &MRI, MachineInstr *MaybeFpTrunc) {
907+
bool isFPTruncFromDouble(MachineRegisterInfo &MRI, MachineInstr *MaybeFpTrunc) {
908908
if (!MaybeFpTrunc || MaybeFpTrunc->getOpcode() != TargetOpcode::G_FPTRUNC)
909909
return false;
910910

@@ -930,8 +930,7 @@ bool checkTruncSrc(MachineRegisterInfo &MRI, MachineInstr *MaybeFpTrunc) {
930930
// truncating an FP that came from an integer this is not a problem as the range
931931
// of values is lower in the int
932932
bool matchFpTruncFpTrunc(MachineInstr &MI, MachineRegisterInfo &MRI) {
933-
if (MI.getOpcode() != TargetOpcode::G_FPTRUNC)
934-
return false;
933+
assert(MI.getOpcode() == TargetOpcode::G_FPTRUNC && "Expected G_FPTRUNC");
935934

936935
// Check the destination is 16 bits as we only want to match a very specific
937936
// pattern
@@ -959,10 +958,9 @@ bool matchFpTruncFpTrunc(MachineInstr &MI, MachineRegisterInfo &MRI) {
959958
for (unsigned OpIdx = 1, NumOperands = ParentDef->getNumOperands();
960959
OpIdx != NumOperands; ++OpIdx) {
961960
Register FpTruncDst = ParentDef->getOperand(OpIdx).getReg();
962-
963961
FpTruncDef = getDefIgnoringCopies(FpTruncDst, MRI);
964962

965-
if (!checkTruncSrc(MRI, FpTruncDef))
963+
if (!isFPTruncFromDouble(MRI, FpTruncDef))
966964
return false;
967965
}
968966

@@ -973,41 +971,43 @@ bool matchFpTruncFpTrunc(MachineInstr &MI, MachineRegisterInfo &MRI) {
973971
Register VecExtractDst = ParentDef->getOperand(2).getReg();
974972
MachineInstr *VecExtractDef = getDefIgnoringCopies(VecExtractDst, MRI);
975973

974+
if (!VecExtractDef ||
975+
VecExtractDef->getOpcode() != TargetOpcode::G_EXTRACT_VECTOR_ELT)
976+
return false;
977+
976978
Register FpTruncDst = VecExtractDef->getOperand(1).getReg();
977979
FpTruncDef = getDefIgnoringCopies(FpTruncDst, MRI);
978-
979-
if (!checkTruncSrc(MRI, FpTruncDef))
980-
return false;
981980
break;
982981
}
983982
case TargetOpcode::G_FPTRUNC: {
984983
Register FpTruncDst = ParentDef->getOperand(1).getReg();
985984
FpTruncDef = getDefIgnoringCopies(FpTruncDst, MRI);
986-
987-
if (!checkTruncSrc(MRI, FpTruncDef))
988-
return false;
989985
break;
990986
}
991987
}
992988

989+
if (!isFPTruncFromDouble(MRI, FpTruncDef))
990+
return false;
991+
993992
return true;
994993
}
995994

996995
void applyFpTruncFpTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
997996
MachineIRBuilder &B) {
997+
assert(MI.getOpcode() == TargetOpcode::G_FPTRUNC && "Expected G_FPTRUNC");
998998
Register Dst = MI.getOperand(0).getReg();
999999
Register Src = MI.getOperand(1).getReg();
10001000

1001+
MachineInstr *ParentDef = getDefIgnoringCopies(Src, MRI);
1002+
if (!ParentDef)
1003+
return;
1004+
10011005
LLT V2F32 = LLT::fixed_vector(2, LLT::scalar(32));
10021006
LLT V4F32 = LLT::fixed_vector(4, LLT::scalar(32));
10031007
LLT V4F16 = LLT::fixed_vector(4, LLT::scalar(16));
10041008

10051009
B.setInstrAndDebugLoc(MI);
10061010

1007-
MachineInstr *ParentDef = getDefIgnoringCopies(Src, MRI);
1008-
if (!ParentDef)
1009-
return;
1010-
10111011
switch (ParentDef->getOpcode()) {
10121012
default:
10131013
return;
@@ -1056,8 +1056,6 @@ void applyFpTruncFpTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
10561056
Register HiFp64 = FpTrunc2Def->getOperand(1).getReg();
10571057
MRI.setRegClass(HiFp64, &AArch64::FPR128RegClass);
10581058

1059-
B.setInstrAndDebugLoc(MI);
1060-
10611059
// Convert the lower half
10621060
Register LoFp32 = MRI.createGenericVirtualRegister(V2F32);
10631061
MRI.setRegClass(LoFp32, &AArch64::FPR64RegClass);

0 commit comments

Comments
 (0)