From 246fcc4a5bdc6d66ae39b4325ad7e9cd1055b15e Mon Sep 17 00:00:00 2001 From: sandeep Date: Mon, 15 Oct 2001 02:03:11 +0000 Subject: [PATCH] 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 --- src/SDCCcse.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) 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 */ -- 2.39.5