Skip to content

Commit 9c80566

Browse files
committed
patch MIR parser
1 parent a434d57 commit 9c80566

File tree

1 file changed

+42
-9
lines changed

1 file changed

+42
-9
lines changed

llvm/lib/CodeGen/MIRParser/MIParser.cpp

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "llvm/ADT/APSInt.h"
1717
#include "llvm/ADT/ArrayRef.h"
1818
#include "llvm/ADT/DenseMap.h"
19+
#include "llvm/ADT/SmallSet.h"
1920
#include "llvm/ADT/SmallVector.h"
2021
#include "llvm/ADT/StringMap.h"
2122
#include "llvm/ADT/StringRef.h"
@@ -1923,13 +1924,19 @@ static bool verifyAddrSpace(uint64_t AddrSpace) {
19231924
}
19241925

19251926
bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
1926-
if (Token.range().front() == 's' || Token.range().front() == 'p') {
1927+
if (Token.range().front() == 's' || Token.range().front() == 'i' || Token.range().front() == 'f' || Token.range().front() == 'p') {
19271928
StringRef SizeStr = Token.range().drop_front();
19281929
if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1929-
return error("expected integers after 's'/'p' type character");
1930+
return error("expected integers after 's'/'i'/'f'/'p' type character");
1931+
}
1932+
1933+
if (Token.range().substr(0,2) == "bf") {
1934+
StringRef SizeStr = Token.range().drop_front(2);
1935+
if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1936+
return error("expected integers after 'bf' type string");
19301937
}
19311938

1932-
if (Token.range().front() == 's') {
1939+
if (Token.range().front() == 's' || Token.range().front() == 'i') {
19331940
auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
19341941
if (ScalarSize) {
19351942
if (!verifyScalarSize(ScalarSize))
@@ -1949,6 +1956,20 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
19491956
Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
19501957
lex();
19511958
return false;
1959+
} else if (Token.range().front() == 'f') {
1960+
auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
1961+
if (!ScalarSize || !verifyScalarSize(ScalarSize))
1962+
return error("invalid size for scalar type");
1963+
Ty = LLT::floatingPoint(ScalarSize, LLT::FPInfo::IEEE_FLOAT);
1964+
lex();
1965+
return false;
1966+
} else if (Token.range().substr(0, 2) == "bf") {
1967+
auto ScalarSize = APSInt(Token.range().drop_front(2)).getZExtValue();
1968+
if (!ScalarSize || !verifyScalarSize(ScalarSize))
1969+
return error("invalid size for scalar type");
1970+
Ty = LLT::floatingPoint(ScalarSize, LLT::FPInfo::VARIANT_FLOAT_1);
1971+
lex();
1972+
return false;
19521973
}
19531974

19541975
// Now we're looking for a vector.
@@ -1985,14 +2006,16 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
19852006
return GetError();
19862007
lex();
19872008

1988-
if (Token.range().front() != 's' && Token.range().front() != 'p')
2009+
if (Token.range().front() != 's' && Token.range().front() != 'i' &&
2010+
Token.range().front() != 'f' && Token.range().front() != 'p' &&
2011+
Token.range().substr(0, 2) != "bf")
19892012
return GetError();
19902013

19912014
StringRef SizeStr = Token.range().drop_front();
19922015
if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1993-
return error("expected integers after 's'/'p' type character");
2016+
return error("expected integers after 's'/'i'/'f'/'p' type character");
19942017

1995-
if (Token.range().front() == 's') {
2018+
if (Token.range().front() == 's' || Token.range().front() == 'i') {
19962019
auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
19972020
if (!verifyScalarSize(ScalarSize))
19982021
return error("invalid size for scalar element in vector");
@@ -2004,6 +2027,16 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
20042027
return error("invalid address space number");
20052028

20062029
Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
2030+
} else if (Token.range().front() == 'f') {
2031+
auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
2032+
if (!verifyScalarSize(ScalarSize))
2033+
return error("invalid size for float element in vector");
2034+
Ty = LLT::floatingPoint(ScalarSize, LLT::FPInfo::IEEE_FLOAT);
2035+
} else if (Token.range().substr(0, 2) == "bf") {
2036+
auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
2037+
if (!verifyScalarSize(ScalarSize))
2038+
return error("invalid size for bfloat element in vector");
2039+
Ty = LLT::floatingPoint(ScalarSize, LLT::FPInfo::VARIANT_FLOAT_1);
20072040
} else
20082041
return GetError();
20092042
lex();
@@ -2021,12 +2054,12 @@ bool MIParser::parseTypedImmediateOperand(MachineOperand &Dest) {
20212054
assert(Token.is(MIToken::Identifier));
20222055
StringRef TypeStr = Token.range();
20232056
if (TypeStr.front() != 'i' && TypeStr.front() != 's' &&
2024-
TypeStr.front() != 'p')
2057+
TypeStr.front() != 'p' && TypeStr.front() != 'f' && TypeStr.substr(0,2) != "bf")
20252058
return error(
2026-
"a typed immediate operand should start with one of 'i', 's', or 'p'");
2059+
"a typed immediate operand should start with one of 'i', 's','f','bf', or 'p'");
20272060
StringRef SizeStr = Token.range().drop_front();
20282061
if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
2029-
return error("expected integers after 'i'/'s'/'p' type character");
2062+
return error("expected integers after 'i'/'s'/'f'/'bf'/'p' type character");
20302063

20312064
auto Loc = Token.location();
20322065
lex();

0 commit comments

Comments
 (0)