From 424a644285d9219b1b1c9165804cb7c3a3568c79 Mon Sep 17 00:00:00 2001 From: MaartenBrock Date: Tue, 5 Sep 2006 06:30:03 +0000 Subject: [PATCH] * src/SDCCopt.c (cnvToFcall): fixed bug 1551947 by updating OP_USES and OP_DEFS git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4361 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 5 +++++ src/SDCCopt.c | 35 ++++++++++++++++++++++++----------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 43419e56..1bc23eec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-09-05 Maarten Brock + + * src/SDCCopt.c (cnvToFcall): fixed bug 1551947 by updating OP_USES + and OP_DEFS + 2006-09-05 Raphael Neider * device/lib/pic16/libdev/pic18f4550.c, diff --git a/src/SDCCopt.c b/src/SDCCopt.c index 822afc72..9a88fdf2 100644 --- a/src/SDCCopt.c +++ b/src/SDCCopt.c @@ -68,7 +68,12 @@ cnvToFcall (iCode * ic, eBBlock * ebp) left = IC_LEFT (ic); right = IC_RIGHT (ic); - if(IS_FLOAT(operandType( IC_RIGHT( ic ) ))) { + if (IS_SYMOP (left)) + bitVectUnSetBit (OP_USES (left), ic->key); + if (IS_SYMOP (right)) + bitVectUnSetBit (OP_USES (right), ic->key); + + if (IS_FLOAT (operandType (right))) { switch (ic->op) { case '+': @@ -103,7 +108,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) break; } } else - if(IS_FIXED16X16 (operandType (IC_RIGHT(ic)))) { + if (IS_FIXED16X16 (operandType (right))) { switch (ic->op) { case '+': @@ -147,31 +152,35 @@ cnvToFcall (iCode * ic, eBBlock * ebp) /* first one */ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) { - newic = newiCode (SEND, IC_LEFT (ic), NULL); + newic = newiCode (SEND, left, NULL); newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype); } else { - newic = newiCode ('=', NULL, IC_LEFT (ic)); + newic = newiCode ('=', NULL, left); IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)); } addiCodeToeBBlock (ebp, newic, ip); newic->lineno = lineno; + if (IS_SYMOP (left)) + OP_USES (left) = bitVectSetBit (OP_USES (left), newic->key); /* second one */ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype)) { - newic = newiCode (SEND, IC_RIGHT (ic), NULL); + newic = newiCode (SEND, right, NULL); newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype); } else { - newic = newiCode ('=', NULL, IC_RIGHT (ic)); + newic = newiCode ('=', NULL, right); IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next); } addiCodeToeBBlock (ebp, newic, ip); newic->lineno = lineno; + if (IS_SYMOP (right)) + OP_USES (right) = bitVectSetBit (OP_USES (right), newic->key); } else @@ -187,12 +196,13 @@ cnvToFcall (iCode * ic, eBBlock * ebp) { newic = newiCode (IPUSH, right, NULL); newic->parmPush = 1; - //bytesPushed+=4; bytesPushed += getSize(operandType(right)); } addiCodeToeBBlock (ebp, newic, ip); newic->lineno = lineno; + if (IS_SYMOP (right)) + OP_USES (right) = bitVectSetBit (OP_USES (right), newic->key); /* insert push left */ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) @@ -204,17 +214,21 @@ cnvToFcall (iCode * ic, eBBlock * ebp) { newic = newiCode (IPUSH, left, NULL); newic->parmPush = 1; - //bytesPushed+=4; bytesPushed += getSize(operandType(left)); } addiCodeToeBBlock (ebp, newic, ip); newic->lineno = lineno; + if (IS_SYMOP (left)) + OP_USES (left) = bitVectSetBit (OP_USES (left), newic->key); + } /* insert the call */ newic = newiCode (CALL, operandFromSymbol (func), NULL); IC_RESULT (newic) = IC_RESULT (ic); + bitVectUnSetBit (OP_DEFS (IC_RESULT (ic)), ic->key); + OP_USES (IC_RESULT (newic)) = bitVectSetBit (OP_USES (IC_RESULT (newic)), newic->key); newic->lineno = lineno; - newic->parmBytes+=bytesPushed; + newic->parmBytes += bytesPushed; ebp->hasFcall = 1; if (currFunc) FUNC_HASFCALL (currFunc->type) = 1; @@ -781,7 +795,6 @@ convertToFcall (eBBlock ** ebbs, int count) (IS_FLOAT (operandType (IC_RIGHT (ic))) || IS_FIXED( operandType (IC_RIGHT (ic))))) { - cnvToFcall (ic, ebbs[i]); } @@ -1554,7 +1567,7 @@ eBBlockFromiCode (iCode * ic) /* convert operations with support routines written in C to function calls : I am doing this at this point since I want all the - operations to be as they are for optimzations */ + operations to be as they are for optimizations */ convertToFcall (ebbi->bbOrder, ebbi->count); /* compute the live ranges */ -- 2.39.5