[Mono-dev] [PATCH]: Fix double-insn emit bug on Sparc.

David Miller davem at davemloft.net
Mon Nov 12 18:46:38 EST 2007


While rewriting the instruction list handling I discovered
some cases on the sparc instruction selecter that would
accidently emit an instruction twice.

This worked silently because these instructions nearly always appear
at the begininng of a basic block and by accident a double emit of the
first instruction works because of the existing instruction list
implementation.

I audited other code for similar cases of the form:

	MONO_EMIT_* (X, Y ...
	mono_bblock_add_inst(X->cbb, Y);

but could not find any.  It's worth a second check if someone
is so inclined.

2007-11-12  David S. Miller  <davem at davemloft.net>

	* inssel-sparc.brg: Fix double instruction emit.

--- mono/mini/inssel-sparc.brg	(revision 89301)
+++ mono/mini/inssel-sparc.brg	(working copy)
@@ -570,13 +570,11 @@
 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4(base)) {
 	MONO_EMIT_LOAD_MEMBASE (s, tree, state->left->tree->dreg, state->right->left->tree->inst_basereg, 
 				state->right->left->tree->inst_offset);	
-	mono_bblock_add_inst (s->cbb, tree);
 }
 
 stmt: CEE_STIND_REF (OP_REGVAR, CEE_LDIND_REF(base)) {
 	MONO_EMIT_LOAD_MEMBASE (s, tree, state->left->tree->dreg, state->right->left->tree->inst_basereg, 
 				state->right->left->tree->inst_offset);	
-	mono_bblock_add_inst (s->cbb, tree);
 }
 
 stmt: OP_SETRET (CEE_LDIND_I1(base)),
@@ -589,7 +587,6 @@
 stmt: OP_SETRET (CEE_LDIND_U4(base)) {
 	MONO_EMIT_LOAD_MEMBASE_OP (s, tree, ldind_to_load_membase (state->left->tree->opcode), 
 		sparc_i0, state->left->left->tree->inst_basereg, state->left->left->tree->inst_offset);	
-	mono_bblock_add_inst (s->cbb, tree);
 }
 
 stmt: OP_SETRET (CEE_LDIND_I4(OP_REGVAR)) {
@@ -624,7 +621,6 @@
 	int dreg = mono_regstate_next_int (s->rs);
 	MONO_EMIT_LOAD_MEMBASE (s, tree, dreg, state->left->left->tree->inst_basereg, 
 				state->left->left->tree->inst_offset);	
-	mono_bblock_add_inst (s->cbb, tree);
 
 	mono_call_inst_add_outarg_reg (s, call, dreg, tree->backend.reg3, FALSE);
 }
@@ -635,7 +631,6 @@
 	int dreg = mono_regstate_next_int (s->rs);
 	MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI4_MEMBASE, dreg, state->left->left->tree->inst_basereg, 
 				state->left->left->tree->inst_offset);	
-	mono_bblock_add_inst (s->cbb, tree);
 
 	mono_call_inst_add_outarg_reg (s, call, dreg, tree->backend.reg3, FALSE);
 }
@@ -647,8 +642,8 @@
 		tree->opcode = OP_MOVE;
 		tree->sreg1 = state->left->tree->inst_basereg;
 		tree->dreg = state->reg1;
+		mono_bblock_add_inst (s->cbb, tree);
 	}
-	mono_bblock_add_inst (s->cbb, tree);
 }
 
 lreg: OP_LNEG (lreg) "3" {



More information about the Mono-devel-list mailing list