[ARM] Allow half types in ConstantPool
Change ARMConstantIslandPass to:
- accept f16 literals as litpool entries,
- if the litpool needs to be inserted in the middle of a big block, then we
need to 4-byte align the next instruction in ARM mode.
Differential Revision: https://reviews.llvm.org/D42784
llvm-svn: 325012
diff --git a/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp b/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
index 8baee1c..32c88bc 100644
--- a/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
+++ b/llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
@@ -510,7 +510,6 @@
const DataLayout &TD = MF->getDataLayout();
for (unsigned i = 0, e = CPs.size(); i != e; ++i) {
unsigned Size = TD.getTypeAllocSize(CPs[i].getType());
- assert(Size >= 4 && "Too small constant pool entry");
unsigned Align = CPs[i].getAlignment();
assert(isPowerOf2_32(Align) && "Invalid alignment");
// Verify that all constant pool entries are a multiple of their alignment.
@@ -820,6 +819,11 @@
Scale = 4; // +-(offset_8*4)
NegOk = true;
break;
+ case ARM::VLDRH:
+ Bits = 8;
+ Scale = 2; // +-(offset_8*2)
+ NegOk = true;
+ break;
case ARM::tLDRHi:
Bits = 5;
@@ -1421,6 +1425,10 @@
assert(!isThumb || getITInstrPredicate(*MI, PredReg) == ARMCC::AL));
NewMBB = splitBlockBeforeInstr(&*MI);
+
+ // 4 byte align the next block after the constant pool when the CPE is a
+ // 16-bit value in ARM mode, and 2 byte for Thumb.
+ NewMBB->setAlignment(isThumb ? 1 : 2);
}
/// handleConstantPoolUser - Analyze the specified user, checking to see if it