diff options
author | Tim Northover <tnorthover@apple.com> | 2016-07-22 16:59:52 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-07-22 16:59:52 +0000 |
commit | bd5054602ebad1d9d1a0753980c69ae6e08a168e (patch) | |
tree | 0fcdde11bb44a66922936b11db69be4e698d6bd6 /llvm/lib | |
parent | 820f87a72d872987a95d1e5931f1dd7656f2ec0a (diff) | |
download | bcm5719-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.cpp | 27 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/CodeGen/LowLevelType.cpp | 16 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 10 |
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)) |