diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-11-08 21:57:44 +0000 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2011-11-14 09:12:02 -0800 |
commit | e67e6f16c005165232cf46e2fc0d77e6a7ed7dbf (patch) | |
tree | 50c350152af572165d7952eb70a41acbfe472657 /lib | |
parent | b213765260884e182eb3cf4867181c66a7eb4f83 (diff) | |
download | external_llvm-e67e6f16c005165232cf46e2fc0d77e6a7ed7dbf.zip external_llvm-e67e6f16c005165232cf46e2fc0d77e6a7ed7dbf.tar.gz external_llvm-e67e6f16c005165232cf46e2fc0d77e6a7ed7dbf.tar.bz2 |
Handle reference counts in one function: release().
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/ExecutionDepsFix.cpp | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/lib/CodeGen/ExecutionDepsFix.cpp b/lib/CodeGen/ExecutionDepsFix.cpp index 5aa80f9..b4f99b9 100644 --- a/lib/CodeGen/ExecutionDepsFix.cpp +++ b/lib/CodeGen/ExecutionDepsFix.cpp @@ -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. |