A fix for bug #467035 - this is a fairly major shift in
authorsandeep <sandeep@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 15 Oct 2001 02:03:11 +0000 (02:03 +0000)
committersandeep <sandeep@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 15 Oct 2001 02:03:11 +0000 (02:03 +0000)
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

index f3c27a55d521356f4bfe78a6a8c21be52135a95c..cdc20e1e52c53f5bcfa9b9b398b6fee40bac0392 100644 (file)
@@ -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 */