<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 5, 2015 at 10:39 AM, Alex L <span dir="ltr"><<a href="mailto:arphaman@gmail.com" target="_blank">arphaman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I've committed a fix for this in r<span style="font-size:13px">244068.</span></div></blockquote><div><br></div><div>Thanks!</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2015-08-05 9:45 GMT-07:00 Alex L <span dir="ltr"><<a href="mailto:arphaman@gmail.com" target="_blank">arphaman@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span><div dir="ltr"><span style="font-size:13px">Yeah, I think that it would probably be better to hide the logic that deals with quoted names in the lexer itself. I can definitely process</span><div style="font-size:13px">the quoted string values in the lexer, as they are always needed by the parser.<br><div><br></div><div>I also should get rid of the separate token types for quoted tokens, since when I started I had only 2 quoted tokens, but now they're expanding and it doesn't make sense for them to be separate token types instead of a flag in the token itself.</div></div><div style="font-size:13px"><br></div><div style="font-size:13px">I'll fix those things today,</div><div style="font-size:13px">Cheers,</div><div style="font-size:13px">Alex</div></div></span><div><div><div class="gmail_extra"><br><div class="gmail_quote">2015-08-05 9:40 GMT-07:00 Alex L <span dir="ltr"><<a href="mailto:arphaman@gmail.com" target="_blank">arphaman@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Yeah, I think that it would probably be better to hide the logic that deals with quoted names in the lexer itself. I can definitely process<div>the quoted string values in the lexer, as they are always needed by the parser.<br><div><br></div><div>I also should get rid of the separate token types for quoted tokens, since when I started I had only 2 quoted tokens, but now they're expanding and it doesn't make sense for them to be separate token types instead of a flag in the token itself.</div></div><div><br></div><div>I'll fix those things today,</div><div>Cheers,</div><div>Alex</div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">2015-08-03 20:30 GMT-07:00 Sean Silva <span dir="ltr"><<a href="mailto:chisophugis@gmail.com" target="_blank">chisophugis@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Mon, Aug 3, 2015 at 4:08 PM, Alex Lorenz <span dir="ltr"><<a href="mailto:arphaman@gmail.com" target="_blank">arphaman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: arphaman<br>
Date: Mon Aug  3 18:08:19 2015<br>
New Revision: 243915<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=243915&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=243915&view=rev</a><br>
Log:<br>
MIR Serialization: Initial serialization of the machine memory operands.<br>
<br>
Reviewers: Duncan P. N. Exon Smith<br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/MIR/X86/expected-comma-after-memory-operand.mir<br>
    llvm/trunk/test/CodeGen/MIR/X86/expected-from-in-memory-operand.mir<br>
    llvm/trunk/test/CodeGen/MIR/X86/expected-load-or-store-in-memory-operand.mir<br>
    llvm/trunk/test/CodeGen/MIR/X86/expected-pointer-value-in-memory-operand.mir<br>
    llvm/trunk/test/CodeGen/MIR/X86/expected-size-integer-after-memory-operation.mir<br>
    llvm/trunk/test/CodeGen/MIR/X86/expected-value-in-memory-operand.mir<br>
    llvm/trunk/test/CodeGen/MIR/X86/large-size-in-memory-operand-error.mir<br>
    llvm/trunk/test/CodeGen/MIR/X86/memory-operands.mir<br>
    llvm/trunk/test/CodeGen/MIR/X86/undefined-value-in-memory-operand.mir<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp<br>
    llvm/trunk/lib/CodeGen/MIRParser/MILexer.h<br>
    llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp<br>
    llvm/trunk/lib/CodeGen/MIRPrinter.cpp<br>
<br>
Modified: llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp?rev=243915&r1=243914&r2=243915&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp?rev=243915&r1=243914&r2=243915&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp Mon Aug  3 18:08:19 2015<br>
@@ -260,6 +260,16 @@ static Cursor maybeLexIRBlock(<br>
                  Rule.size(), ErrorCallback);<br>
 }<br>
<br>
+static Cursor maybeLexIRValue(<br>
+    Cursor C, MIToken &Token,<br>
+    function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) {<br>
+  const StringRef Rule = "%ir.";<br>
+  if (!C.remaining().startswith(Rule))<br>
+    return None;<br>
+  return lexName(C, Token, MIToken::NamedIRValue, MIToken::QuotedNamedIRValue,<br>
+                 Rule.size(), ErrorCallback);<br>
+}<br>
+<br>
 static Cursor lexVirtualRegister(Cursor C, MIToken &Token) {<br>
   auto Range = C;<br>
   C.advance(); // Skip '%'<br>
@@ -381,11 +391,17 @@ static MIToken::TokenKind symbolToken(ch<br>
 }<br>
<br>
 static Cursor maybeLexSymbol(Cursor C, MIToken &Token) {<br>
-  auto Kind = symbolToken(C.peek());<br>
+  MIToken::TokenKind Kind;<br>
+  unsigned Length = 1;<br>
+  if (C.peek() == ':' && C.peek(1) == ':') {<br>
+    Kind = MIToken::coloncolon;<br>
+    Length = 2;<br>
+  } else<br>
+    Kind = symbolToken(C.peek());<br>
   if (Kind == MIToken::Error)<br>
     return None;<br>
   auto Range = C;<br>
-  C.advance();<br>
+  C.advance(Length);<br>
   Token = MIToken(Kind, Range.upto(C));<br>
   return C;<br>
 }<br>
@@ -413,6 +429,8 @@ StringRef llvm::lexMIToken(<br>
     return R.remaining();<br>
   if (Cursor R = maybeLexIRBlock(C, Token, ErrorCallback))<br>
     return R.remaining();<br>
+  if (Cursor R = maybeLexIRValue(C, Token, ErrorCallback))<br>
+    return R.remaining();<br>
   if (Cursor R = maybeLexRegister(C, Token))<br>
     return R.remaining();<br>
   if (Cursor R = maybeLexGlobalValue(C, Token, ErrorCallback))<br>
<br>
Modified: llvm/trunk/lib/CodeGen/MIRParser/MILexer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.h?rev=243915&r1=243914&r2=243915&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.h?rev=243915&r1=243914&r2=243915&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MIRParser/MILexer.h (original)<br>
+++ llvm/trunk/lib/CodeGen/MIRParser/MILexer.h Mon Aug  3 18:08:19 2015<br>
@@ -36,6 +36,7 @@ struct MIToken {<br>
     equal,<br>
     underscore,<br>
     colon,<br>
+    coloncolon,<br>
     exclaim,<br>
     lparen,<br>
     rparen,<br>
@@ -82,6 +83,8 @@ struct MIToken {<br>
     NamedIRBlock,<br>
     QuotedNamedIRBlock,<br>
     IRBlock,<br>
+    NamedIRValue,<br>
+    QuotedNamedIRValue,<br>
   };<br>
<br>
 private:<br>
@@ -120,7 +123,7 @@ public:<br>
<br>
   bool isStringValueQuoted() const {<br>
     return Kind == QuotedNamedGlobalValue || Kind == QuotedExternalSymbol ||<br>
-           Kind == QuotedNamedIRBlock;<br>
+           Kind == QuotedNamedIRBlock || Kind == QuotedNamedIRValue;<br>
   }<br></blockquote><div><br></div></div></div><div>Sorry I haven't been keeping up with your commits, but it seems weird to me that whether a thing is quoted or not is exposed outside the lexer. Part of the point of a lexer is to abstract away this distinction (which is purely lexical). I.e. from a client's perspective, they just call stringValue() and that gets them the right string value.</div><div><br></div><div>Is there a reason you don't have a `StrVal` inside of MIToken and just fill it in inside lexMIToken?</div><div>(if malloc traffic is a concern, StrVal can be a StringRef, and MIToken can contain a SmallVector buffer for storing unescaped "cleaned" strings but zero-copy is used if no unescaping is necessary).</div><div><br></div><div>Presumably if there is an identifier in the source, then its string value will always be needed anyway, so I don't think there's a benefit to computing it lazily on demand.</div><span><font color="#888888"><div><br></div><div>-- Sean Silva</div></font></span><div><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
   /// Return the token's raw string value.<br>
<br>
Modified: llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp?rev=243915&r1=243914&r2=243915&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp?rev=243915&r1=243914&r2=243915&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp Mon Aug  3 18:08:19 2015<br>
@@ -21,6 +21,7 @@<br>
 #include "llvm/CodeGen/MachineFrameInfo.h"<br>
 #include "llvm/CodeGen/MachineInstr.h"<br>
 #include "llvm/CodeGen/MachineInstrBuilder.h"<br>
+#include "llvm/CodeGen/MachineMemOperand.h"<br>
 #include "llvm/CodeGen/MachineModuleInfo.h"<br>
 #include "llvm/IR/Instructions.h"<br>
 #include "llvm/IR/Constants.h"<br>
@@ -133,6 +134,8 @@ public:<br>
   bool parseBlockAddressOperand(MachineOperand &Dest);<br>
   bool parseTargetIndexOperand(MachineOperand &Dest);<br>
   bool parseMachineOperand(MachineOperand &Dest);<br>
+  bool parseIRValue(Value *&V);<br>
+  bool parseMachineMemoryOperand(MachineMemOperand *&Dest);<br>
<br>
 private:<br>
   /// Convert the integer literal in the current token into an unsigned integer.<br>
@@ -140,6 +143,11 @@ private:<br>
   /// Return true if an error occurred.<br>
   bool getUnsigned(unsigned &Result);<br>
<br>
+  /// Convert the integer literal in the current token into an uint64.<br>
+  ///<br>
+  /// Return true if an error occurred.<br>
+  bool getUint64(uint64_t &Result);<br>
+<br>
   /// If the current token is of the given kind, consume it and return false.<br>
   /// Otherwise report an error and return true.<br>
   bool expectAndConsume(MIToken::TokenKind TokenKind);<br>
@@ -256,15 +264,16 @@ bool MIParser::parse(MachineInstr *&MI)<br>
   if (Token.isError() || parseInstruction(OpCode, Flags))<br>
     return true;<br>
<br>
-  // TODO: Parse the bundle instruction flags and memory operands.<br>
+  // TODO: Parse the bundle instruction flags.<br>
<br>
   // Parse the remaining machine operands.<br>
-  while (Token.isNot(MIToken::Eof) && Token.isNot(MIToken::kw_debug_location)) {<br>
+  while (Token.isNot(MIToken::Eof) && Token.isNot(MIToken::kw_debug_location) &&<br>
+         Token.isNot(MIToken::coloncolon)) {<br>
     auto Loc = Token.location();<br>
     if (parseMachineOperand(MO))<br>
       return true;<br>
     Operands.push_back(MachineOperandWithLocation(MO, Loc, Token.location()));<br>
-    if (Token.is(MIToken::Eof))<br>
+    if (Token.is(MIToken::Eof) || Token.is(MIToken::coloncolon))<br>
       break;<br>
     if (Token.isNot(MIToken::comma))<br>
       return error("expected ',' before the next machine operand");<br>
@@ -282,6 +291,23 @@ bool MIParser::parse(MachineInstr *&MI)<br>
     DebugLocation = DebugLoc(Node);<br>
   }<br>
<br>
+  // Parse the machine memory operands.<br>
+  SmallVector<MachineMemOperand *, 2> MemOperands;<br>
+  if (Token.is(MIToken::coloncolon)) {<br>
+    lex();<br>
+    while (Token.isNot(MIToken::Eof)) {<br>
+      MachineMemOperand *MemOp = nullptr;<br>
+      if (parseMachineMemoryOperand(MemOp))<br>
+        return true;<br>
+      MemOperands.push_back(MemOp);<br>
+      if (Token.is(MIToken::Eof))<br>
+        break;<br>
+      if (Token.isNot(MIToken::comma))<br>
+        return error("expected ',' before the next machine memory operand");<br>
+      lex();<br>
+    }<br>
+  }<br>
+<br>
   const auto &MCID = MF.getSubtarget().getInstrInfo()->get(OpCode);<br>
   if (!MCID.isVariadic()) {<br>
     // FIXME: Move the implicit operand verification to the machine verifier.<br>
@@ -294,6 +320,12 @@ bool MIParser::parse(MachineInstr *&MI)<br>
   MI->setFlags(Flags);<br>
   for (const auto &Operand : Operands)<br>
     MI->addOperand(MF, Operand.Operand);<br>
+  if (MemOperands.empty())<br>
+    return false;<br>
+  MachineInstr::mmo_iterator MemRefs =<br>
+      MF.allocateMemRefsArray(MemOperands.size());<br>
+  std::copy(MemOperands.begin(), MemOperands.end(), MemRefs);<br>
+  MI->setMemRefs(MemRefs, MemRefs + MemOperands.size());<br>
   return false;<br>
 }<br>
<br>
@@ -929,6 +961,77 @@ bool MIParser::parseMachineOperand(Machi<br>
   return false;<br>
 }<br>
<br>
+bool MIParser::parseIRValue(Value *&V) {<br>
+  switch (Token.kind()) {<br>
+  case MIToken::NamedIRValue:<br>
+  case MIToken::QuotedNamedIRValue: {<br>
+    StringValueUtility Name(Token);<br>
+    V = MF.getFunction()->getValueSymbolTable().lookup(Name);<br>
+    if (!V)<br>
+      return error(Twine("use of undefined IR value '%ir.") +<br>
+                   Token.rawStringValue() + "'");<br>
+    break;<br>
+  }<br>
+  // TODO: Parse unnamed IR value references.<br>
+  default:<br>
+    llvm_unreachable("The current token should be an IR block reference");<br>
+  }<br>
+  return false;<br>
+}<br>
+<br>
+bool MIParser::getUint64(uint64_t &Result) {<br>
+  assert(Token.hasIntegerValue());<br>
+  if (Token.integerValue().getActiveBits() > 64)<br>
+    return error("expected 64-bit integer (too large)");<br>
+  Result = Token.integerValue().getZExtValue();<br>
+  return false;<br>
+}<br>
+<br>
+bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {<br>
+  if (expectAndConsume(MIToken::lparen))<br>
+    return true;<br>
+  // TODO: Parse the operand's flags.<br>
+  if (Token.isNot(MIToken::Identifier) ||<br>
+      (Token.stringValue() != "load" && Token.stringValue() != "store"))<br>
+    return error("expected 'load' or 'store' memory operation");<br>
+  unsigned Flags = 0;<br>
+  if (Token.stringValue() == "load")<br>
+    Flags |= MachineMemOperand::MOLoad;<br>
+  else<br>
+    Flags |= MachineMemOperand::MOStore;<br>
+  lex();<br>
+<br>
+  if (Token.isNot(MIToken::IntegerLiteral))<br>
+    return error("expected the size integer literal after memory operation");<br>
+  uint64_t Size;<br>
+  if (getUint64(Size))<br>
+    return true;<br>
+  lex();<br>
+<br>
+  const char *Word = Flags & MachineMemOperand::MOLoad ? "from" : "into";<br>
+  if (Token.isNot(MIToken::Identifier) || Token.stringValue() != Word)<br>
+    return error(Twine("expected '") + Word + "'");<br>
+  lex();<br>
+<br>
+  // TODO: Parse pseudo source values.<br>
+  if (Token.isNot(MIToken::NamedIRValue) &&<br>
+      Token.isNot(MIToken::QuotedNamedIRValue))<br>
+    return error("expected an IR value reference");<br>
+  Value *V = nullptr;<br>
+  if (parseIRValue(V))<br>
+    return true;<br>
+  if (!V->getType()->isPointerTy())<br>
+    return error("expected a pointer IR value");<br>
+  lex();<br>
+  // TODO: Parse the base alignment.<br>
+  // TODO: Parse the attached metadata nodes.<br>
+  if (expectAndConsume(MIToken::rparen))<br>
+    return true;<br>
+<br>
+  Dest = MF.getMachineMemOperand(MachinePointerInfo(V), Flags, Size, Size);<br>
+  return false;<br>
+}<br>
+<br>
 void MIParser::initNames2InstrOpCodes() {<br>
   if (!Names2InstrOpCodes.empty())<br>
     return;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/MIRPrinter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRPrinter.cpp?rev=243915&r1=243914&r2=243915&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRPrinter.cpp?rev=243915&r1=243914&r2=243915&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MIRPrinter.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/MIRPrinter.cpp Mon Aug  3 18:08:19 2015<br>
@@ -17,6 +17,7 @@<br>
 #include "llvm/CodeGen/MachineConstantPool.h"<br>
 #include "llvm/CodeGen/MachineFunction.h"<br>
 #include "llvm/CodeGen/MachineFrameInfo.h"<br>
+#include "llvm/CodeGen/MachineMemOperand.h"<br>
 #include "llvm/CodeGen/MachineModuleInfo.h"<br>
 #include "llvm/CodeGen/MachineRegisterInfo.h"<br>
 #include "llvm/CodeGen/MIRYamlMapping.h"<br>
@@ -114,8 +115,10 @@ public:<br>
   void print(const MachineInstr &MI);<br>
   void printMBBReference(const MachineBasicBlock &MBB);<br>
   void printIRBlockReference(const BasicBlock &BB);<br>
+  void printIRValueReference(const Value &V);<br>
   void printStackObjectReference(int FrameIndex);<br>
   void print(const MachineOperand &Op, const TargetRegisterInfo *TRI);<br>
+  void print(const MachineMemOperand &Op);<br>
<br>
   void print(const MCCFIInstruction &CFI, const TargetRegisterInfo *TRI);<br>
 };<br>
@@ -426,7 +429,7 @@ void MIPrinter::print(const MachineInstr<br>
   if (MI.getFlag(MachineInstr::FrameSetup))<br>
     OS << "frame-setup ";<br>
   OS << TII->getName(MI.getOpcode());<br>
-  // TODO: Print the bundling instruction flags, machine mem operands.<br>
+  // TODO: Print the bundling instruction flags.<br>
   if (I < E)<br>
     OS << ' ';<br>
<br>
@@ -444,6 +447,17 @@ void MIPrinter::print(const MachineInstr<br>
     OS << " debug-location ";<br>
     MI.getDebugLoc()->printAsOperand(OS, MST);<br>
   }<br>
+<br>
+  if (!MI.memoperands_empty()) {<br>
+    OS << " :: ";<br>
+    bool NeedComma = false;<br>
+    for (const auto *Op : MI.memoperands()) {<br>
+      if (NeedComma)<br>
+        OS << ", ";<br>
+      print(*Op);<br>
+      NeedComma = true;<br>
+    }<br>
+  }<br>
 }<br>
<br>
 void MIPrinter::printMBBReference(const MachineBasicBlock &MBB) {<br>
@@ -467,6 +481,16 @@ void MIPrinter::printIRBlockReference(co<br>
     OS << Slot;<br>
 }<br>
<br>
+void MIPrinter::printIRValueReference(const Value &V) {<br>
+  OS << "%ir.";<br>
+  if (V.hasName()) {<br>
+    printLLVMNameWithoutPrefix(OS, V.getName());<br>
+    return;<br>
+  }<br>
+  // TODO: Serialize the unnamed IR value references.<br>
+  OS << "<unserializable ir value>";<br>
+}<br>
+<br>
 void MIPrinter::printStackObjectReference(int FrameIndex) {<br>
   auto ObjectInfo = StackObjectOperandMapping.find(FrameIndex);<br>
   assert(ObjectInfo != StackObjectOperandMapping.end() &&<br>
@@ -581,6 +605,24 @@ void MIPrinter::print(const MachineOpera<br>
   }<br>
 }<br>
<br>
+void MIPrinter::print(const MachineMemOperand &Op) {<br>
+  OS << '(';<br>
+  // TODO: Print operand's other flags.<br>
+  if (Op.isLoad())<br>
+    OS << "load ";<br>
+  else {<br>
+    assert(Op.isStore() && "Non load machine operand must be a store");<br>
+    OS << "store ";<br>
+  }<br>
+  OS << Op.getSize() << (Op.isLoad() ? " from " : " into ");<br>
+  if (const Value *Val = Op.getValue())<br>
+    printIRValueReference(*Val);<br>
+  // TODO: Print PseudoSourceValue.<br>
+  // TODO: Print the base alignment.<br>
+  // TODO: Print the metadata attributes.<br>
+  OS << ')';<br>
+}<br>
+<br>
 static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS,<br>
                              const TargetRegisterInfo *TRI) {<br>
   int Reg = TRI->getLLVMRegNum(DwarfReg, true);<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/expected-comma-after-memory-operand.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-comma-after-memory-operand.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-comma-after-memory-operand.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/expected-comma-after-memory-operand.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/expected-comma-after-memory-operand.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,27 @@<br>
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s<br>
+<br>
+--- |<br>
+<br>
+  define void @test(i32* %a) {<br>
+  entry2:<br>
+    %b = load i32, i32* %a<br>
+    %c = add i32 %b, 1<br>
+    store i32 %c, i32* %a<br>
+    ret void<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry2<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: [[@LINE+1]]:92: expected ',' before the next machine memory operand<br>
+      - 'INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir.a) (load 4 from %ir.a)'<br>
+      - RETQ<br>
+...<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/expected-from-in-memory-operand.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-from-in-memory-operand.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-from-in-memory-operand.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/expected-from-in-memory-operand.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/expected-from-in-memory-operand.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,26 @@<br>
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s<br>
+<br>
+--- |<br>
+<br>
+  define i32 @test(i32* %a) {<br>
+  entry:<br>
+    %b = load i32, i32* %a<br>
+    ret i32 %b<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: [[@LINE+1]]:60: expected 'from'<br>
+      - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (load 4 %ir.a)'<br>
+      - 'RETQ %eax'<br>
+...<br>
+<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/expected-load-or-store-in-memory-operand.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-load-or-store-in-memory-operand.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-load-or-store-in-memory-operand.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/expected-load-or-store-in-memory-operand.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/expected-load-or-store-in-memory-operand.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,25 @@<br>
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s<br>
+<br>
+--- |<br>
+<br>
+  define i32 @test(i32* %a) {<br>
+  entry:<br>
+    %b = load i32, i32* %a<br>
+    ret i32 %b<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: [[@LINE+1]]:53: expected 'load' or 'store' memory operation<br>
+      - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (4 from %ir.a)'<br>
+      - 'RETQ %eax'<br>
+...<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/expected-pointer-value-in-memory-operand.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-pointer-value-in-memory-operand.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-pointer-value-in-memory-operand.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/expected-pointer-value-in-memory-operand.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/expected-pointer-value-in-memory-operand.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,26 @@<br>
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s<br>
+<br>
+--- |<br>
+<br>
+  define i32 @test(i32* %a) {<br>
+  entry:<br>
+    %b = load i32, i32* %a<br>
+    ret i32 %b<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: [[@LINE+1]]:65: expected a pointer IR value<br>
+      - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (load 4 from %ir.b)'<br>
+      - 'RETQ %eax'<br>
+...<br>
+<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/expected-size-integer-after-memory-operation.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-size-integer-after-memory-operation.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-size-integer-after-memory-operation.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/expected-size-integer-after-memory-operation.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/expected-size-integer-after-memory-operation.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,26 @@<br>
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s<br>
+<br>
+--- |<br>
+<br>
+  define i32 @test(i32* %a) {<br>
+  entry:<br>
+    %b = load i32, i32* %a<br>
+    ret i32 %b<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: [[@LINE+1]]:58: expected the size integer literal after memory operation<br>
+      - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (load from %ir.a)'<br>
+      - 'RETQ %eax'<br>
+...<br>
+<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/expected-value-in-memory-operand.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-value-in-memory-operand.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/expected-value-in-memory-operand.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/expected-value-in-memory-operand.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/expected-value-in-memory-operand.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,26 @@<br>
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s<br>
+<br>
+--- |<br>
+<br>
+  define i32 @test(i32* %a) {<br>
+  entry:<br>
+    %b = load i32, i32* %a<br>
+    ret i32 %b<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: [[@LINE+1]]:65: expected an IR value reference<br>
+      - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (load 4 from a)'<br>
+      - 'RETQ %eax'<br>
+...<br>
+<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/large-size-in-memory-operand-error.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/large-size-in-memory-operand-error.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/large-size-in-memory-operand-error.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/large-size-in-memory-operand-error.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/large-size-in-memory-operand-error.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,26 @@<br>
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s<br>
+<br>
+--- |<br>
+<br>
+  define i32 @test(i32* %a) {<br>
+  entry:<br>
+    %b = load i32, i32* %a<br>
+    ret i32 %b<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: [[@LINE+1]]:58: expected 64-bit integer (too large)<br>
+      - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (load 12345678912345678924218574857 from %ir.a)'<br>
+      - 'RETQ %eax'<br>
+...<br>
+<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/memory-operands.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/memory-operands.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/memory-operands.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/memory-operands.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/memory-operands.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,52 @@<br>
+# RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s<br>
+# This test ensures that the MIR parser parses the machine memory operands<br>
+# correctly.<br>
+<br>
+--- |<br>
+<br>
+  define i32 @test(i32* %a) {<br>
+  entry:<br>
+    %b = load i32, i32* %a<br>
+    store i32 42, i32* %a<br>
+    ret i32 %b<br>
+  }<br>
+<br>
+  define void @test2(i32* %"a value") {<br>
+  entry2:<br>
+    %b = load i32, i32* %"a value"<br>
+    %c = add i32 %b, 1<br>
+    store i32 %c, i32* %"a value"<br>
+    ret void<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK:      %eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)<br>
+# CHECK-NEXT: MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)<br>
+      - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)'<br>
+      - 'MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)'<br>
+      - 'RETQ %eax'<br>
+...<br>
+---<br>
+name:            test2<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry2<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")<br>
+      - 'INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")'<br>
+      - RETQ<br>
+...<br>
<br>
Added: llvm/trunk/test/CodeGen/MIR/X86/undefined-value-in-memory-operand.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/undefined-value-in-memory-operand.mir?rev=243915&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/undefined-value-in-memory-operand.mir?rev=243915&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/MIR/X86/undefined-value-in-memory-operand.mir (added)<br>
+++ llvm/trunk/test/CodeGen/MIR/X86/undefined-value-in-memory-operand.mir Mon Aug  3 18:08:19 2015<br>
@@ -0,0 +1,26 @@<br>
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s<br>
+<br>
+--- |<br>
+<br>
+  define i32 @test(i32* %a) {<br>
+  entry:<br>
+    %b = load i32, i32* %a<br>
+    ret i32 %b<br>
+  }<br>
+<br>
+...<br>
+---<br>
+name:            test<br>
+tracksRegLiveness: true<br>
+liveins:<br>
+  - { reg: '%rdi' }<br>
+body:<br>
+  - id:          0<br>
+    name:        entry<br>
+    liveins:     [ '%rdi' ]<br>
+    instructions:<br>
+# CHECK: [[@LINE+1]]:65: use of undefined IR value '%ir.c'<br>
+      - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (load 4 from %ir.c)'<br>
+      - 'RETQ %eax'<br>
+...<br>
+<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>