if (!(sym->remat || sym->usl.spillLoc))
createStackSpil (sym);
-
/* mark it has spilt & put it in the spilt set */
sym->isspilt = sym->spillA = 1;
_G.spiltSet = bitVectSetBit (_G.spiltSet, sym->key);
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 &&
/* and that pointer is remat in data space */
- if (OP_SYMBOL (IC_LEFT (ic))->remat &&
+ if (IS_SYMOP (IC_LEFT (ic)) &&
+ OP_SYMBOL (IC_LEFT (ic))->remat &&
!IS_CAST_ICODE(OP_SYMBOL (IC_LEFT (ic))->rematiCode) &&
DCL_TYPE (aggrToPtr (operandType(IC_LEFT(ic)), FALSE)) == POINTER)
{
/* now this really is an assignment to itself, make it so;
it will be optimized out later */
ic->op='=';
- IC_RIGHT(ic)=IC_RESULT(ic);
+ ReplaceOpWithCheaperOp(&IC_RIGHT(ic), IC_RESULT(ic));
IC_LEFT(ic)=NULL;
#endif
continue;
/* registers for true symbols we will */
/* see how things go */
sym->nRegs = 0;
- }
+ }
}
packRegsForAssign (iCode * ic, eBBlock * ebp)
{
iCode *dic, *sic;
- //sym_link *etype = operandType (IC_RIGHT (ic));
if (!IS_ITEMP (IC_RIGHT (ic)) ||
OP_SYMBOL (IC_RIGHT (ic))->isind ||
- OP_LIVETO (IC_RIGHT (ic)) > ic->seq
- /* why? || IS_BITFIELD (etype) */ )
+ OP_LIVETO (IC_RIGHT (ic)) > ic->seq)
{
return 0;
}
+
/* if the true symbol is defined in far space or on stack
then we should not since this will increase register pressure */
if (isOperandInFarSpace(IC_RESULT(ic)) && !farSpacePackable(ic)) {
{
sym_link *etype = operandType (IC_RIGHT (dic));
if (IS_BITFIELD (etype))
- return 0;
+ {
+ /* if result is a bit too then it's ok */
+ etype = operandType (IC_RESULT (dic));
+ if (!IS_BITFIELD (etype))
+ return 0;
+ }
}
/* if the result is on stack or iaccess then it must be
the same atleast one of the operands */
/* replace the result with the result of */
/* this assignment and remove this assignment */
bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
- IC_RESULT (dic) = IC_RESULT (ic);
+ ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
if (IS_ITEMP (IC_RESULT (dic)) && OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq)
{
OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq;
}
+ // TODO: and the otherway around?
+
/* delete from liverange table also
delete from all the points inbetween and the new
one */
remiCodeFromeBBlock (ebp, ic);
bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
- OP_DEFS_SET ((IC_RESULT (dic)), bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key));
+ OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
return 1;
-
}
/*------------------------------------------------------------------*/
/* update the sym's liverange */
if ( OP_LIVETO(op) < ic->seq )
- setToRange(op, ic->seq, FALSE);
+ setToRange(op, ic->seq, FALSE, OP_SYMBOL(op)->level);
/* remove the assignment iCode now that its result is unused */
remiCodeFromeBBlock (ebp, assignment);
OP_SYMBOL (op)->ruonly = 1;
return sic;
-
}
/*-----------------------------------------------------------------*/
return ;
}
/* make sure they have the same type */
+ if (IS_SPEC(operandType(IC_LEFT(ic))))
{
sym_link *itype=operandType(IC_LEFT(ic));
sym_link *ditype=operandType(IC_RIGHT(dic));
/* we now we know that it has one & only one def & use
and the that the definition is an assignment */
- IC_LEFT (ic) = IC_RIGHT (dic);
+ ReplaceOpWithCheaperOp(&IC_LEFT (ic), IC_RIGHT (dic));
remiCodeFromeBBlock (ebp, dic);
hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
}
if (POINTER_SET (ic))
OP_SYMBOL (IC_RESULT (ic))->uptr = 1;
- if (POINTER_GET (ic))
+ if (POINTER_GET (ic) &&
+ IS_SYMOP(IC_LEFT (ic)))
OP_SYMBOL (IC_LEFT (ic))->uptr = 1;
if (!SKIP_IC2 (ic))
if ((ic->op == RETURN || (ic->op == SEND && ic->argreg == 1)) &&
!isOperandInFarSpace (IC_LEFT (ic)) &&
options.model == MODEL_SMALL) {
- if (0 && options.stackAuto) {
- /* we should check here if acc will be clobbered for stack
- offset calculations */
- } else {
- packRegsForOneuse (ic, IC_LEFT (ic), ebp);
- }
+ packRegsForOneuse (ic, IC_LEFT (ic), ebp);
}
/* if pointer set & left has a size more than
!OP_SYMBOL (IC_RESULT (ic))->remat &&
!IS_OP_RUONLY (IC_RIGHT (ic)) &&
getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1)
-
packRegsForOneuse (ic, IC_RESULT (ic), ebp);
/* if pointer get */
if (POINTER_GET (ic) &&
+ IS_SYMOP (IC_LEFT (ic)) &&
!isOperandInFarSpace (IC_RESULT (ic)) &&
!OP_SYMBOL (IC_LEFT (ic))->remat &&
!IS_OP_RUONLY (IC_RESULT (ic)) &&
getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1)
-
packRegsForOneuse (ic, IC_LEFT (ic), ebp);
if (IS_ARITHMETIC_OP (dic))
{
bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
- IC_RESULT (dic) = IC_RESULT (ic);
+ ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
remiCodeFromeBBlock (ebp, ic);
bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
- OP_DEFS_SET ((IC_RESULT (dic)), bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key));
+ OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
ic = ic->prev;
}
else
if (dic)
{
bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
- IC_RESULT (dic) = IC_RESULT (ic);
+ ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
remiCodeFromeBBlock (ebp, ic);
bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
- OP_DEFS_SET ((IC_RESULT (dic)), bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key));
+ OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
ic = ic->prev;
}
}