fixed problem with union substitution
authorsandeep <sandeep@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 14 Jun 2000 18:03:25 +0000 (18:03 +0000)
committersandeep <sandeep@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 14 Jun 2000 18:03:25 +0000 (18:03 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@276 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCCcse.c

index 2af7f3ee4c5f4ef61a1f4e02dc3b3fee8a2807d0..f1f91676390e9b37b5464ace1984b9c06fde63b6 100644 (file)
@@ -1243,13 +1243,14 @@ int cseBBlock ( eBBlock *ebb, int computeOnly,
        
        /* do some algebraic optimizations if possible */
        algebraicOpts (ic);
-       if (POINTER_GET(ic)) fixUpTypes(ic);
        while (constFold(ic,cseSet));
 
        /* small klugde */
        if (POINTER_GET(ic) && !IS_PTR(operandType(IC_LEFT(ic)))) {
            setOperandType(IC_LEFT(ic),
                           aggrToPtr(operandType(IC_LEFT(ic)),FALSE));
+           fixUpTypes(ic);
+
        }
        if (POINTER_SET(ic) && !IS_PTR(operandType(IC_RESULT(ic)))) {
            setOperandType(IC_RESULT(ic),
@@ -1357,6 +1358,9 @@ int cseBBlock ( eBBlock *ebb, int computeOnly,
              IS_ITEMP(IC_RESULT(ic))               &&
            ! computeOnly) {
            applyToSet (cseSet,findPrevIc,ic,&pdic);
+           if (pdic && checkType(operandType(IC_RESULT(pdic)),
+                                 operandType(IC_RESULT(ic))) != 1)
+                   pdic = NULL;
        } 
        
        /* if found then eliminate this and add to*/