nv50/ir: adjust overlapping logic to take fileIndex-relative offsets
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 24 Jun 2017 21:09:20 +0000 (17:09 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Tue, 27 Jun 2017 00:24:19 +0000 (20:24 -0400)
If the fileIndex is different, that means they are in logically
different spaces. However if there's also a relative offset, then they
could end up pointing at the same spot again.

Also add a note about potential for multiple buffers to overlap even if
they're at different file indexes. However that's potentially lowered
away by the point that this logic hits.

Not known to fix any specific application or test.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp

index c6dbd4fead4d86fe43f5610fa63065c878a09807..7c4420682a7c7b9984a24a0cc6f788a1372045d3 100644 (file)
@@ -2779,11 +2779,15 @@ MemoryOpt::Record::overlaps(const Instruction *ldst) const
    Record that;
    that.set(ldst);
 
-   if (this->fileIndex != that.fileIndex)
+   // This assumes that images/buffers can't overlap. They can.
+   // TODO: Plumb the restrict logic through, and only skip when it's a
+   // restrict situation, or there can implicitly be no writes.
+   if (this->fileIndex != that.fileIndex && this->rel[1] == that.rel[1])
       return false;
 
    if (this->rel[0] || that.rel[0])
       return this->base == that.base;
+
    return
       (this->offset < that.offset + that.size) &&
       (this->offset + this->size > that.offset);