Skip to content

Commit

Permalink
[MIRParser] Parse lane masks for register live-ins
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D25530

llvm-svn: 284052
  • Loading branch information
Krzysztof Parzyszek committed Oct 12, 2016
1 parent 45e4ef7 commit d62669d
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 24 deletions.
37 changes: 23 additions & 14 deletions llvm/lib/CodeGen/MIRParser/MILexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -424,19 +424,6 @@ static bool isValidHexFloatingPointPrefix(char C) {
return C == 'H' || C == 'K' || C == 'L' || C == 'M';
}

static Cursor maybeLexHexFloatingPointLiteral(Cursor C, MIToken &Token) {
if (C.peek() != '0' || C.peek(1) != 'x')
return None;
Cursor Range = C;
C.advance(2); // Skip '0x'
if (isValidHexFloatingPointPrefix(C.peek()))
C.advance();
while (isxdigit(C.peek()))
C.advance();
Token.reset(MIToken::FloatingPointLiteral, Range.upto(C));
return C;
}

static Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token) {
C.advance();
// Skip over [0-9]*([eE][-+]?[0-9]+)?
Expand All @@ -453,6 +440,28 @@ static Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token) {
return C;
}

static Cursor maybeLexHexadecimalLiteral(Cursor C, MIToken &Token) {
if (C.peek() != '0' || (C.peek(1) != 'x' && C.peek(1) != 'X'))
return None;
Cursor Range = C;
C.advance(2);
unsigned PrefLen = 2;
if (isValidHexFloatingPointPrefix(C.peek())) {
C.advance();
PrefLen++;
}
while (isxdigit(C.peek()))
C.advance();
StringRef StrVal = Range.upto(C);
if (StrVal.size() <= PrefLen)
return None;
if (PrefLen == 2)
Token.reset(MIToken::HexLiteral, Range.upto(C));
else // It must be 3, which means that there was a floating-point prefix.
Token.reset(MIToken::FloatingPointLiteral, Range.upto(C));
return C;
}

static Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token) {
if (!isdigit(C.peek()) && (C.peek() != '-' || !isdigit(C.peek(1))))
return None;
Expand Down Expand Up @@ -609,7 +618,7 @@ StringRef llvm::lexMIToken(StringRef Source, MIToken &Token,
return R.remaining();
if (Cursor R = maybeLexExternalSymbol(C, Token, ErrorCallback))
return R.remaining();
if (Cursor R = maybeLexHexFloatingPointLiteral(C, Token))
if (Cursor R = maybeLexHexadecimalLiteral(C, Token))
return R.remaining();
if (Cursor R = maybeLexNumericalLiteral(C, Token))
return R.remaining();
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/CodeGen/MIRParser/MILexer.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ struct MIToken {
// Other tokens
IntegerLiteral,
FloatingPointLiteral,
HexLiteral,
VirtualRegister,
ConstantPoolItem,
JumpTableIndex,
Expand Down
48 changes: 39 additions & 9 deletions llvm/lib/CodeGen/MIRParser/MIParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetIntrinsicInfo.h"
#include "llvm/Target/TargetSubtargetInfo.h"
#include <cctype>

using namespace llvm;

Expand Down Expand Up @@ -453,8 +454,19 @@ bool MIParser::parseBasicBlockLiveins(MachineBasicBlock &MBB) {
unsigned Reg = 0;
if (parseNamedRegister(Reg))
return true;
MBB.addLiveIn(Reg);
lex();
LaneBitmask Mask = ~LaneBitmask(0);
if (consumeIfPresent(MIToken::colon)) {
// Parse lane mask.
if (Token.isNot(MIToken::IntegerLiteral) &&
Token.isNot(MIToken::HexLiteral))
return error("expected a lane mask");
static_assert(sizeof(LaneBitmask) == sizeof(unsigned), "");
if (getUnsigned(Mask))
return error("invalid lane mask value");
lex();
}
MBB.addLiveIn(Reg, Mask);
} while (consumeIfPresent(MIToken::comma));
return false;
}
Expand Down Expand Up @@ -1107,7 +1119,8 @@ bool MIParser::parseTypedImmediateOperand(MachineOperand &Dest) {
bool MIParser::parseFPImmediateOperand(MachineOperand &Dest) {
auto Loc = Token.location();
lex();
if (Token.isNot(MIToken::FloatingPointLiteral))
if (Token.isNot(MIToken::FloatingPointLiteral) &&
Token.isNot(MIToken::HexLiteral))
return error("expected a floating point literal");
const Constant *C = nullptr;
if (parseIRConstant(Loc, C))
Expand All @@ -1117,13 +1130,30 @@ bool MIParser::parseFPImmediateOperand(MachineOperand &Dest) {
}

bool MIParser::getUnsigned(unsigned &Result) {
assert(Token.hasIntegerValue() && "Expected a token with an integer value");
const uint64_t Limit = uint64_t(std::numeric_limits<unsigned>::max()) + 1;
uint64_t Val64 = Token.integerValue().getLimitedValue(Limit);
if (Val64 == Limit)
return error("expected 32-bit integer (too large)");
Result = Val64;
return false;
if (Token.hasIntegerValue()) {
const uint64_t Limit = uint64_t(std::numeric_limits<unsigned>::max()) + 1;
uint64_t Val64 = Token.integerValue().getLimitedValue(Limit);
if (Val64 == Limit)
return error("expected 32-bit integer (too large)");
Result = Val64;
return false;
}
if (Token.is(MIToken::HexLiteral)) {
StringRef S = Token.range();
assert(S[0] == '0' && tolower(S[1]) == 'x');
// This could be a floating point literal with a special prefix.
if (!isxdigit(S[2]))
return true;
StringRef V = S.substr(2);
unsigned BW = std::min<unsigned>(V.size()*4, 32);
APInt A(BW, V, 16);
APInt Limit = APInt(BW, std::numeric_limits<unsigned>::max());
if (A.ugt(Limit))
return error("expected 32-bit integer (too large)");
Result = A.getZExtValue();
return false;
}
return true;
}

bool MIParser::parseMBBReference(MachineBasicBlock *&MBB) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/MIRPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,7 @@ void MIPrinter::print(const MachineBasicBlock &MBB) {
First = false;
printReg(LI.PhysReg, OS, TRI);
if (LI.LaneMask != ~0u)
OS << ':' << PrintLaneMask(LI.LaneMask);
OS << ":0x" << PrintLaneMask(LI.LaneMask);
}
OS << "\n";
HasLineAttributes = true;
Expand Down
23 changes: 23 additions & 0 deletions llvm/test/CodeGen/MIR/Hexagon/parse-lane-masks.mir
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# RUN: llc -march=hexagon -run-pass none -o - %s | FileCheck %s
# Check that the MIR parser can parse lane masks in block liveins.

# CHECK-LABEL: name: foo
# CHECK: bb.0:
# CHECK: liveins: %d0:0x00000002, %d1, %d2:0x00000010

--- |
define void @foo() {
ret void
}
...

---
name: foo
tracksRegLiveness: true

body: |
bb.0:
liveins: %d0:0x00002, %d1, %d2:16
A2_nop
...

0 comments on commit d62669d

Please sign in to comment.