/* of all instructions do */
for (ic = ebbs[i]->sch; ic; ic = ic->next) {
- int i;
+#if 1
+ int reg;
// update the registers in use at the start of this icode
- for (i=0; i<8; i++) {
- if (regs8051[i].isFree) {
- ic->riu &= ~(1<<regs8051[i].offset);
+ for (reg=0; reg<mcs51_nRegs; reg++) {
+ if (regs8051[reg].isFree) {
+ ic->riu &= ~(1<<regs8051[reg].offset);
} else {
- ic->riu |= (1<<regs8051[i].offset);
+ ic->riu |= (1<<regs8051[reg].offset);
}
}
+#endif
/* if this is an ipop that means some live
range will have to be assigned again */
continue;
}
-#ifdef RANGEHUNT
- /* if this symbol has only one usage and that is an assignment
- to a ruonly, we don't need registers */
- // if this symbol has only one def
- if (bitVectnBitsOn (sym->defs)==1) {
- printf ("sym: %s has only one usage", sym->name);
- // find that usage
- if ((ic = hTabItemWithKey (iCodehTab, bitVectFirstBit (sym->defs)))) {
- if (ic->op==CALL) {
- printf (" for a call ");
- // if this is only assigned to a ruonly
- if ((ic = hTabItemWithKey (iCodehTab, bitVectFirstBit (sym->defs)))) {
- if (ic->op=='=') {
- if (OP_SYMBOL(IC_RESULT(ic))->ruonly) {
- printf("regTypeNum: %s assigned to %s\n", \
- sym->name, OP_SYMBOL(IC_RESULT(ic))->name);
- }
- }
- }
- }
- }
- }
-#endif
-
/* if the symbol has only one definition &
that definition is a get_pointer */
if (bitVectnBitsOn (sym->defs) == 1 &&
we cannot */
for (dic = ic->prev; dic; dic = dic->prev)
{
+
+#if 0 /* jwk: This collides with 1.43 but I really see no need for
+ this anymore. It fixes bug #716790 and substantially improves
+ redundant register usage around function calls.
+ */
+
/* if there is a function call then don't pack it */
if ((dic->op == CALL || dic->op == PCALL))
{
dic = NULL;
break;
}
+#endif
if (SKIP_IC2 (dic))
continue;
cast is remat, then we can remat this cast as well */
if (ic->op == CAST &&
IS_SYMOP(IC_RIGHT(ic)) &&
- OP_SYMBOL(IC_RIGHT(ic))->remat ) {
+ OP_SYMBOL(IC_RIGHT(ic))->remat &&
+ bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1) {
sym_link *to_type = operandType(IC_LEFT(ic));
sym_link *from_type = operandType(IC_RIGHT(ic));
if (IS_GENPTR(to_type) && IS_PTR(from_type)) {
serialRegAssign (ebbs, count);
freeAllRegs ();
- setToNull ((void *) &_G.regAssigned);
- setToNull ((void *) &_G.totRegAssigned);
+ //setToNull ((void *) &_G.regAssigned);
+ //setToNull ((void *) &_G.totRegAssigned);
fillGaps();
/* if stack was extended then tell the user */
createRegMask (ebbs, count);
/* redo that offsets for stacked automatic variables */
- redoStackOffsets ();
+ if (currFunc) {
+ redoStackOffsets ();
+ }
if (options.dump_rassgn)
{