nv50/ir: check if the target supports the new offset before inlining
[mesa.git] / src / gallium / drivers / nouveau / codegen / nv50_ir_peephole.cpp
index 2f21257d88a0faa380e3e05689973f833a406349..805be5fcb40f105836723d26618f6ebaeb404718 100644 (file)
@@ -290,20 +290,23 @@ IndirectPropagation::visit(BasicBlock *bb)
             continue;
          if (insn->op == OP_ADD && !isFloatType(insn->dType)) {
             if (insn->src(0).getFile() != targ->nativeFile(FILE_ADDRESS) ||
-                !insn->src(1).getImmediate(imm))
+                !insn->src(1).getImmediate(imm) ||
+                !targ->insnCanLoadOffset(i, s, imm.reg.data.s32))
                continue;
             i->setIndirect(s, 0, insn->getSrc(0));
             i->setSrc(s, cloneShallow(func, i->getSrc(s)));
             i->src(s).get()->reg.data.offset += imm.reg.data.u32;
          } else if (insn->op == OP_SUB && !isFloatType(insn->dType)) {
             if (insn->src(0).getFile() != targ->nativeFile(FILE_ADDRESS) ||
-                !insn->src(1).getImmediate(imm))
+                !insn->src(1).getImmediate(imm) ||
+                !targ->insnCanLoadOffset(i, s, -imm.reg.data.s32))
                continue;
             i->setIndirect(s, 0, insn->getSrc(0));
             i->setSrc(s, cloneShallow(func, i->getSrc(s)));
             i->src(s).get()->reg.data.offset -= imm.reg.data.u32;
          } else if (insn->op == OP_MOV) {
-            if (!insn->src(0).getImmediate(imm))
+            if (!insn->src(0).getImmediate(imm) ||
+                !targ->insnCanLoadOffset(i, s, imm.reg.data.s32))
                continue;
             i->setIndirect(s, 0, NULL);
             i->setSrc(s, cloneShallow(func, i->getSrc(s)));