diff options
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index 7c4420682a7..df83f18ae83 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -2486,6 +2486,10 @@ MemoryOpt::combineLd(Record *rec, Instruction *ld) assert(sizeRc + sizeLd <= 16 && offRc != offLd); + // lock any stores that overlap with the load being merged into the + // existing record. + lockStores(ld); + for (j = 0; sizeRc; sizeRc -= rec->insn->getDef(j)->reg.size, ++j); if (offLd < offRc) { @@ -2542,6 +2546,10 @@ MemoryOpt::combineSt(Record *rec, Instruction *st) if (prog->getType() == Program::TYPE_COMPUTE && rec->rel[0]) return false; + // remove any existing load/store records for the store being merged into + // the existing record. + purgeRecords(st, DATA_FILE_COUNT); + st->takeExtraSources(0, extra); // save predicate and indirect address if (offRc < offSt) { |