From: Tom Stellard Date: Fri, 14 May 2010 00:15:49 +0000 (+0200) Subject: r300/compiler: fix peephole optimizer X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9d3c57281e4fe3842b41578c65bab5a6e23d76c8;p=mesa.git r300/compiler: fix peephole optimizer Tested-by: Marek Olšák --- diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c index 80e3eeacfc1..fd608ccb72a 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c @@ -82,6 +82,18 @@ static void peephole_scan_read(void * data, struct rc_instruction * inst, if (file != RC_FILE_TEMPORARY || index != s->Mov->U.I.DstReg.Index) return; + /* These instructions cannot read from the constants file. + * see radeonTransformTEX() + */ + if(s->Mov->U.I.SrcReg[0].File != RC_FILE_TEMPORARY && + s->Mov->U.I.SrcReg[0].File != RC_FILE_INPUT && + (inst->U.I.Opcode == RC_OPCODE_TEX || + inst->U.I.Opcode == RC_OPCODE_TXB || + inst->U.I.Opcode == RC_OPCODE_TXP || + inst->U.I.Opcode == RC_OPCODE_KIL)){ + s->Conflict = 1; + return; + } if ((mask & s->MovMask) == mask) { if (s->SourceClobbered) { s->Conflict = 1; @@ -109,7 +121,8 @@ static void peephole_scan_write(void * data, struct rc_instruction * inst, s->DefinedMask |= mask; else s->DefinedMask &= ~mask; - } else if (file == s->Mov->U.I.SrcReg[0].File && index == s->Mov->U.I.SrcReg[0].Index) { + } + if (file == s->Mov->U.I.SrcReg[0].File && index == s->Mov->U.I.SrcReg[0].Index) { if (mask & s->SourcedMask) s->SourceClobbered = 1; } else if (s->Mov->U.I.SrcReg[0].RelAddr && file == RC_FILE_ADDRESS) {