MIR Serialization: Serialize the stack pseudo source values.
authorAlex Lorenz <arphaman@gmail.com>
Wed, 12 Aug 2015 20:44:16 +0000 (20:44 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Wed, 12 Aug 2015 20:44:16 +0000 (20:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244806 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MIRParser/MILexer.cpp
lib/CodeGen/MIRParser/MILexer.h
lib/CodeGen/MIRParser/MIParser.cpp
lib/CodeGen/MIRPrinter.cpp
test/CodeGen/MIR/X86/memory-operands.mir

index c94c3981cc8b858c9160a40ed9a792eee7e81e14..8a6a1ff817abba5397c7a5c2a97307cc3cec976d 100644 (file)
@@ -201,6 +201,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
       .Case("non-temporal", MIToken::kw_non_temporal)
       .Case("invariant", MIToken::kw_invariant)
       .Case("align", MIToken::kw_align)
+      .Case("stack", MIToken::kw_stack)
       .Case("constant-pool", MIToken::kw_constant_pool)
       .Case("liveout", MIToken::kw_liveout)
       .Default(MIToken::Identifier);
index 75cf3f3463e1b5219a3f80b0858d7345ed48b11a..2c7a32cf508076ec37961b747b17de905ccc0eb1 100644 (file)
@@ -70,6 +70,7 @@ struct MIToken {
     kw_non_temporal,
     kw_invariant,
     kw_align,
+    kw_stack,
     kw_constant_pool,
     kw_liveout,
 
index afa6ffcc5e465346f8f39a832ff8c79b6c5fee6b..47a9eaf14c33df1ad96c50530c22a2a5f64987eb 100644 (file)
@@ -1121,6 +1121,9 @@ bool MIParser::parseMemoryOperandFlag(unsigned &Flags) {
 
 bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) {
   switch (Token.kind()) {
+  case MIToken::kw_stack:
+    PSV = MF.getPSVManager().getStack();
+    break;
   case MIToken::kw_constant_pool:
     PSV = MF.getPSVManager().getConstantPool();
     break;
@@ -1133,7 +1136,7 @@ bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) {
 }
 
 bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) {
-  if (Token.is(MIToken::kw_constant_pool)) {
+  if (Token.is(MIToken::kw_constant_pool) || Token.is(MIToken::kw_stack)) {
     const PseudoSourceValue *PSV = nullptr;
     if (parseMemoryPseudoSourceValue(PSV))
       return true;
index d47ed9796892d168e6e1ba32065eeb9a7854a4f9..019383cc7cf03fe53164657f0aa70f82aa689534 100644 (file)
@@ -710,6 +710,9 @@ void MIPrinter::print(const MachineMemOperand &Op) {
     const PseudoSourceValue *PVal = Op.getPseudoValue();
     assert(PVal && "Expected a pseudo source value");
     switch (PVal->kind()) {
+    case PseudoSourceValue::Stack:
+      OS << "stack";
+      break;
     case PseudoSourceValue::ConstantPool:
       OS << "constant-pool";
       break;
index f84ebfb003c1103b2499167a7d09f17423dc54d1..289a5f6267fc2562a3970717a48b38ba20a979de 100644 (file)
     ret double %b
   }
 
+  declare x86_fp80 @cosl(x86_fp80) #0
+
+  define x86_fp80 @stack_psv(x86_fp80 %x) {
+  entry:
+    %y = call x86_fp80 @cosl(x86_fp80 %x) #0
+    ret x86_fp80 %y
+  }
+
+  attributes #0 = { readonly }
+
 ...
 ---
 name:            test
@@ -211,3 +221,28 @@ body:
       - '%xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool + 8)'
       - 'RETQ %xmm0'
 ...
+---
+name:            stack_psv
+tracksRegLiveness: true
+frameInfo:
+  stackSize:       24
+  maxAlignment:    16
+  adjustsStack:    true
+  hasCalls:        true
+  maxCallFrameSize: 16
+fixedStack:
+  - { id: 0, offset: 0, size: 10, alignment: 16, isImmutable: true, isAliased: false }
+body:
+  - id:          0
+    name:        entry
+    instructions:
+      - '%rsp = frame-setup SUB64ri8 %rsp, 24, implicit-def dead %eflags'
+      - CFI_INSTRUCTION .cfi_def_cfa_offset 32
+      - 'LD_F80m %rsp, 1, _, 32, _, implicit-def dead %fpsw'
+# CHECK: name: stack_psv
+# CHECK: ST_FP80m %rsp, 1, _, 0, _, implicit-def dead %fpsw :: (store 10 into stack, align 16)
+      - 'ST_FP80m %rsp, 1, _, 0, _, implicit-def dead %fpsw :: (store 10 into stack, align 16)'
+      - 'CALL64pcrel32 $cosl, csr_64, implicit %rsp, implicit-def %rsp, implicit-def %fp0'
+      - '%rsp = ADD64ri8 %rsp, 24, implicit-def dead %eflags'
+      - RETQ
+...