From: Karol Herbst Date: Tue, 5 Dec 2017 09:32:25 +0000 (+0100) Subject: nvir/gm107: iterate over all defs in SchedDataCalculatorGM107::findFirstUse X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2f07f823c9e5563156531057f1ea6e24670bba7f;p=mesa.git nvir/gm107: iterate over all defs in SchedDataCalculatorGM107::findFirstUse In the sched data calculator we have to track first use of defs by iterating over all defs of an instruction, not just the first one. v2: fix minGRP and maxGRP values Reviewed-by: Samuel Pitoiset Signed-off-by: Karol Herbst --- diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp index b1e9f941fe8..96bd2768845 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp @@ -3956,31 +3956,33 @@ Instruction * SchedDataCalculatorGM107::findFirstUse(const Instruction *bari) const { Instruction *insn, *next; - int minGPR, maxGPR; if (!bari->defExists(0)) return NULL; - minGPR = bari->def(0).rep()->reg.data.id; - maxGPR = minGPR + bari->def(0).rep()->reg.size / 4 - 1; - for (insn = bari->next; insn != NULL; insn = next) { next = insn->next; for (int s = 0; insn->srcExists(s); ++s) { const Value *src = insn->src(s).rep(); - if (bari->def(0).getFile() == FILE_GPR) { - if (insn->src(s).getFile() != FILE_GPR || - src->reg.data.id + src->reg.size / 4 - 1 < minGPR || - src->reg.data.id > maxGPR) - continue; - return insn; - } else - if (bari->def(0).getFile() == FILE_PREDICATE) { - if (insn->src(s).getFile() != FILE_PREDICATE || - src->reg.data.id != minGPR) - continue; - return insn; + for (int d = 0; bari->defExists(d); ++d) { + const ValueDef &def = bari->def(d); + int minGPR = def.rep()->reg.data.id; + int maxGPR = minGPR + def.rep()->reg.size / 4 - 1; + + if (def.getFile() == FILE_GPR) { + if (insn->src(s).getFile() != FILE_GPR || + src->reg.data.id + src->reg.size / 4 - 1 < minGPR || + src->reg.data.id > maxGPR) + continue; + return insn; + } else + if (def.getFile() == FILE_PREDICATE) { + if (insn->src(s).getFile() != FILE_PREDICATE || + src->reg.data.id != minGPR) + continue; + return insn; + } } } }