* src/SDCCast.c (decorateType): fixed previouse immature commit, added optimisation
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 25 Oct 2005 13:41:41 +0000 (13:41 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 25 Oct 2005 13:41:41 +0000 (13:41 +0000)
(optimizeGetWord): fix warning 'i' might be used uninitialized
* src/mcs51/gen.c (genCpl): removed W_COMPLEMENT
* src/ds390/gen.c (genCpl): removed W_COMPLEMENT

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3909 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/SDCCast.c
src/ds390/gen.c
src/mcs51/gen.c

index e25203ee5baf909a9e8126df378db374142bd006..2c55b61731dfcf59a34077ecb480cd754c88833e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,7 +2,10 @@
 
        * src/SDCCast.c (addCast): added promotion for bit variables
        (decorateType): emit W_COMPLEMENT before the problem vanishes behind
-       promotion casts
+       promotion casts + optimisation
+       (optimizeGetWord): fix warning 'i' might be used uninitialized
+       * src/mcs51/gen.c (genCpl): removed W_COMPLEMENT
+       * src/ds390/gen.c (genCpl): removed W_COMPLEMENT
 
 2005-10-24 Bernhard Held <bernhard AT bernhardheld.de>
 
index bb5a75c4909c6d4805bb36e37054e9f2be427d42..01411dbed977c25706b3c4da9ce598b706503277 100644 (file)
@@ -3422,9 +3422,23 @@ decorateType (ast * tree, RESULT_TYPE resultType)
           TETYPE (tree) = TTYPE (tree) = tree->opval.val->type;
           return addCast (tree, resultType, TRUE);
         }
-      if (getSize (tree->left->etype) < INTSIZE)
-        werror(W_COMPLEMENT);
-      tree->left = addCast (tree->left, resultType, TRUE);
+
+      if (resultType == RESULT_TYPE_BIT &&
+          IS_UNSIGNED (tree->left->etype) &&
+          getSize (tree->left->etype) < INTSIZE)
+        {
+          /* promotion rules are responsible for this strange result:
+             bit -> int -> ~int -> bit
+             uchar -> int -> ~int -> bit
+          */
+          werror(W_COMPLEMENT);
+
+          /* optimize bit-result, even if we optimize a buggy source */
+          tree->type = EX_VALUE;
+          tree->opval.val = constVal ("1");
+        }
+      else
+        tree->left = addCast (tree->left, resultType, TRUE);
       LRVAL (tree) = 1;
       COPYTYPE (TTYPE (tree), TETYPE (tree), LTYPE (tree));
       return tree;
@@ -5110,7 +5124,7 @@ optimizeGetByte (ast * tree, RESULT_TYPE resultType)
 ast *
 optimizeGetWord (ast * tree, RESULT_TYPE resultType)
 {
-  unsigned int i;
+  unsigned int i = 0;
   ast * expr;
   ast * count = NULL;
 
index 3cdc68bad8341177be91406415ae851d3f0a58bf..050020dae74b41eea82b429992c715fdc3c8fa69 100644 (file)
@@ -1930,7 +1930,6 @@ genCpl (iCode * ic)
              bit -> int -> ~int -> bit
              uchar -> int -> ~int -> bit
           */
-          werror(W_COMPLEMENT);
           emitcode ("setb", "%s", IC_RESULT (ic)->aop->aopu.aop_dir);
           goto release;
         }
index 085333afe10e2874c945b4661d04d737715253d2..76eb50f89e0bfd33e718049e34f495666c499046 100644 (file)
@@ -1803,7 +1803,6 @@ genCpl (iCode * ic)
              bit -> int -> ~int -> bit
              uchar -> int -> ~int -> bit
           */
-          werror(W_COMPLEMENT);
           emitcode ("setb", "%s", IC_RESULT (ic)->aop->aopu.aop_dir);
           goto release;
         }