summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-08-19 22:40:08 +0000
committerTim Northover <tnorthover@apple.com>2016-08-19 22:40:08 +0000
commita11be047696cf71bb76517d1c1d63fefa123b49b (patch)
tree51fc04c07192b0f3cd9dc23e1a201917b47c808b
parentea904f9424cc37c5ff7ac595e465ede2a10fdf0d (diff)
downloadbcm5719-llvm-a11be047696cf71bb76517d1c1d63fefa123b49b.tar.gz
bcm5719-llvm-a11be047696cf71bb76517d1c1d63fefa123b49b.zip
GlobalISel: support legalization of G_FCONSTANTs
llvm-svn: 279341
-rw-r--r--llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h9
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp5
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp8
-rw-r--r--llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp1
-rw-r--r--llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir3
5 files changed, 26 insertions, 0 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
index daaf511fd74..0c15e1204a1 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
@@ -302,6 +302,15 @@ public:
MachineInstrBuilder buildIntrinsic(ArrayRef<LLT> Tys, Intrinsic::ID ID,
unsigned Res, bool HasSideEffects);
+ /// Build and insert \p Res<def> = G_FPTRUNC \p Ty \p Op
+ ///
+ /// G_FPTRUNC converts a floating-point value into one with a smaller type.
+ ///
+ /// \pre setBasicBlock or setMI must have been called.
+ ///
+ /// \return The newly created instruction.
+ MachineInstrBuilder buildFPTrunc(LLT Ty, unsigned Res, unsigned Op);
+
/// Build and insert \p Res<def> = G_TRUNC \p Ty \p Op
///
/// G_TRUNC extracts the low bits of a type. For a vector type each element is
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
index aa64be5a4c3..5ad75889723 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
@@ -211,6 +211,11 @@ MachineInstrBuilder MachineIRBuilder::buildTrunc(LLT Ty, unsigned Res,
return buildInstr(TargetOpcode::G_TRUNC, Ty).addDef(Res).addUse(Op);
}
+MachineInstrBuilder MachineIRBuilder::buildFPTrunc(LLT Ty, unsigned Res,
+ unsigned Op) {
+ return buildInstr(TargetOpcode::G_FPTRUNC, Ty).addDef(Res).addUse(Op);
+}
+
MachineInstrBuilder MachineIRBuilder::buildICmp(ArrayRef<LLT> Tys,
CmpInst::Predicate Pred,
unsigned Res, unsigned Op0,
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
index 632d6292f9c..9dc2bf8864e 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
@@ -141,6 +141,14 @@ MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
MI.eraseFromParent();
return Legalized;
}
+ case TargetOpcode::G_FCONSTANT: {
+ MIRBuilder.setInstr(MI);
+ unsigned DstExt = MRI.createGenericVirtualRegister(WideSize);
+ MIRBuilder.buildFConstant(WideTy, DstExt, *MI.getOperand(1).getFPImm());
+ MIRBuilder.buildFPTrunc(MI.getType(), MI.getOperand(0).getReg(), DstExt);
+ MI.eraseFromParent();
+ return Legalized;
+ }
}
}
diff --git a/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp b/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
index a06eee0973e..b91d6040bb6 100644
--- a/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
+++ b/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
@@ -63,6 +63,7 @@ AArch64MachineLegalizer::AArch64MachineLegalizer() {
for (auto Ty : {s1, s8, s16})
setAction(TargetOpcode::G_CONSTANT, Ty, WidenScalar);
+ setAction(TargetOpcode::G_FCONSTANT, s16, WidenScalar);
setAction(G_BR, LLT::unsized(), Legal);
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir
index 1cf0e681070..355552eab54 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir
@@ -53,7 +53,10 @@ body: |
; CHECK-LABEL: name: test_fconstant
; CHECK: %0(32) = G_FCONSTANT s32 float 1.000000e+00
; CHECK: %1(64) = G_FCONSTANT s64 double 2.000000e+00
+ ; CHECK: [[TMP:%[0-9]+]](32) = G_FCONSTANT s32 half 0xH0000
+ ; CHECK; %2(16) = G_FPTRUNC s16 [[TMP]]
%0(32) = G_FCONSTANT s32 float 1.0
%1(64) = G_FCONSTANT s64 double 2.0
+ %2(16) = G_FCONSTANT s16 half 0.0
...
OpenPOWER on IntegriCloud