+ vec_remove(block->instr, i, 1);
+ ir_instr_delete(store);
+ }
+ else if (inst->opcode == VINSTR_COND)
+ {
+ /* COND on a value resulting from a NOT could
+ * remove the NOT and swap its operands
+ */
+ while (true) {
+ ir_block *tmp;
+ size_t inotid;
+ ir_instr *inot;
+ ir_value *value;
+ value = inst->_ops[0];
+
+ if (value->store != store_value ||
+ vec_size(value->reads) != 1 ||
+ value->reads[0] != inst)
+ {
+ break;
+ }
+
+ inot = value->writes[0];
+ if (inot->_ops[0] != value ||
+ inot->opcode < INSTR_NOT_F ||
+ inot->opcode > INSTR_NOT_FNC ||
+ inot->opcode == INSTR_NOT_V) /* can't do this one */
+ {
+ break;
+ }
+
+ /* count */
+ ++opts_optimizationcount[OPTIM_PEEPHOLE];
+ /* change operand */
+ (void)!ir_instr_op(inst, 0, inot->_ops[1], false);
+ /* remove NOT */
+ tmp = inot->owner;
+ for (inotid = 0; inotid < vec_size(tmp->instr); ++inotid) {
+ if (tmp->instr[inotid] == inot)
+ break;
+ }
+ if (inotid >= vec_size(tmp->instr)) {
+ compile_error(inst->context, "sanity-check failed: failed to find instruction to optimize out");
+ return false;
+ }
+ vec_remove(tmp->instr, inotid, 1);
+ ir_instr_delete(inot);
+ /* swap ontrue/onfalse */
+ tmp = inst->bops[0];
+ inst->bops[0] = inst->bops[1];
+ inst->bops[1] = tmp;
+ }
+ continue;
+ }