[llvm] r322164 - [ARM GlobalISel] Legalize s32/s64 G_FCONSTANT
Diana Picus via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 10 02:01:49 PST 2018
Author: rovka
Date: Wed Jan 10 02:01:49 2018
New Revision: 322164
URL: http://llvm.org/viewvc/llvm-project?rev=322164&view=rev
Log:
[ARM GlobalISel] Legalize s32/s64 G_FCONSTANT
Legal for hard float.
Change to G_CONSTANT for soft float (but preserve the binary
representation).
Modified:
llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp
llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalize-fp.mir
Modified: llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp?rev=322164&r1=322163&r2=322164&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp Wed Jan 10 02:01:49 2018
@@ -161,7 +161,7 @@ ARMLegalizerInfo::ARMLegalizerInfo(const
setAction({G_ICMP, 1, Ty}, Legal);
if (!ST.useSoftFloat() && ST.hasVFP2()) {
- for (unsigned BinOp : {G_FADD, G_FSUB, G_FMUL, G_FDIV})
+ for (unsigned BinOp : {G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FCONSTANT})
for (auto Ty : {s32, s64})
setAction({BinOp, Ty}, Legal);
@@ -183,6 +183,10 @@ ARMLegalizerInfo::ARMLegalizerInfo(const
for (auto Ty : {s32, s64})
setAction({BinOp, Ty}, Libcall);
+ for (auto Ty : {s32, s64}) {
+ setAction({G_FCONSTANT, Ty}, Custom);
+ }
+
setAction({G_FCMP, s1}, Legal);
setAction({G_FCMP, 1, s32}, Custom);
setAction({G_FCMP, 1, s64}, Custom);
@@ -313,6 +317,7 @@ bool ARMLegalizerInfo::legalizeCustom(Ma
using namespace TargetOpcode;
MIRBuilder.setInstr(MI);
+ LLVMContext &Ctx = MIRBuilder.getMF().getFunction().getContext();
switch (MI.getOpcode()) {
default:
@@ -329,7 +334,6 @@ bool ARMLegalizerInfo::legalizeCustom(Ma
// Our divmod libcalls return a struct containing the quotient and the
// remainder. We need to create a virtual register for it.
- auto &Ctx = MIRBuilder.getMF().getFunction().getContext();
Type *ArgTy = Type::getInt32Ty(Ctx);
StructType *RetTy = StructType::get(Ctx, {ArgTy, ArgTy}, /* Packed */ true);
auto RetVal = MRI.createGenericVirtualRegister(
@@ -370,7 +374,6 @@ bool ARMLegalizerInfo::legalizeCustom(Ma
return true;
}
- auto &Ctx = MIRBuilder.getMF().getFunction().getContext();
assert((OpSize == 32 || OpSize == 64) && "Unsupported operand size");
auto *ArgTy = OpSize == 32 ? Type::getFloatTy(Ctx) : Type::getDoubleTy(Ctx);
auto *RetTy = Type::getInt32Ty(Ctx);
@@ -415,6 +418,14 @@ bool ARMLegalizerInfo::legalizeCustom(Ma
}
break;
}
+ case G_FCONSTANT: {
+ // Convert to integer constants, while preserving the binary representation.
+ auto AsInteger =
+ MI.getOperand(1).getFPImm()->getValueAPF().bitcastToAPInt();
+ MIRBuilder.buildConstant(MI.getOperand(0).getReg(),
+ *ConstantInt::get(Ctx, AsInteger));
+ break;
+ }
}
MI.eraseFromParent();
Modified: llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalize-fp.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalize-fp.mir?rev=322164&r1=322163&r2=322164&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalize-fp.mir (original)
+++ llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalize-fp.mir Wed Jan 10 02:01:49 2018
@@ -20,6 +20,9 @@
define void @test_fdiv_float() { ret void }
define void @test_fdiv_double() { ret void }
+ define void @test_fconstant_float() { ret void }
+ define void @test_fconstant_double() { ret void }
+
define void @test_fcmp_true_s32() { ret void }
define void @test_fcmp_false_s32() { ret void }
@@ -597,6 +600,59 @@ body: |
BX_RET 14, %noreg, implicit %r0, implicit %r1
...
---
+name: test_fconstant_float
+# CHECK-LABEL: name: test_fconstant_float
+legalized: false
+# CHECK: legalized: true
+regBankSelected: false
+selected: false
+tracksRegLiveness: true
+registers:
+ - { id: 0, class: _ }
+body: |
+ bb.0:
+ liveins:
+
+ ; HARD: [[R:%[0-9]+]]:_(s32) = G_FCONSTANT float -1.25
+ ; SOFT-NOT: G_FCONSTANT
+ ; SOFT: [[R:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1080033280
+ ; SOFT-NOT: G_FCONSTANT
+ %0(s32) = G_FCONSTANT float -1.25
+ ; CHECK: %r0 = COPY [[R]]
+ %r0 = COPY %0(s32)
+ BX_RET 14, %noreg, implicit %r0
+...
+---
+name: test_fconstant_double
+# CHECK-LABEL: name: test_fconstant_double
+legalized: false
+# CHECK: legalized: true
+regBankSelected: false
+selected: false
+tracksRegLiveness: true
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+ - { id: 2, class: _ }
+body: |
+ bb.0:
+ liveins:
+
+ ; HARD: [[R:%[0-9]+]]:_(s64) = G_FCONSTANT double -2.4
+ ; SOFT-NOT: G_FCONSTANT
+ ; SOFT-DAG: [[HI:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1073532109
+ ; SOFT-DAG: [[LO:%[0-9]+]]:_(s32) = G_CONSTANT i32 858993459
+ ; SOFT-NOT: G_FCONSTANT
+ %0(s64) = G_FCONSTANT double -2.4
+ ; HARD-DAG: G_UNMERGE_VALUES [[R]](s64)
+ ; SOFT-DAG: %r0 = COPY [[HI]]
+ ; SOFT-DAG: %r1 = COPY [[LO]]
+ %1(s32),%2(s32) = G_UNMERGE_VALUES %0(s64)
+ %r0 = COPY %2(s32)
+ %r1 = COPY %1(s32)
+ BX_RET 14, %noreg, implicit %r0, implicit %r1
+...
+---
name: test_fcmp_true_s32
# CHECK-LABEL: name: test_fcmp_true_s32
legalized: false
More information about the llvm-commits
mailing list