1) SDCCast.c - allow cast of ZERO to generic pointer (Special case for NULL)
[fw/sdcc] / src / SDCCcse.c
index 45a0aef708ffb048489b391d6b610f53c41f9b08..b0dc633eece16bd8e099fd32084118e05917de4f 100644 (file)
@@ -326,16 +326,6 @@ DEFSETFUNC (findCheaperOp)
          (*opp)->isaddr = cop->isaddr;
        }
 
-      if ((*opp)->type==VALUE && 
-         IS_SYMOP(cop) && IS_GENPTR(OP_SYMBOL(cop)->type)) {
-       // This is a value assigned to a gpointer
-       if (1) {
-         // this value is used for a cast, so we can not
-         *opp=NULL;
-         return 0;
-       }       
-      }
-
       return 1;
 
     }
@@ -820,25 +810,28 @@ algebraicOpts (iCode * ic)
        }
       break;
     case CAST:
-      /* if this is a cast of a literal value */
-      if (IS_OP_LITERAL (IC_RIGHT (ic)))
-       {
-         ic->op = '=';
-         IC_RIGHT (ic) =
-           operandFromValue (valCastLiteral (operandType (IC_LEFT (ic)),
-                                         operandLitValue (IC_RIGHT (ic))));
-         IC_LEFT (ic) = NULL;
-         SET_ISADDR (IC_RESULT (ic), 0);
-       }
-      /* if casting to the same */
-      if (compareType (operandType (IC_RESULT (ic)),
-                    operandType (IC_RIGHT (ic))) == 1)
-       {
-         ic->op = '=';
-         IC_LEFT (ic) = NULL;
-         SET_ISADDR (IC_RESULT (ic), 0);
-       }
-      break;
+           {
+                   sym_link *otype = operandType(IC_RIGHT(ic));
+                   sym_link *ctype = operandType(IC_LEFT(ic));
+                   /* if this is a cast of a literal value */
+                   if (IS_OP_LITERAL (IC_RIGHT (ic)) &&
+                       !(IS_GENPTR(ctype) && (IS_PTR(otype) && !IS_GENPTR(otype)))) {
+                           ic->op = '=';
+                           IC_RIGHT (ic) =
+                                   operandFromValue (valCastLiteral (operandType (IC_LEFT (ic)),
+                                                                     operandLitValue (IC_RIGHT (ic))));
+                           IC_LEFT (ic) = NULL;
+                           SET_ISADDR (IC_RESULT (ic), 0);
+                   }
+                   /* if casting to the same */
+                   if (compareType (operandType (IC_RESULT (ic)),
+                                    operandType (IC_RIGHT (ic))) == 1) {
+                           ic->op = '=';
+                           IC_LEFT (ic) = NULL;
+                           SET_ISADDR (IC_RESULT (ic), 0);
+                   }
+           }
+           break;
     case '!':
       if (IS_OP_LITERAL (IC_LEFT (ic)))
        {