summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2011-12-27 12:41:51 +0100
committerTom Stellard <thomas.stellard@amd.com>2012-02-14 15:12:37 -0500
commit60d446949e57e39a017414278373051b34f5a843 (patch)
treef3513fc6b38cc6db70539a5f49912e8d17888e23
parent87b2bf603304501723ac72dc7f0eec8a240bbf17 (diff)
nv50/ir/opt: Add isOptSupported() check in logical arith optimization.
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp14
1 files changed, 6 insertions, 8 deletions
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp
index 4c412b85b41..7954986f667 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp
@@ -1042,6 +1042,9 @@ AlgebraicOpt::handleLOGOP(Instruction *logop)
// try AND(SET, SET) -> SET_AND(SET)
Instruction *set0 = src0->getInsn();
Instruction *set1 = src1->getInsn();
+ operation redop = (logop->op == OP_AND ? OP_SET_AND :
+ logop->op == OP_OR ? OP_SET_OR :
+ OP_SET_XOR);
if (!set0 || set0->fixed || !set1 || set1->fixed)
return;
@@ -1052,6 +1055,8 @@ AlgebraicOpt::handleLOGOP(Instruction *logop)
if (set1->op != OP_SET)
return;
}
+ if (!prog->getTarget()->isOpSupported(redop, set1->sType))
+ return;
if (set0->op != OP_SET &&
set0->op != OP_SET_AND &&
set0->op != OP_SET_OR &&
@@ -1077,14 +1082,7 @@ AlgebraicOpt::handleLOGOP(Instruction *logop)
set0->getDef(0)->reg.file = FILE_PREDICATE;
set0->getDef(0)->reg.size = 1;
set1->setSrc(2, set0->getDef(0));
- switch (logop->op) {
- case OP_AND: set1->op = OP_SET_AND; break;
- case OP_OR: set1->op = OP_SET_OR; break;
- case OP_XOR: set1->op = OP_SET_XOR; break;
- default:
- assert(0);
- break;
- }
+ set1->op = redop;
set1->setDef(0, logop->getDef(0));
delete_Instruction(prog, logop);
}