[inline asm] Get the mayLoad/mayStore directly from the MIOp_ExtraInfo operand.
authorChad Rosier <mcrosier@apple.com>
Tue, 30 Oct 2012 20:39:19 +0000 (20:39 +0000)
committerChad Rosier <mcrosier@apple.com>
Tue, 30 Oct 2012 20:39:19 +0000 (20:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167050 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineInstr.h
lib/CodeGen/SelectionDAG/InstrEmitter.cpp

index 42709012d215d69e6138745afce627850dcaf7f4..7eb03a93012d1318f94582d64a9f6b8d3b858bff 100644 (file)
@@ -58,10 +58,8 @@ public:
     NoFlags      = 0,
     FrameSetup   = 1 << 0,              // Instruction is used as a part of
                                         // function frame setup code.
-    InsideBundle = 1 << 1,              // Instruction is inside a bundle (not
+    InsideBundle = 1 << 1               // Instruction is inside a bundle (not
                                         // the first MI in a bundle)
-    MayLoad      = 1 << 2,              // Instruction could possibly read memory.
-    MayStore     = 1 << 3               // Instruction could possibly modify memory.
   };
 private:
   const MCInstrDesc *MCID;              // Instruction descriptor.
@@ -447,7 +445,12 @@ public:
   /// Instructions with this flag set are not necessarily simple load
   /// instructions, they may load a value and modify it, for example.
   bool mayLoad(QueryType Type = AnyInBundle) const {
-    return hasProperty(MCID::MayLoad, Type) || (Flags & MayLoad);
+    if (isInlineAsm()) {
+      unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
+      if (ExtraInfo & InlineAsm::Extra_MayLoad)
+        return true;
+    }
+    return hasProperty(MCID::MayLoad, Type);
   }
 
 
@@ -456,7 +459,12 @@ public:
   /// instructions, they may store a modified value based on their operands, or
   /// may not actually modify anything, for example.
   bool mayStore(QueryType Type = AnyInBundle) const {
-    return hasProperty(MCID::MayStore, Type) || (Flags & MayStore);
+    if (isInlineAsm()) {
+      unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
+      if (ExtraInfo & InlineAsm::Extra_MayStore)
+        return true;
+    }
+    return hasProperty(MCID::MayStore, Type);
   }
 
   //===--------------------------------------------------------------------===//
index 5fc71cc22383fd3e5d1e9bfffd1c7d54d1cbe6d0..a8381b25ba127a11b9c638b4b78cf35a44e83704 100644 (file)
@@ -897,19 +897,13 @@ EmitSpecialNode(SDNode *Node, bool IsClone, bool IsCloned,
     const char *AsmStr = cast<ExternalSymbolSDNode>(AsmStrV)->getSymbol();
     MI->addOperand(MachineOperand::CreateES(AsmStr));
 
-    // Add the HasSideEffect and isAlignStack bits.
+    // Add the HasSideEffect, isAlignStack, AsmDialect, MayLoad and MayStore
+    // bits.
     int64_t ExtraInfo =
       cast<ConstantSDNode>(Node->getOperand(InlineAsm::Op_ExtraInfo))->
                           getZExtValue();
     MI->addOperand(MachineOperand::CreateImm(ExtraInfo));
 
-    // Set the MayLoad and MayStore flags.
-    if (ExtraInfo & InlineAsm::Extra_MayLoad)
-      MI->setFlag(MachineInstr::MayLoad);
-
-    if (ExtraInfo & InlineAsm::Extra_MayStore)
-      MI->setFlag(MachineInstr::MayStore);
-
     // Remember to operand index of the group flags.
     SmallVector<unsigned, 8> GroupIdx;