MIR Serialization: Serialize the memory operand's TBAA metadata node.

llvm-svn: 245244
This commit is contained in:
Alex Lorenz 2015-08-17 22:05:15 +00:00
parent 05ddbffbf3
commit a617c9162d
6 changed files with 119 additions and 11 deletions

View File

@ -442,6 +442,33 @@ static Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token) {
return C;
}
static MIToken::TokenKind getMetadataKeywordKind(StringRef Identifier) {
return StringSwitch<MIToken::TokenKind>(Identifier)
.Case("!tbaa", MIToken::md_tbaa)
.Default(MIToken::Error);
}
static Cursor maybeLexExlaim(
Cursor C, MIToken &Token,
function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) {
if (C.peek() != '!')
return None;
auto Range = C;
C.advance(1);
if (isdigit(C.peek()) || !isIdentifierChar(C.peek())) {
Token.reset(MIToken::exclaim, Range.upto(C));
return C;
}
while (isIdentifierChar(C.peek()))
C.advance();
StringRef StrVal = Range.upto(C);
Token.reset(getMetadataKeywordKind(StrVal), StrVal);
if (Token.isError())
ErrorCallback(Token.location(),
"use of unknown metadata keyword '" + StrVal + "'");
return C;
}
static MIToken::TokenKind symbolToken(char C) {
switch (C) {
case ',':
@ -450,8 +477,6 @@ static MIToken::TokenKind symbolToken(char C) {
return MIToken::equal;
case ':':
return MIToken::colon;
case '!':
return MIToken::exclaim;
case '(':
return MIToken::lparen;
case ')':
@ -531,6 +556,8 @@ StringRef llvm::lexMIToken(
return R.remaining();
if (Cursor R = maybeLexNumericalLiteral(C, Token))
return R.remaining();
if (Cursor R = maybeLexExlaim(C, Token, ErrorCallback))
return R.remaining();
if (Cursor R = maybeLexSymbol(C, Token))
return R.remaining();
if (Cursor R = maybeLexNewline(C, Token))

View File

@ -85,6 +85,9 @@ struct MIToken {
kw_liveins,
kw_successors,
// Named metadata keywords
md_tbaa,
// Identifier tokens
Identifier,
IntegerType,

View File

@ -1526,17 +1526,29 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
if (parseMachinePointerInfo(Ptr))
return true;
unsigned BaseAlignment = Size;
if (Token.is(MIToken::comma)) {
lex();
if (Token.isNot(MIToken::kw_align))
return error("expected 'align'");
if (parseAlignment(BaseAlignment))
return true;
AAMDNodes AAInfo;
while (consumeIfPresent(MIToken::comma)) {
switch (Token.kind()) {
case MIToken::kw_align:
if (parseAlignment(BaseAlignment))
return true;
break;
case MIToken::md_tbaa:
lex();
if (parseMDNode(AAInfo.TBAA))
return true;
break;
// TODO: Parse AA Scope metadata.
// TODO: Parse AA NoAlias metadata.
// TODO: Parse the ranges metadata.
// TODO: Report an error on duplicate metadata nodes.
default:
return error("expected 'align' or '!tbaa'");
}
}
// TODO: Parse the attached metadata nodes.
if (expectAndConsume(MIToken::rparen))
return true;
Dest = MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment);
Dest = MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment, AAInfo);
return false;
}

View File

@ -777,7 +777,14 @@ void MIPrinter::print(const MachineMemOperand &Op) {
printOffset(Op.getOffset());
if (Op.getBaseAlignment() != Op.getSize())
OS << ", align " << Op.getBaseAlignment();
// TODO: Print the metadata attributes.
auto AAInfo = Op.getAAInfo();
if (AAInfo.TBAA) {
OS << ", !tbaa ";
AAInfo.TBAA->printAsOperand(OS, MST);
}
// TODO: Print AA Scope metadata.
// TODO: Print AA NoAlias metadata.
// TODO: Print the ranges metadata.
OS << ')';
}

View File

@ -111,6 +111,27 @@
ret i32 8
}
%struct.XXH_state64_t = type { i32, i32, i64, i64, i64 }
@a = common global i32 0, align 4
define i32 @tbaa_metadata() {
entry:
%0 = load i32, i32* @a, align 4, !tbaa !2
%1 = inttoptr i32 %0 to %struct.XXH_state64_t*
%total_len2 = bitcast %struct.XXH_state64_t* %1 to i32*
%2 = load i32, i32* %total_len2, align 4, !tbaa !6
ret i32 %2
}
!2 = !{!3, !3, i64 0}
!3 = !{!"int", !4, i64 0}
!4 = !{!"omnipotent char", !5, i64 0}
!5 = !{!"Simple C/C++ TBAA"}
!6 = !{!7, !3, i64 0}
!7 = !{!"XXH_state64_t", !3, i64 0, !3, i64 4, !8, i64 8, !8, i64 16, !8, i64 24}
!8 = !{!"long long", !4, i64 0}
...
---
name: test
@ -338,3 +359,16 @@ body: |
%eax = MOV32ri 8
RETQ %eax
...
---
name: tbaa_metadata
tracksRegLiveness: true
body: |
bb.0.entry:
%rax = MOV64rm %rip, 1, _, @a, _ :: (load 8 from got)
; CHECK-LABEL: name: tbaa_metadata
; CHECK: %eax = MOV32rm killed %rax, 1, _, 0, _, implicit-def %rax :: (load 4 from %ir.a, !tbaa !2)
; CHECK-NEXT: %eax = MOV32rm killed %rax, 1, _, 0, _ :: (load 4 from %ir.total_len2, !tbaa !6)
%eax = MOV32rm killed %rax, 1, _, 0, _, implicit-def %rax :: (load 4 from %ir.a, !tbaa !2)
%eax = MOV32rm killed %rax, 1, _, 0, _ :: (load 4 from %ir.total_len2, !tbaa !6)
RETQ %eax
...

View File

@ -0,0 +1,25 @@
# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s
--- |
define i32 @inc(i32* %x) {
entry:
%0 = load i32, i32* %x
%1 = add i32 %0, 1
store i32 %1, i32* %x
ret i32 %1
}
...
---
name: inc
tracksRegLiveness: true
liveins:
- { reg: '%rdi' }
body: |
bb.0.entry:
liveins: %rdi
; CHECK: [[@LINE+1]]:60: use of unknown metadata keyword '!tba'
%eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.x, !tba !0)
%eax = INC32r killed %eax, implicit-def dead %eflags
MOV32mr killed %rdi, 1, _, 0, _, %eax :: (store 4 into %ir.x)
RETQ %eax
...