fixed problem with union substitution
[fw/sdcc] / 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*/