- assert(opcode->code == (unsigned) ARR_LEN(irp->opcodes) && "new_ir_op() called in wrong order");
- ARR_APP1(ir_op *, irp->opcodes, opcode);
+ len = ARR_LEN(irp->opcodes);
+ code = opcode->code;
+ if ((int) code >= len) {
+ ARR_RESIZE(ir_op*, irp->opcodes, code+1);
+ memset(&irp->opcodes[len], 0, (code-len+1) * sizeof(irp->opcodes[0]));
+ }
+
+ assert(irp->opcodes[code] == NULL && "opcode registered twice");
+ irp->opcodes[code] = opcode;