"Fix" of compiler crash
[fw/sdcc] / src / SDCCcse.c
index 258d5fef2b5aeb21b42decdfeb67684c8106af26..1bff79e102f6ea631e3ddd69921710a554bd9d27 100644 (file)
@@ -326,14 +326,6 @@ DEFSETFUNC (findCheaperOp)
          (*opp)->isaddr = cop->isaddr;
        }
 
-      if ((*opp)->type==VALUE && 
-         IS_SYMOP(cop) && 
-         !IS_SPEC(OP_SYMBOL(cop)->type)) {
-       // this could be a pointer to some space, so we can not
-       *opp=NULL;
-       return 0;
-      }
-
       return 1;
 
     }
@@ -818,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)))
        {
@@ -1021,7 +1016,9 @@ ifxOptimize (iCode * ic, set * cseSet,
       /* too often, if it does happen then the user pays */
       /* the price */
       computeControlFlow (ebbs, count, 1);
-      werror (W_CONTROL_FLOW, ic->filename, ic->lineno);
+      if (!options.lessPedantic) {
+       werror (W_CONTROL_FLOW, ic->filename, ic->lineno);
+      }
       return;
     }
 
@@ -1035,7 +1032,9 @@ ifxOptimize (iCode * ic, set * cseSet,
 
       remiCodeFromeBBlock (ebb, ic);
       computeControlFlow (ebbs, count, 1);
-      werror (W_CONTROL_FLOW, ic->filename, ic->lineno);
+      if (!options.lessPedantic) {
+       werror (W_CONTROL_FLOW, ic->filename, ic->lineno);
+      }
       return;
     }