From: sandeep Date: Mon, 15 Oct 2001 02:03:11 +0000 (+0000) Subject: A fix for bug #467035 - this is a fairly major shift in X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=246fcc4a5bdc6d66ae39b4325ad7e9cd1055b15e;p=fw%2Fsdcc A fix for bug #467035 - this is a fairly major shift in CSE processing. Previously when an operation was performed before with the same operands then the result of the previous operand replaced the result of the current operation entirely. This was buggy , the current solution looks like a much cleaner way to do things. Replace the current iCode with the an assignment of the previous icode's result, we nolonger have to replace the operands because the assignment exists, will have to watch for performance regressions git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1399 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/src/SDCCcse.c b/src/SDCCcse.c index f3c27a55..cdc20e1e 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -1513,15 +1513,9 @@ cseBBlock (eBBlock * ebb, int computeOnly, if (pdic && compareType (operandType (IC_RESULT (pdic)), operandType (IC_RESULT (ic))) != 1) pdic = NULL; - - // TODO: this must go, a weak fix for bug #467035 - if (pdic && (pdic->level > ic->level)) { - // pdic was inside an inner loop - pdic = NULL; - } - } +#if 0 /* if found then eliminate this and add to */ /* to cseSet an element containing result */ /* of this with previous opcode */ @@ -1578,7 +1572,22 @@ cseBBlock (eBBlock * ebb, int computeOnly, defic = ic; } +#else + /* Alternate code */ + if (pdic && IS_ITEMP(IC_RESULT(ic))) { + /* if previous definition found change this to an assignment */ + ic->op = '='; + IC_RIGHT(ic) = operandFromOperand(IC_RESULT(pdic)); + SET_ISADDR(IC_RESULT(ic),0); + SET_ISADDR(IC_RIGHT (ic),0); + } + if (!(POINTER_SET (ic)) && IC_RESULT (ic)) { + deleteItemIf (&cseSet, ifDefSymIsX, IC_RESULT (ic)); + addSetHead (&cseSet, newCseDef (IC_RESULT (ic), ic)); + } + defic = ic; +#endif /* if assignment to a parameter which is not mine and type is a pointer then delete pointerGets to take care of aliasing */