[PATCH] use register iterators that include self to reduce code duplication in CriticalAntiDepBreaker

Sanjay Patel spatel at rotateright.com
Thu Jul 17 10:27:10 PDT 2014


Hi atrick, hfinkel,

This patch addresses 2 FIXME comments that I added to CriticalAntiDepBreaker while fixing PR20020. 

I've initialized an MCSubRegIterator and an MCRegAliasIterator to include the self reg. 

Assuming that works as advertised, there should be functional difference with this patch, just less code.

http://reviews.llvm.org/D4566

Files:
  lib/CodeGen/CriticalAntiDepBreaker.cpp

Index: lib/CodeGen/CriticalAntiDepBreaker.cpp
===================================================================
--- lib/CodeGen/CriticalAntiDepBreaker.cpp
+++ lib/CodeGen/CriticalAntiDepBreaker.cpp
@@ -265,21 +265,15 @@
       // Ignore two-addr defs.
       if (MI->isRegTiedToUseOperand(i)) continue;
 
-      // FIXME: we should use a SubRegIterator that includes self (as above), so
-      // we don't have to repeat all this code for the reg itself.
-      DefIndices[Reg] = Count;
-      KillIndices[Reg] = ~0u;
-      assert(((KillIndices[Reg] == ~0u) !=
-              (DefIndices[Reg] == ~0u)) &&
-             "Kill and Def maps aren't consistent for Reg!");
-      KeepRegs.reset(Reg);
-      Classes[Reg] = nullptr;
-      RegRefs.erase(Reg);
-      // Repeat, for all subregs.
-      for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
-        unsigned SubregReg = *SubRegs;
+      // For the reg itself and all subregs: update the def to current;
+      // reset the kill state, any restrictions, and references.
+      for (MCSubRegIterator SRI(Reg, TRI, true); SRI.isValid(); ++SRI) {
+        unsigned SubregReg = *SRI;
         DefIndices[SubregReg] = Count;
         KillIndices[SubregReg] = ~0u;
+        assert(((KillIndices[SubregReg] == ~0u) !=
+                (DefIndices[SubregReg] == ~0u)) &&
+               "Kill and Def maps aren't consistent for Reg!");
         KeepRegs.reset(SubregReg);
         Classes[SubregReg] = nullptr;
         RegRefs.erase(SubregReg);
@@ -309,23 +303,16 @@
 
     RegRefs.insert(std::make_pair(Reg, &MO));
 
-    // FIXME: we should use an MCRegAliasIterator that includes self so we don't
-    // have to repeat all this code for the reg itself.
-    
     // It wasn't previously live but now it is, this is a kill.
-    if (KillIndices[Reg] == ~0u) {
-      KillIndices[Reg] = Count;
-      DefIndices[Reg] = ~0u;
-          assert(((KillIndices[Reg] == ~0u) !=
-                  (DefIndices[Reg] == ~0u)) &&
-               "Kill and Def maps aren't consistent for Reg!");
-    }
-    // Repeat, for all aliases.
-    for (MCRegAliasIterator AI(Reg, TRI, false); AI.isValid(); ++AI) {
+    // Repeat for all aliases.
+    for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
       unsigned AliasReg = *AI;
       if (KillIndices[AliasReg] == ~0u) {
         KillIndices[AliasReg] = Count;
         DefIndices[AliasReg] = ~0u;
+        assert(((KillIndices[AliasReg] == ~0u) !=
+                (DefIndices[AliasReg] == ~0u)) &&
+               "Kill and Def maps aren't consistent for Reg!");
       }
     }
   }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4566.11589.patch
Type: text/x-patch
Size: 2617 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140717/dd2f7c7e/attachment.bin>


More information about the llvm-commits mailing list