[PATCH] D18336: Prevent construction of cycle in DAG store merge

James Y Knight via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 25 07:02:44 PDT 2016

jyknight added inline comments.

Comment at: include/llvm/CodeGen/SelectionDAGNodes.h:628
@@ -627,13 +627,3 @@
-  /// Return true if N is a predecessor of this node.
-  /// N is either an operand of this node, or can be reached by recursively
-  /// traversing up the operands.
-  /// In this helper the Visited and worklist sets are held externally to
-  /// cache predecessors over multiple invocations. If you want to test for
-  /// multiple predecessors this method is preferable to multiple calls to
-  /// hasPredecessor. Be sure to clear Visited and Worklist if the DAG
-  /// changes.
-  /// NOTE: This is still very expensive. Use carefully.
-  bool hasPredecessorHelper(const SDNode *N,
-                            SmallPtrSetImpl<const SDNode *> &Visited,
-                            SmallVectorImpl<const SDNode *> &Worklist) const;
+  /// Populate Visitedo Set as unino of operand_dependences of nodes in
+  /// Worklist. Stop short if N is found (Use Null if complete closure is
Lots of typos. Visitedo. unino. "operand_dependences" sounds like it's referring to a variable or function but isn't actually.

"Null" is strangely capitalized.

Much of the old comment you deleted seems still relevant, too.

Comment at: include/llvm/CodeGen/SelectionDAGNodes.h:634
@@ +633,3 @@
+                                   SmallVectorImpl<const SDNode *> &Worklist) {
+    while (!Worklist.empty()) {
+      const SDNode *M = Worklist.pop_back_val();
Why removed the Visited check? It seems to me like that was still a more natural interface.

Then you can just ask all your "is Node X a predecessor" questions with the same interface.

Comment at: lib/CodeGen/SelectionDAG/DAGCombiner.cpp:9638
@@ -9638,1 +9637,3 @@
+  Worklist.push_back(N);
+  SDNode::hasPredecessorHelper(NULL, Visited, Worklist); // search completely
Why search completely? Isn't it better to escape early if you happen to be able to?

Comment at: lib/CodeGen/SelectionDAG/DAGCombiner.cpp:11158-11160
@@ -11156,1 +11157,5 @@
+  // Any pair of candidates here may cause a problem, but as all
+  // stores are on parallel chains so in the correct case, none of
+  // the nodes will be predecessors of any other. Check in parallel
+  SmallPtrSet<const SDNode *, 16> Visited;
This comment isn't very clear.

Comment at: lib/CodeGen/SelectionDAG/DAGCombiner.cpp:11166
@@ +11165,3 @@
+    SDNode *n = StoreNodes[i].MemNode;
+    for (unsigned j = 1; j < n->getNumOperands(); ++j)
+      Worklist.push_back(n->getOperand(j).getNode());
That you're skipping the chain operand deserves a mention, here.

Comment at: test/CodeGen/AArch64/vector_merge_dep_check.ll:12
@@ +11,3 @@
+  br i1 undef, label %polly.loop_header134, label %polly.cond184
Yes, I see that. It's just that there's a lot of (probably?) irrelevant metadata args which can be removed, variable names shortened/made clearer, possibly the loop could go away too.

And a comment in the test about what it is actually intending to test would be good, too.


More information about the llvm-commits mailing list