Handle reference counts in one function: release().
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 8 Nov 2011 21:57:44 +0000 (21:57 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 8 Nov 2011 21:57:44 +0000 (21:57 +0000)
This new function will decrement the reference count, and collapse a
domain value when the last reference is gone.

This simplifies DomainValue reference counting, and decouples it from
the LiveRegs array.

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

lib/CodeGen/ExecutionDepsFix.cpp

index 5aa80f9a0674a17ad59534f0640e24ca4f0e7c1d..b4f99b98a28ae05645823cda3a94f8dc0dea1210 100644 (file)
@@ -139,7 +139,7 @@ private:
 
   // DomainValue allocation.
   DomainValue *Alloc(int domain = -1);
-  void Recycle(DomainValue*);
+  void release(DomainValue*);
 
   // LiveRegs manipulations.
   void SetLiveReg(int rx, DomainValue *DV);
@@ -176,10 +176,19 @@ DomainValue *ExeDepsFix::Alloc(int domain) {
   return dv;
 }
 
-void ExeDepsFix::Recycle(DomainValue *dv) {
-  assert(dv && "Cannot recycle NULL");
-  dv->clear();
-  Avail.push_back(dv);
+/// release - Release a reference to DV.  When the last reference is released,
+/// collapse if needed.
+void ExeDepsFix::release(DomainValue *DV) {
+  assert(DV && DV->Refs && "Bad DomainValue");
+  if (--DV->Refs)
+    return;
+
+  // There are no more DV references. Collapse any contained instructions.
+  if (DV->AvailableDomains && !DV->isCollapsed())
+    Collapse(DV, DV->getFirstDomain());
+
+  DV->clear();
+  Avail.push_back(DV);
 }
 
 /// Set LiveRegs[rx] = dv, updating reference counts.
@@ -192,10 +201,8 @@ void ExeDepsFix::SetLiveReg(int rx, DomainValue *dv) {
 
   if (LiveRegs[rx] == dv)
     return;
-  if (LiveRegs[rx]) {
-    assert(LiveRegs[rx]->Refs && "Bad refcount");
-    if (--LiveRegs[rx]->Refs == 0) Recycle(LiveRegs[rx]);
-  }
+  if (LiveRegs[rx])
+    release(LiveRegs[rx]);
   LiveRegs[rx] = dv;
   if (dv) ++dv->Refs;
 }
@@ -205,12 +212,8 @@ void ExeDepsFix::Kill(int rx) {
   assert(unsigned(rx) < NumRegs && "Invalid index");
   if (!LiveRegs || !LiveRegs[rx]) return;
 
-  // Before killing the last reference to an open DomainValue, collapse it to
-  // the first available domain.
-  if (LiveRegs[rx]->Refs == 1 && !LiveRegs[rx]->isCollapsed())
-    Collapse(LiveRegs[rx], LiveRegs[rx]->getFirstDomain());
-  else
-    SetLiveReg(rx, 0);
+  release(LiveRegs[rx]);
+  LiveRegs[rx] = 0;
 }
 
 /// Force register rx into domain.