mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
nv50/ir/util: fix BitSet issues
BitSet::allocate() is being used with the expectation that it would leave the bitfield untouched if its size hasn't changed, however, the function always zeroed the last word, which led to obscure bugs with live set computation. This also fixes BitSet::resize(), which was broken, but luckily not being used. Cc: "10.2 10.3" <mesa-stable@lists.freedesktop.org> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
a71380040c
commit
b9f9e3ce03
3 changed files with 10 additions and 3 deletions
|
|
@ -1657,6 +1657,10 @@ RegAlloc::execFunc()
|
|||
ret && i <= func->loopNestingBound;
|
||||
sequence = func->cfg.nextSequence(), ++i)
|
||||
ret = buildLiveSets(BasicBlock::get(func->cfg.getRoot()));
|
||||
// reset marker
|
||||
for (ArrayList::Iterator bi = func->allBBlocks.iterator();
|
||||
!bi.end(); bi.next())
|
||||
BasicBlock::get(bi)->liveSet.marker = false;
|
||||
if (!ret)
|
||||
break;
|
||||
func->orderInstructions(this->insns);
|
||||
|
|
|
|||
|
|
@ -254,7 +254,9 @@ bool BitSet::resize(unsigned int nBits)
|
|||
return false;
|
||||
}
|
||||
if (n > p)
|
||||
memset(&data[4 * p + 4], 0, (n - p) * 4);
|
||||
memset(&data[p], 0, (n - p) * 4);
|
||||
if (nBits < size && (nBits % 32))
|
||||
data[(nBits + 31) / 32 - 1] &= (1 << (nBits % 32)) - 1;
|
||||
|
||||
size = nBits;
|
||||
return true;
|
||||
|
|
@ -274,8 +276,8 @@ bool BitSet::allocate(unsigned int nBits, bool zero)
|
|||
if (zero)
|
||||
memset(data, 0, (size + 7) / 8);
|
||||
else
|
||||
if (nBits)
|
||||
data[(size + 31) / 32 - 1] = 0; // clear unused bits (e.g. for popCount)
|
||||
if (size % 32) // clear unused bits (e.g. for popCount)
|
||||
data[(size + 31) / 32 - 1] &= (1 << (size % 32)) - 1;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -484,6 +484,7 @@ public:
|
|||
FREE(data);
|
||||
}
|
||||
|
||||
// allocate will keep old data iff size is unchanged
|
||||
bool allocate(unsigned int nBits, bool zero);
|
||||
bool resize(unsigned int nBits); // keep old data, zero additional bits
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue