Dereferencing ChildIteratorType needs to return a NodeRef, not succ_iterator.<br><br><div class="gmail_quote"><div dir="ltr">On Thu, Aug 11, 2016, 18:06 Adam Nemet <<a href="mailto:anemet@apple.com">anemet@apple.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">anemet added inline comments.<br>
<br>
================<br>
Comment at: lib/Transforms/Vectorize/LoopVectorize.cpp:262-265<br>
@@ +261,6 @@<br>
+<br>
+  static NodeRef getEntryNode(const Loop &G) { return {&G, G.getHeader()}; }<br>
+<br>
+  static ChildIteratorType child_begin(NodeRef Node) {<br>
+    return make_filter_range(make_range<WrappedSuccIterator>(<br>
+                                 {succ_begin(Node.second), Node.first},<br>
----------------<br>
I am not sure we're talking about the same thing.  I meant:<br>
<br>
  return make_filter_range(make_range<succ_iterator>(<br>
                                            succ_begin(Node.second),<br>
                                            succ_end(Node.second)),<br>
                                          LoopBodyFilter(Node.first))<br>
<br>
and then:<br>
<br>
  struct LoopBodyFilter {<br>
    LoopBodyFitler(Loop *L) : L(L) {}<br>
    bool operator()(BasicBlock *BB) const {<br>
      return BB != L->getHeader() && L->contains(BB);<br>
    }<br>
    Loop *L;<br>
  };<br>
<br>
?<br>
<br>
In other words, it does not seem any different to me whether you attach the loop to the succ_iterator or the filter object.<br>
<br>
<br>
<a href="https://reviews.llvm.org/D22952" rel="noreferrer" target="_blank">https://reviews.llvm.org/D22952</a><br>
<br>
<br>
<br>
</blockquote></div>