diff options
author | Karol Herbst <[email protected]> | 2017-12-05 10:32:25 +0100 |
---|---|---|
committer | Karol Herbst <[email protected]> | 2018-02-26 14:41:58 +0100 |
commit | 2f07f823c9e5563156531057f1ea6e24670bba7f (patch) | |
tree | 95fac96f5451b82d9ce6381f9ab494462ca6d2df | |
parent | e05507a427b79e481eb8e45d7aa3c9b4b78376bf (diff) |
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 <[email protected]>
Signed-off-by: Karol Herbst <[email protected]>
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp | 34 |
1 files changed, 18 insertions, 16 deletions
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; + } } } } |