GlobalISel: implement alloca instruction
llvm-svn: 276433
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
index c9b4135f..503b52d 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
@@ -174,14 +174,18 @@
}
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 a5a95f8..ea155c3 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.h
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.h
@@ -102,6 +102,7 @@
NamedRegister,
MachineBasicBlockLabel,
MachineBasicBlock,
+ PointerType,
ScalarType,
StackObject,
FixedStackObject,
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
index e4ca9ae..695c58d 100644
--- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
@@ -1030,7 +1030,7 @@
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 @@
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))