diff options
author | Francisco Jerez <currojerez@riseup.net> | 2011-12-27 12:41:51 +0100 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2012-02-14 15:12:37 -0500 |
commit | 60d446949e57e39a017414278373051b34f5a843 (patch) | |
tree | f3513fc6b38cc6db70539a5f49912e8d17888e23 | |
parent | 87b2bf603304501723ac72dc7f0eec8a240bbf17 (diff) |
nv50/ir/opt: Add isOptSupported() check in logical arith optimization.
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp | 14 |
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); } |