summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-07-22 16:59:52 +0000
committerTim Northover <tnorthover@apple.com>2016-07-22 16:59:52 +0000
commitbd5054602ebad1d9d1a0753980c69ae6e08a168e (patch)
tree0fcdde11bb44a66922936b11db69be4e698d6bd6 /llvm/lib
parent820f87a72d872987a95d1e5931f1dd7656f2ec0a (diff)
downloadbcm5719-llvm-bd5054602ebad1d9d1a0753980c69ae6e08a168e.tar.gz
bcm5719-llvm-bd5054602ebad1d9d1a0753980c69ae6e08a168e.zip
GlobalISel: implement alloca instruction
llvm-svn: 276433
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp27
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp8
-rw-r--r--llvm/lib/CodeGen/LowLevelType.cpp16
-rw-r--r--llvm/lib/CodeGen/MIRParser/MILexer.cpp10
-rw-r--r--llvm/lib/CodeGen/MIRParser/MILexer.h1
-rw-r--r--llvm/lib/CodeGen/MIRParser/MIParser.cpp10
6 files changed, 61 insertions, 11 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index e017b498f56..82cec258fa6 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Function.h"
@@ -43,7 +44,7 @@ unsigned IRTranslator::getOrCreateVReg(const Value &Val) {
assert(Val.getType()->isSized() &&
"Don't know how to create an empty vreg");
assert(!Val.getType()->isAggregateType() && "Not yet implemented");
- unsigned Size = Val.getType()->getPrimitiveSizeInBits();
+ unsigned Size = DL->getTypeSizeInBits(Val.getType());
unsigned VReg = MRI->createGenericVirtualRegister(Size);
ValReg = VReg;
assert(!isa<Constant>(Val) && "Not yet implemented");
@@ -99,6 +100,23 @@ bool IRTranslator::translateBr(const Instruction &Inst) {
return true;
}
+bool IRTranslator::translateStaticAlloca(const AllocaInst &AI) {
+ assert(AI.isStaticAlloca() && "only handle static allocas now");
+ MachineFunction &MF = MIRBuilder.getMF();
+ unsigned ElementSize = DL->getTypeStoreSize(AI.getAllocatedType());
+ unsigned Size =
+ ElementSize * cast<ConstantInt>(AI.getArraySize())->getZExtValue();
+
+ unsigned Alignment = AI.getAlignment();
+ if (!Alignment)
+ Alignment = DL->getABITypeAlignment(AI.getAllocatedType());
+
+ unsigned Res = getOrCreateVReg(AI);
+ int FI = MF.getFrameInfo()->CreateStackObject(Size, Alignment, false, &AI);
+ MIRBuilder.buildFrameIndex(LLT::pointer(0), Res, FI);
+ return true;
+}
+
bool IRTranslator::translate(const Instruction &Inst) {
MIRBuilder.setDebugLoc(Inst.getDebugLoc());
switch(Inst.getOpcode()) {
@@ -107,17 +125,22 @@ bool IRTranslator::translate(const Instruction &Inst) {
return translateBinaryOp(TargetOpcode::G_ADD, Inst);
case Instruction::Sub:
return translateBinaryOp(TargetOpcode::G_SUB, Inst);
+
// Bitwise operations.
case Instruction::And:
return translateBinaryOp(TargetOpcode::G_AND, Inst);
case Instruction::Or:
return translateBinaryOp(TargetOpcode::G_OR, Inst);
+
// Branch operations.
case Instruction::Br:
return translateBr(Inst);
case Instruction::Ret:
return translateReturn(Inst);
+ case Instruction::Alloca:
+ return translateStaticAlloca(cast<AllocaInst>(Inst));
+
default:
llvm_unreachable("Opcode not supported");
}
@@ -138,6 +161,8 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &MF) {
CLI = MF.getSubtarget().getCallLowering();
MIRBuilder.setMF(MF);
MRI = &MF.getRegInfo();
+ DL = &F.getParent()->getDataLayout();
+
// Setup the arguments.
MachineBasicBlock &MBB = getOrCreateBB(F.front());
MIRBuilder.setMBB(MBB);
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
index 382652fe5bc..220965ce660 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
@@ -102,3 +102,11 @@ MachineInstr *MachineIRBuilder::buildInstr(unsigned Opcode, LLT Ty,
MachineInstrBuilder(getMF(), NewMI).addMBB(&BB);
return NewMI;
}
+
+MachineInstr *MachineIRBuilder::buildFrameIndex(LLT Ty, unsigned Res, int Idx) {
+ MachineInstr *NewMI = buildInstr(TargetOpcode::G_FRAME_INDEX, Ty);
+ auto MIB = MachineInstrBuilder(getMF(), NewMI);
+ MIB.addReg(Res, RegState::Define);
+ MIB.addImm(Idx);
+ return NewMI;
+}
diff --git a/llvm/lib/CodeGen/LowLevelType.cpp b/llvm/lib/CodeGen/LowLevelType.cpp
index 0f696221e7c..c81535c3e10 100644
--- a/llvm/lib/CodeGen/LowLevelType.cpp
+++ b/llvm/lib/CodeGen/LowLevelType.cpp
@@ -19,26 +19,32 @@ using namespace llvm;
LLT::LLT(const Type &Ty) {
if (auto VTy = dyn_cast<VectorType>(&Ty)) {
- ScalarSize = VTy->getElementType()->getPrimitiveSizeInBits();
+ SizeOrAddrSpace = VTy->getElementType()->getPrimitiveSizeInBits();
NumElements = VTy->getNumElements();
Kind = NumElements == 1 ? Scalar : Vector;
+ } else if (auto PTy = dyn_cast<PointerType>(&Ty)) {
+ Kind = Pointer;
+ SizeOrAddrSpace = PTy->getAddressSpace();
+ NumElements = 1;
} else if (Ty.isSized()) {
// Aggregates are no different from real scalars as far as GlobalISel is
// concerned.
Kind = Scalar;
- ScalarSize = Ty.getPrimitiveSizeInBits();
+ SizeOrAddrSpace = Ty.getPrimitiveSizeInBits();
NumElements = 1;
} else {
Kind = Unsized;
- ScalarSize = NumElements = 0;
+ SizeOrAddrSpace = NumElements = 0;
}
}
void LLT::print(raw_ostream &OS) const {
if (isVector())
- OS << "<" << NumElements << " x s" << ScalarSize << ">";
+ OS << "<" << NumElements << " x s" << SizeOrAddrSpace << ">";
+ else if (isPointer())
+ OS << "p" << getAddressSpace();
else if (isSized())
- OS << "s" << ScalarSize;
+ OS << "s" << getScalarSizeInBits();
else if (isValid())
OS << "unsized";
else
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
index c9b4135f822..503b52dcb38 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
@@ -174,14 +174,18 @@ static Cursor lexName(Cursor C, MIToken &Token, MIToken::TokenKind Type,
}
static Cursor maybeLexIntegerOrScalarType(Cursor C, MIToken &Token) {
- if ((C.peek() != 'i' && C.peek() != 's') || !isdigit(C.peek(1)))
+ if ((C.peek() != 'i' && C.peek() != 's' && C.peek() != 'p') ||
+ !isdigit(C.peek(1)))
return None;
char Kind = C.peek();
auto Range = C;
- C.advance(); // Skip 'i'
+ C.advance(); // Skip 'i', 's', or 'p'
while (isdigit(C.peek()))
C.advance();
- Token.reset(Kind == 'i' ? MIToken::IntegerType : MIToken::ScalarType,
+
+ Token.reset(Kind == 'i'
+ ? MIToken::IntegerType
+ : (Kind == 's' ? MIToken::ScalarType : MIToken::PointerType),
Range.upto(C));
return C;
}
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h
index a5a95f82729..ea155c3ae2f 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.h
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.h
@@ -102,6 +102,7 @@ struct MIToken {
NamedRegister,
MachineBasicBlockLabel,
MachineBasicBlock,
+ PointerType,
ScalarType,
StackObject,
FixedStackObject,
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
index e4ca9ae02f7..695c58d1a08 100644
--- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
@@ -1030,7 +1030,7 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty,
bool MustBeSized) {
if (Token.is(MIToken::Identifier) && Token.stringValue() == "unsized") {
if (MustBeSized)
- return error(Loc, "expected sN or <N x sM> for sized GlobalISel type");
+ return error(Loc, "expected pN, sN or <N x sM> for sized GlobalISel type");
lex();
Ty = LLT::unsized();
return false;
@@ -1038,11 +1038,17 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty,
Ty = LLT::scalar(APSInt(Token.range().drop_front()).getZExtValue());
lex();
return false;
+ } else if (Token.is(MIToken::PointerType)) {
+ Ty = LLT::pointer(APSInt(Token.range().drop_front()).getZExtValue());
+ lex();
+ return false;
}
// Now we're looking for a vector.
if (Token.isNot(MIToken::less))
- return error(Loc, "expected unsized, sN or <N x sM> for GlobalISel type");
+ return error(Loc,
+ "expected unsized, pN, sN or <N x sM> for GlobalISel type");
+
lex();
if (Token.isNot(MIToken::IntegerLiteral))
OpenPOWER on IntegriCloud