Skip to content

Commit f7a5dec

Browse files
[CodeGen][MIR] Support parsing of scalable vectors in MIR
This patch builds on the support for vectors by adding ability to parse scalable vectors in MIR.
1 parent 7b5505b commit f7a5dec

File tree

2 files changed

+52
-8
lines changed

2 files changed

+52
-8
lines changed

llvm/lib/CodeGen/MIRParser/MIParser.cpp

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1946,24 +1946,41 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
19461946

19471947
// Now we're looking for a vector.
19481948
if (Token.isNot(MIToken::less))
1949-
return error(Loc,
1950-
"expected sN, pA, <M x sN>, or <M x pA> for GlobalISel type");
1949+
return error(Loc, "expected sN, pA, <M x sN>, <M x pA>, <vscale x M x sN>, "
1950+
"or <vscale x M x pA> for GlobalISel type");
19511951
lex();
19521952

1953+
bool HasVScale = Token.stringValue() == "vscale";
1954+
if (HasVScale) {
1955+
lex();
1956+
if (Token.stringValue() != "x")
1957+
return error("expected <vscale x M x sN> or <vscale x M x pA>");
1958+
lex();
1959+
}
1960+
1961+
auto GetError = [&](bool HasVScale, StringRef::iterator Loc) {
1962+
if (HasVScale)
1963+
return error(
1964+
Loc, "expected <vscale x M x sN> or <vscale M x pA> for vector type");
1965+
else
1966+
return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1967+
};
1968+
19531969
if (Token.isNot(MIToken::IntegerLiteral))
1954-
return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1970+
return GetError(HasVScale, Loc);
19551971
uint64_t NumElements = Token.integerValue().getZExtValue();
19561972
if (!verifyVectorElementCount(NumElements))
19571973
return error("invalid number of vector elements");
19581974

19591975
lex();
19601976

19611977
if (Token.isNot(MIToken::Identifier) || Token.stringValue() != "x")
1962-
return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1978+
return GetError(HasVScale, Loc);
19631979
lex();
19641980

19651981
if (Token.range().front() != 's' && Token.range().front() != 'p')
1966-
return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1982+
return GetError(HasVScale, Loc);
1983+
19671984
StringRef SizeStr = Token.range().drop_front();
19681985
if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
19691986
return error("expected integers after 's'/'p' type character");
@@ -1981,14 +1998,18 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
19811998

19821999
Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
19832000
} else
1984-
return error(Loc, "expected <M x sN> or <M x pA> for vector type");
2001+
return GetError(HasVScale, Loc);
19852002
lex();
19862003

19872004
if (Token.isNot(MIToken::greater))
1988-
return error(Loc, "expected <M x sN> or <M x pA> for vector type");
2005+
return GetError(HasVScale, Loc);
2006+
19892007
lex();
19902008

1991-
Ty = LLT::fixed_vector(NumElements, Ty);
2009+
if (HasVScale)
2010+
Ty = LLT::scalable_vector(NumElements, Ty);
2011+
else
2012+
Ty = LLT::fixed_vector(NumElements, Ty);
19922013
return false;
19932014
}
19942015

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# RUN: llc -run-pass=none -o - %s | FileCheck %s
2+
3+
---
4+
name: scalable_vector_type_s
5+
body: |
6+
bb.0:
7+
; CHECK-LABEL: name: scalable_vector_type_s
8+
; CHECK: [[DEF:%[0-9]+]]:_(<vscale x 1 x s8>) = IMPLICIT_DEF
9+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<vscale x 1 x s8>) = COPY [[DEF]](<vscale x 1 x s8>)
10+
%0:_(<vscale x 1 x s8>) = IMPLICIT_DEF
11+
%1:_(<vscale x 1 x s8>) = COPY %0
12+
...
13+
14+
---
15+
name: scalable_vector_type_p
16+
body: |
17+
bb.0:
18+
; CHECK-LABEL: name: scalable_vector_type_p
19+
; CHECK: [[DEF:%[0-9]+]]:_(<vscale x 1 x p0>) = IMPLICIT_DEF
20+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<vscale x 1 x p0>) = COPY [[DEF]](<vscale x 1 x p0>)
21+
%0:_(<vscale x 1 x p0>) = IMPLICIT_DEF
22+
%1:_(<vscale x 1 x p0>) = COPY %0
23+
...

0 commit comments

Comments
 (0)