}
// Track writes in predicates
- if (insn.opcode == SEL_OP_CMP || insn.opcode == SEL_OP_I64CMP) {
+ if (insn.opcode == SEL_OP_CMP || insn.opcode == SEL_OP_I64CMP || insn.state.modFlag) {
const uint32_t index = this->getIndex(getFlag(insn));
this->nodes[index] = node;
}
tracker.addDependency(node, insn.dst(dstID));
// write-after-write for predicate
- if (insn.opcode == SEL_OP_CMP || insn.opcode == SEL_OP_I64CMP)
+ if (insn.opcode == SEL_OP_CMP || insn.opcode == SEL_OP_I64CMP || insn.state.modFlag)
tracker.addDependency(node, getFlag(insn));
// write-after-write for accumulators
// Make labels and branches non-schedulable (i.e. they act as barriers)
for (int32_t insnID = 0; insnID < insnNum; ++insnID) {
ScheduleDAGNode *node = tracker.insnNodes[insnID];
- if (node->insn.isBranch() || node->insn.isLabel() || node->insn.opcode == SEL_OP_EOT)
+ if (node->insn.isBranch() || node->insn.isLabel() || node->insn.opcode == SEL_OP_EOT || node->insn.opcode == SEL_OP_IF)
tracker.makeBarrier(insnID, insnNum);
}