Infer instruction properties from single-instruction patterns.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 24 Aug 2012 22:46:53 +0000 (22:46 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 24 Aug 2012 22:46:53 +0000 (22:46 +0000)
Previously, instructions without a primary patterns wouldn't get their
properties inferred. Now, we use all single-instruction patterns for
inference, including 'def : Pat<>' instances.

This causes a lot of instruction flags to change.

- Many instructions no longer have the UnmodeledSideEffects flag because
  their flags are now inferred from a pattern.

- Instructions with intrinsics will get a mayStore flag if they already
  have UnmodeledSideEffects and a mayLoad flag if they already have
  mayStore. This is because intrinsics properties are linear.

- Instructions with atomic_load patterns get a mayStore flag because
  atomic loads can't be reordered. The correct workaround is to create
  pseudo-instructions instead of using normal loads. PR13693.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162614 91177308-0d34-0410-b5e6-96231b3b80d8

test/CodeGen/Hexagon/newvaluejump.ll
test/CodeGen/Hexagon/newvaluestore.ll
utils/TableGen/CodeGenDAGPatterns.cpp

index 9c7ca55cb8f6f7ba76d83faeb1aebded5be34d91..03d36de29552fc82d90ac1aaa65534584df08975 100644 (file)
@@ -1,4 +1,7 @@
 ; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; XFAIL: *
+; This is xfailed into we have atomic load pseudos. PR13693.
+
 ; Check that we generate new value jump.
 
 @i = global i32 0, align 4
index ab69b22df57c3747d2e1ab1a00efa68ca5090be5..a876a94967501b8457cb0188dc61a2980bd423bc 100644 (file)
@@ -1,4 +1,7 @@
 ; RUN: llc -march=hexagon -mcpu=hexagonv4  < %s | FileCheck %s
+; XFAIL: *
+; This is xfailed into we have atomic load pseudos. PR13693.
+
 ; Check that we generate new value store packet in V4
 
 @i = global i32 0, align 4
index 7512ae8a25e94a66a988bab111a08615990be336..52254187d428c1feb804db575e018ba37ddc788b 100644 (file)
@@ -2383,6 +2383,10 @@ public:
     AnalyzeNode(Pat->getTree(0));
   }
 
+  void Analyze(const PatternToMatch *Pat) {
+    AnalyzeNode(Pat->getSrcPattern());
+  }
+
 private:
   bool IsNodeBitcast(const TreePatternNode *N) const {
     if (hasSideEffects || mayLoad || mayStore || isVariadic)
@@ -2542,6 +2546,17 @@ static bool hasNullFragReference(ListInit *LI) {
   return false;
 }
 
+/// Get all the instructions in a tree.
+static void
+getInstructionsInTree(TreePatternNode *Tree, SmallVectorImpl<Record*> &Instrs) {
+  if (Tree->isLeaf())
+    return;
+  if (Tree->getOperator()->isSubClassOf("Instruction"))
+    Instrs.push_back(Tree->getOperator());
+  for (unsigned i = 0, e = Tree->getNumChildren(); i != e; ++i)
+    getInstructionsInTree(Tree->getChild(i), Instrs);
+}
+
 /// ParseInstructions - Parse all of the instructions, inlining and resolving
 /// any fragments involved.  This populates the Instructions list with fully
 /// resolved instructions.
@@ -2870,6 +2885,30 @@ void CodeGenDAGPatterns::InferInstructionFlags() {
     Errors += InferFromPattern(InstInfo, PatInfo, InstInfo.TheDef);
   }
 
+  // Second, look for single-instruction patterns defined outside the
+  // instruction.
+  for (ptm_iterator I = ptm_begin(), E = ptm_end(); I != E; ++I) {
+    const PatternToMatch &PTM = *I;
+
+    // We can only infer from single-instruction patterns, otherwise we won't
+    // know which instruction should get the flags.
+    SmallVector<Record*, 8> PatInstrs;
+    getInstructionsInTree(PTM.getDstPattern(), PatInstrs);
+    if (PatInstrs.size() != 1)
+      continue;
+
+    // Get the single instruction.
+    CodeGenInstruction &InstInfo = Target.getInstruction(PatInstrs.front());
+
+    // Only infer properties from the first pattern. We'll verify the others.
+    if (InstInfo.InferredFrom)
+      continue;
+
+    InstAnalyzer PatInfo(*this);
+    PatInfo.Analyze(&PTM);
+    Errors += InferFromPattern(InstInfo, PatInfo, PTM.getSrcRecord());
+  }
+
   if (Errors)
     throw "pattern conflicts";