From b6137063ebda8a99f6b6f7c0c94b1cd3ad1c67d4 Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Mon, 23 Jan 2017 21:10:14 +0000 Subject: [PATCH] [AArch64][GlobalISel] Legalize narrow scalar fp->int conversions. Since we're now avoiding operations using narrow scalar integer types, we have to legalize the integer side of the FP conversions. This requires teaching the legalizer how to do that. llvm-svn: 292828 --- .../lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 14 ++++++++++++++ .../Target/AArch64/AArch64LegalizerInfo.cpp | 5 ++--- .../AArch64/GlobalISel/legalize-fptoi.mir | 18 ++++++++++++------ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index f77d807a69de..6da02646250b 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -273,6 +273,20 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) { MI.eraseFromParent(); return Legalized; } + case TargetOpcode::G_FPTOSI: + case TargetOpcode::G_FPTOUI: { + if (TypeIdx != 0) + return UnableToLegalize; + + unsigned DstExt = MRI.createGenericVirtualRegister(WideTy); + MIRBuilder.buildInstr(MI.getOpcode()) + .addDef(DstExt) + .addUse(MI.getOperand(1).getReg()); + + MIRBuilder.buildTrunc(MI.getOperand(0).getReg(), DstExt); + MI.eraseFromParent(); + return Legalized; + } case TargetOpcode::G_SITOFP: case TargetOpcode::G_UITOFP: { if (TypeIdx != 1) diff --git a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp index 985260700e35..871556c8ed9c 100644 --- a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -151,9 +151,8 @@ AArch64LegalizerInfo::AArch64LegalizerInfo() { setAction({G_UITOFP, 1, Ty}, Legal); } for (auto Ty : { s1, s8, s16 }) { - // FIXME: These should be widened on types smaller than s32. - setAction({G_FPTOSI, 0, Ty}, Legal); - setAction({G_FPTOUI, 0, Ty}, Legal); + setAction({G_FPTOSI, 0, Ty}, WidenScalar); + setAction({G_FPTOUI, 0, Ty}, WidenScalar); setAction({G_SITOFP, 1, Ty}, WidenScalar); setAction({G_UITOFP, 1, Ty}, WidenScalar); } diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-fptoi.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-fptoi.mir index 968256c7424b..8d0af0dc447c 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-fptoi.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-fptoi.mir @@ -130,7 +130,8 @@ body: | %0:_(s32) = COPY %w0 ; CHECK-LABEL: name: test_fptosi_s1_s32 - ; CHECK: %1(s1) = G_FPTOSI %0 + ; CHECK: %2(s32) = G_FPTOSI %0 + ; CHECK: %1(s1) = G_TRUNC %2 %1:_(s1) = G_FPTOSI %0 ... @@ -142,7 +143,8 @@ body: | %0:_(s32) = COPY %w0 ; CHECK-LABEL: name: test_fptoui_s1_s32 - ; CHECK: %1(s1) = G_FPTOUI %0 + ; CHECK: %2(s32) = G_FPTOUI %0 + ; CHECK: %1(s1) = G_TRUNC %2 %1:_(s1) = G_FPTOUI %0 ... @@ -154,7 +156,8 @@ body: | %0:_(s64) = COPY %x0 ; CHECK-LABEL: name: test_fptosi_s8_s64 - ; CHECK: %1(s8) = G_FPTOSI %0 + ; CHECK: %2(s32) = G_FPTOSI %0 + ; CHECK: %1(s8) = G_TRUNC %2 %1:_(s8) = G_FPTOSI %0 ... @@ -166,7 +169,8 @@ body: | %0:_(s64) = COPY %x0 ; CHECK-LABEL: name: test_fptoui_s8_s64 - ; CHECK: %1(s8) = G_FPTOUI %0 + ; CHECK: %2(s32) = G_FPTOUI %0 + ; CHECK: %1(s8) = G_TRUNC %2 %1:_(s8) = G_FPTOUI %0 ... @@ -178,7 +182,8 @@ body: | %0:_(s32) = COPY %w0 ; CHECK-LABEL: name: test_fptosi_s16_s32 - ; CHECK: %1(s16) = G_FPTOSI %0 + ; CHECK: %2(s32) = G_FPTOSI %0 + ; CHECK: %1(s16) = G_TRUNC %2 %1:_(s16) = G_FPTOSI %0 ... @@ -190,6 +195,7 @@ body: | %0:_(s32) = COPY %w0 ; CHECK-LABEL: name: test_fptoui_s16_s32 - ; CHECK: %1(s16) = G_FPTOUI %0 + ; CHECK: %2(s32) = G_FPTOUI %0 + ; CHECK: %1(s16) = G_TRUNC %2 %1:_(s16) = G_FPTOUI %0 ...