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 <samuel.pitoiset@gmail.com>
Signed-off-by: Karol Herbst <kherbst@redhat.com>
This commit is contained in:
Karol Herbst 2017-12-05 10:32:25 +01:00
parent e05507a427
commit 2f07f823c9

View file

@ -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;
}
}
}
}