<div dir="ltr">Could you add a unit test (with comments describing the use case) so this isn't accidentally broken later?<br><br>Would it be possible to refactor the begin/end as ADL begin/end so they'd work with range-based for? (Or I guess that doesn't work - iteration over the basic block's phis is a separate range from iterating over the basic block's instructions? (so there's no authoritative begin/end to provide)) Perhaps it could be refactored as a range type/functor/function instead? (not sure if that's better)<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 13, 2016 at 3:41 PM, Bob Wilson via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">bob.wilson created this revision.<br>
bob.wilson added reviewers: joker.eph, dexonsmith.<br>
bob.wilson added a subscriber: llvm-commits.<br>
Herald added a subscriber: mcrosier.<br>
<br>
The SSAUpdater is already implemented as a template so that we can reuse it for both IR-level and Machine-level updates. This simple change adds a new PhiItT typedef to the traits so that it can also be used for Swift's SIL representation, where phis are separate from other instructions.<br>
<br>
<a href="http://reviews.llvm.org/D19080" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19080</a><br>
<br>
Files:<br>
  include/llvm/Transforms/Utils/SSAUpdaterImpl.h<br>
  lib/CodeGen/MachineSSAUpdater.cpp<br>
  lib/Transforms/Utils/SSAUpdater.cpp<br>
<br>
Index: lib/Transforms/Utils/SSAUpdater.cpp<br>
===================================================================<br>
--- lib/Transforms/Utils/SSAUpdater.cpp<br>
+++ lib/Transforms/Utils/SSAUpdater.cpp<br>
@@ -216,6 +216,11 @@<br>
   static BlkSucc_iterator BlkSucc_begin(BlkT *BB) { return succ_begin(BB); }<br>
   static BlkSucc_iterator BlkSucc_end(BlkT *BB) { return succ_end(BB); }<br>
<br>
+  /// Iterator over phis in a block.<br>
+  typedef BlkT::iterator PhiItT;<br>
+  static PhiItT PhiItT_begin(BlkT *BB) { return BB->begin(); }<br>
+  static PhiItT PhiItT_end(BlkT *BB) { return BB->end(); }<br>
+<br>
   class PHI_iterator {<br>
   private:<br>
     PHINode *PHI;<br>
Index: lib/CodeGen/MachineSSAUpdater.cpp<br>
===================================================================<br>
--- lib/CodeGen/MachineSSAUpdater.cpp<br>
+++ lib/CodeGen/MachineSSAUpdater.cpp<br>
@@ -246,6 +246,11 @@<br>
   static BlkSucc_iterator BlkSucc_begin(BlkT *BB) { return BB->succ_begin(); }<br>
   static BlkSucc_iterator BlkSucc_end(BlkT *BB) { return BB->succ_end(); }<br>
<br>
+  /// Iterator over phis in a block.<br>
+  typedef BlkT::iterator PhiItT;<br>
+  static PhiItT PhiItT_begin(BlkT *BB) { return BB->begin(); }<br>
+  static PhiItT PhiItT_end(BlkT *BB) { return BB->end(); }<br>
+<br>
   /// Iterator for PHI operands.<br>
   class PHI_iterator {<br>
   private:<br>
Index: include/llvm/Transforms/Utils/SSAUpdaterImpl.h<br>
===================================================================<br>
--- include/llvm/Transforms/Utils/SSAUpdaterImpl.h<br>
+++ include/llvm/Transforms/Utils/SSAUpdaterImpl.h<br>
@@ -39,6 +39,7 @@<br>
   typedef typename Traits::BlkT BlkT;<br>
   typedef typename Traits::ValT ValT;<br>
   typedef typename Traits::PhiT PhiT;<br>
+  typedef typename Traits::PhiItT PhiItT;<br>
<br>
   /// BBInfo - Per-basic block information used internally by SSAUpdaterImpl.<br>
   /// The predecessors of each block are cached here since pred_iterator is<br>
@@ -377,7 +378,7 @@<br>
   /// FindExistingPHI - Look through the PHI nodes in a block to see if any of<br>
   /// them match what is needed.<br>
   void FindExistingPHI(BlkT *BB, BlockListTy *BlockList) {<br>
-    for (typename BlkT::iterator BBI = BB->begin(), BBE = BB->end();<br>
+    for (PhiItT BBI = Traits::PhiItT_begin(BB), BBE = Traits::PhiItT_end(BB);<br>
          BBI != BBE; ++BBI) {<br>
       PhiT *SomePHI = Traits::InstrIsPHI(&*BBI);<br>
       if (!SomePHI)<br>
<br>
<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div>