fixed dereferencing bugs
authorsandeep <sandeep@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 14 Jun 2000 17:39:20 +0000 (17:39 +0000)
committersandeep <sandeep@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 14 Jun 2000 17:39:20 +0000 (17:39 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@275 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCCcse.c
src/SDCCicode.c
src/SDCCopt.c

index 4cec0bc55e0b644469cd8149f1196b2e20a22f3c..2af7f3ee4c5f4ef61a1f4e02dc3b3fee8a2807d0 100644 (file)
@@ -1108,6 +1108,20 @@ DEFSETFUNC(delGetPointerSucc)
     return applyToSet(ebp->succList,delGetPointerSucc,op,dfnum);
 }    
 
+/*-----------------------------------------------------------------*/
+/* fixUpTypes - KLUGE HACK fixup a lowering problem                */
+/*-----------------------------------------------------------------*/
+static void fixUpTypes(iCode *ic)
+{
+       link *t1 = operandType(IC_LEFT(ic)) ,*t2;
+       /* for pointer_gets if the types of result & left r the
+          same then change it type of result to next */
+       if (IS_PTR(t1) &&
+           checkType(t2=operandType(IC_RESULT(ic)),t1) == 1) {
+               setOperandType(IC_RESULT(ic),t2->next);
+       }
+}
+
 /*-----------------------------------------------------------------*/
 /* cseBBlock - common subexpression elimination for basic blocks   */
 /*             this is the hackiest kludgiest routine in the whole */
@@ -1229,6 +1243,7 @@ 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 */
index ec5a26c6f75c9e1b9ffda09459bdafb64cd640ef..287379af13c31ca8229cfcd88c749fabd4bf61ab 100644 (file)
@@ -2756,13 +2756,16 @@ operand *ast2iCode (ast *tree)
            (tree->opval.op == '&' && !tree->right) ||
            tree->opval.op == PTR_OP) {
            lvaluereq++;
-           if (IS_ARRAY_OP(tree->left) && IS_ARRAY_OP(tree->left->left)) {
+           if (IS_ARRAY_OP(tree->left) && IS_ARRAY_OP(tree->left->left))
+           {
                lvaluereq--;
                left = operandFromAst(tree->left);
            } else {
                left = operandFromAst(tree->left);
                lvaluereq--;
            }
+           if (IS_DEREF_OP(tree) && IS_DEREF_OP(tree->left))
+                   left = geniCodeRValue(left,TRUE);
        } else {
            left =  operandFromAst(tree->left);
        }
index 642bff15857fdbd0baf9058c783b934ac7eaef84..3e1ff6fb2efc54182e2ebd10fa63fde3e77713eb 100644 (file)
@@ -702,7 +702,7 @@ eBBlock **eBBlockFromiCode (iCode *ic)
     /* dumpraw if asked for */
     if (options.dump_raw)
        dumpEbbsToFileExt(".dumpcse",ebbs,count);
+    
     /* compute the data flow */
     computeDataFlow (ebbs,saveCount);