mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-31 12:00:12 +01:00
nv50/ir: fix assumption that prog->maxGPR is in 32-bit reg units
On NV50, we use 16-bit reg units (to make it all work with half-regs). A few places assumed that it was always in 32-bit units. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
d640f179d3
commit
a27548400e
2 changed files with 21 additions and 4 deletions
|
|
@ -1225,7 +1225,7 @@ NV50LoweringPreSSA::handleEXPORT(Instruction *i)
|
|||
i->setDef(0, new_LValue(func, FILE_GPR));
|
||||
i->getDef(0)->reg.data.id = id;
|
||||
|
||||
prog->maxGPR = MAX2(prog->maxGPR, id);
|
||||
prog->maxGPR = MAX2(prog->maxGPR, id * 2);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -2532,6 +2532,7 @@ MemoryOpt::runOpt(BasicBlock *bb)
|
|||
class FlatteningPass : public Pass
|
||||
{
|
||||
private:
|
||||
virtual bool visit(Function *);
|
||||
virtual bool visit(BasicBlock *);
|
||||
|
||||
bool tryPredicateConditional(BasicBlock *);
|
||||
|
|
@ -2540,6 +2541,8 @@ private:
|
|||
inline bool isConstantCondition(Value *pred);
|
||||
inline bool mayPredicate(const Instruction *, const Value *pred) const;
|
||||
inline void removeFlow(Instruction *);
|
||||
|
||||
uint8_t gpr_unit;
|
||||
};
|
||||
|
||||
bool
|
||||
|
|
@ -2561,9 +2564,15 @@ FlatteningPass::isConstantCondition(Value *pred)
|
|||
file = ld->src(0).getFile();
|
||||
} else {
|
||||
file = insn->src(s).getFile();
|
||||
// catch $r63 on NVC0
|
||||
if (file == FILE_GPR && insn->getSrc(s)->reg.data.id > prog->maxGPR)
|
||||
file = FILE_IMMEDIATE;
|
||||
// catch $r63 on NVC0 and $r63/$r127 on NV50. Unfortunately maxGPR is
|
||||
// in register "units", which can vary between targets.
|
||||
if (file == FILE_GPR) {
|
||||
Value *v = insn->getSrc(s);
|
||||
int bytes = v->reg.data.id * MIN2(v->reg.size, 4);
|
||||
int units = bytes >> gpr_unit;
|
||||
if (units > prog->maxGPR)
|
||||
file = FILE_IMMEDIATE;
|
||||
}
|
||||
}
|
||||
if (file != FILE_IMMEDIATE && file != FILE_MEMORY_CONST)
|
||||
return false;
|
||||
|
|
@ -2668,6 +2677,14 @@ FlatteningPass::tryPropagateBranch(BasicBlock *bb)
|
|||
}
|
||||
}
|
||||
|
||||
bool
|
||||
FlatteningPass::visit(Function *fn)
|
||||
{
|
||||
gpr_unit = prog->getTarget()->getFileUnit(FILE_GPR);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
FlatteningPass::visit(BasicBlock *bb)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue