From: Alex Lorenz Date: Mon, 17 Aug 2015 22:09:52 +0000 (+0000) Subject: MIR Serialization: Serialize the memory operand's range metadata node. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=e45daf6294839dc0a06a20eb1fe434a61ae6336a MIR Serialization: Serialize the memory operand's range metadata node. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245247 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MIRParser/MILexer.cpp b/lib/CodeGen/MIRParser/MILexer.cpp index 9d3329a7dbe..68c5e8af1a6 100644 --- a/lib/CodeGen/MIRParser/MILexer.cpp +++ b/lib/CodeGen/MIRParser/MILexer.cpp @@ -447,6 +447,7 @@ static MIToken::TokenKind getMetadataKeywordKind(StringRef Identifier) { .Case("!tbaa", MIToken::md_tbaa) .Case("!alias.scope", MIToken::md_alias_scope) .Case("!noalias", MIToken::md_noalias) + .Case("!range", MIToken::md_range) .Default(MIToken::Error); } diff --git a/lib/CodeGen/MIRParser/MILexer.h b/lib/CodeGen/MIRParser/MILexer.h index 4e24c05c7bd..fe8fc091b44 100644 --- a/lib/CodeGen/MIRParser/MILexer.h +++ b/lib/CodeGen/MIRParser/MILexer.h @@ -89,6 +89,7 @@ struct MIToken { md_tbaa, md_alias_scope, md_noalias, + md_range, // Identifier tokens Identifier, diff --git a/lib/CodeGen/MIRParser/MIParser.cpp b/lib/CodeGen/MIRParser/MIParser.cpp index 57765b5b0cb..c11117312c9 100644 --- a/lib/CodeGen/MIRParser/MIParser.cpp +++ b/lib/CodeGen/MIRParser/MIParser.cpp @@ -1527,6 +1527,7 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) { return true; unsigned BaseAlignment = Size; AAMDNodes AAInfo; + MDNode *Range = nullptr; while (consumeIfPresent(MIToken::comma)) { switch (Token.kind()) { case MIToken::kw_align: @@ -1548,16 +1549,21 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) { if (parseMDNode(AAInfo.NoAlias)) return true; break; - // TODO: Parse the ranges metadata. + case MIToken::md_range: + lex(); + if (parseMDNode(Range)) + return true; + break; // TODO: Report an error on duplicate metadata nodes. default: - return error( - "expected 'align' or '!tbaa' or '!alias.scope' or '!noalias'"); + return error("expected 'align' or '!tbaa' or '!alias.scope' or " + "'!noalias' or '!range'"); } } if (expectAndConsume(MIToken::rparen)) return true; - Dest = MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment, AAInfo); + Dest = + MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment, AAInfo, Range); return false; } diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index aa3031657cd..6c8acb531da 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -790,7 +790,10 @@ void MIPrinter::print(const MachineMemOperand &Op) { OS << ", !noalias "; AAInfo.NoAlias->printAsOperand(OS, MST); } - // TODO: Print the ranges metadata. + if (Op.getRanges()) { + OS << ", !range "; + Op.getRanges()->printAsOperand(OS, MST); + } OS << ')'; } diff --git a/test/CodeGen/MIR/X86/memory-operands.mir b/test/CodeGen/MIR/X86/memory-operands.mir index 6fc6dca2527..fabea5ebcbf 100644 --- a/test/CodeGen/MIR/X86/memory-operands.mir +++ b/test/CodeGen/MIR/X86/memory-operands.mir @@ -148,6 +148,15 @@ !9 = distinct !{!9, !10, !"some scope"} !10 = distinct !{!10, !"some domain"} + define zeroext i1 @range_metadata(i8* %x) { + entry: + %0 = load i8, i8* %x, align 1, !range !11 + %tobool = trunc i8 %0 to i1 + ret i1 %tobool + } + + !11 = !{i8 0, i8 2} + ... --- name: test @@ -406,3 +415,16 @@ body: | MOVSSmr killed %rdi, 1, _, 28, _, killed %xmm0 :: (store 4 into %ir.arrayidx) RETQ ... +--- +name: range_metadata +tracksRegLiveness: true +liveins: + - { reg: '%rdi' } +body: | + bb.0.entry: + liveins: %rdi + ; CHECK-LABEL: name: range_metadata + ; CHECK: %al = MOV8rm killed %rdi, 1, _, 0, _ :: (load 1 from %ir.x, !range !11) + %al = MOV8rm killed %rdi, 1, _, 0, _ :: (load 1 from %ir.x, !range !11) + RETQ %al +...