summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-08-19 22:40:00 +0000
committerTim Northover <tnorthover@apple.com>2016-08-19 22:40:00 +0000
commitea904f9424cc37c5ff7ac595e465ede2a10fdf0d (patch)
treea6f53aec83820790c56ad70b565f333f940ad292
parentfa7de606c439d90665ef25f0c6d447a9476c2fc6 (diff)
downloadbcm5719-llvm-ea904f9424cc37c5ff7ac595e465ede2a10fdf0d.tar.gz
bcm5719-llvm-ea904f9424cc37c5ff7ac595e465ede2a10fdf0d.zip
GlobalISel: teach legalizer how to handle integer constants.
llvm-svn: 279340
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp10
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp5
-rw-r--r--llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp9
-rw-r--r--llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir59
4 files changed, 80 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
index 29fdee8633f..632d6292f9c 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
@@ -104,6 +104,7 @@ MachineLegalizeHelper::narrowScalar(MachineInstr &MI, LLT NarrowTy) {
MachineLegalizeHelper::LegalizeResult
MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
+ unsigned WideSize = WideTy.getSizeInBits();
switch (MI.getOpcode()) {
default:
return UnableToLegalize;
@@ -116,7 +117,6 @@ MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
// Perform operation at larger width (any extension is fine here, high bits
// don't affect the result) and then truncate the result back to the
// original type.
- unsigned WideSize = WideTy.getSizeInBits();
MIRBuilder.setInstr(MI);
@@ -133,6 +133,14 @@ MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
MI.eraseFromParent();
return Legalized;
}
+ case TargetOpcode::G_CONSTANT: {
+ MIRBuilder.setInstr(MI);
+ unsigned DstExt = MRI.createGenericVirtualRegister(WideSize);
+ MIRBuilder.buildConstant(WideTy, DstExt, MI.getOperand(1).getImm());
+ MIRBuilder.buildTrunc(MI.getType(), MI.getOperand(0).getReg(), DstExt);
+ MI.eraseFromParent();
+ return Legalized;
+ }
}
}
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
index 881b5026fa6..fa23627de7c 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
@@ -119,8 +119,9 @@ LLT MachineLegalizer::findLegalType(unsigned Opcode, LLT Ty,
[&](LLT Ty) -> LLT { return Ty.halfScalarSize(); });
}
case WidenScalar: {
- return findLegalType(Opcode, Ty,
- [&](LLT Ty) -> LLT { return Ty.doubleScalarSize(); });
+ return findLegalType(Opcode, Ty, [&](LLT Ty) -> LLT {
+ return Ty.getSizeInBits() < 8 ? LLT::scalar(8) : Ty.doubleScalarSize();
+ });
}
case FewerElements: {
return findLegalType(Opcode, Ty,
diff --git a/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp b/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
index 36f7f4e46d0..a06eee0973e 100644
--- a/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
+++ b/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
@@ -26,6 +26,7 @@ using namespace llvm;
AArch64MachineLegalizer::AArch64MachineLegalizer() {
using namespace TargetOpcode;
+ const LLT s1 = LLT::scalar(1);
const LLT s8 = LLT::scalar(8);
const LLT s16 = LLT::scalar(16);
const LLT s32 = LLT::scalar(32);
@@ -54,6 +55,14 @@ AArch64MachineLegalizer::AArch64MachineLegalizer() {
for (auto Ty : {s32, s64})
setAction(MemOp, Ty, Legal);
+ for (auto Ty : {s32, s64}) {
+ setAction(TargetOpcode::G_CONSTANT, Ty, Legal);
+ setAction(TargetOpcode::G_FCONSTANT, Ty, Legal);
+ }
+
+ for (auto Ty : {s1, s8, s16})
+ setAction(TargetOpcode::G_CONSTANT, Ty, 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
new file mode 100644
index 00000000000..1cf0e681070
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir
@@ -0,0 +1,59 @@
+# RUN: llc -O0 -run-pass=legalize-mir -global-isel %s -o - 2>&1 | FileCheck %s
+
+--- |
+ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
+ target triple = "aarch64-apple-ios"
+ define void @test_constant() {
+ entry:
+ ret void
+ }
+ define void @test_fconstant() {
+ entry:
+ ret void
+ }
+...
+
+---
+name: test_constant
+isSSA: true
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+ - { id: 2, class: _ }
+ - { id: 3, class: _ }
+ - { id: 4, class: _ }
+body: |
+ bb.0.entry:
+ ; CHECK-LABEL: name: test_constant
+ ; CHECK: [[TMP:%[0-9]+]](32) = G_CONSTANT s32 0
+ ; CHECK: %0(1) = G_TRUNC s1 [[TMP]]
+ ; CHECK: [[TMP:%[0-9]+]](32) = G_CONSTANT s32 42
+ ; CHECK: %1(8) = G_TRUNC s8 [[TMP]]
+ ; CHECK: [[TMP:%[0-9]+]](32) = G_CONSTANT s32 65535
+ ; CHECK: %2(16) = G_TRUNC s16 [[TMP]]
+ ; CHECK: %3(32) = G_CONSTANT s32 -1
+ ; CHECK: %4(64) = G_CONSTANT s64 1
+
+ %0(1) = G_CONSTANT s1 0
+ %1(8) = G_CONSTANT s8 42
+ %2(16) = G_CONSTANT s16 65535
+ %3(32) = G_CONSTANT s32 -1
+ %4(64) = G_CONSTANT s64 1
+...
+
+---
+name: test_fconstant
+isSSA: true
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+ - { id: 2, class: _ }
+body: |
+ bb.0.entry:
+ ; 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
+
+ %0(32) = G_FCONSTANT s32 float 1.0
+ %1(64) = G_FCONSTANT s64 double 2.0
+...
OpenPOWER on IntegriCloud