]> granicus.if.org Git - yasm/commitdiff
expr_level_op(): Pull up IDENT-EXPR as well as EXPR-IDENT subtrees.
authorPeter Johnson <peter@tortall.net>
Thu, 3 Oct 2002 09:16:11 +0000 (09:16 -0000)
committerPeter Johnson <peter@tortall.net>
Thu, 3 Oct 2002 09:16:11 +0000 (09:16 -0000)
expr_level_tree(): Call recursively after calling expr_xform_bc_dist instead
 of just calling expr_level_op, which wasn't simplifying the whole tree
 properly.

svn path=/trunk/yasm/; revision=728

libyasm/expr.c
src/expr.c

index 9bbbc64be35be048fe74b7756874e4fe312b33fa..7d13ae303a39bc8e129dd383f634761cafc4c5e7 100644 (file)
@@ -512,6 +512,11 @@ expr_level_op(/*@returned@*/ /*@only@*/ expr *e, int fold_const,
     /* Determine how many operands will need to be brought up (for leveling).
      * Go ahead and bring up any IDENT'ed values.
      */
+    while (e->op == EXPR_IDENT && e->terms[0].type == EXPR_EXPR) {
+       expr *sube = e->terms[0].data.expn;
+       xfree(e);
+       e = sube;
+    }
     level_numterms = e->numterms;
     level_fold_numterms = 0;
     for (i=0; i<e->numterms; i++) {
@@ -730,7 +735,7 @@ expr_level_tree(expr *e, int fold_const, int simplify_ident,
     e = expr_level_op(e, fold_const, simplify_ident);
     if (calc_bc_dist) {
        e = expr_xform_bc_dist(e, calc_bc_dist);
-       e = expr_level_op(e, fold_const, simplify_ident);
+       e = expr_level_tree(e, fold_const, simplify_ident, NULL, NULL);
     }
     return e;
 }
index 9bbbc64be35be048fe74b7756874e4fe312b33fa..7d13ae303a39bc8e129dd383f634761cafc4c5e7 100644 (file)
@@ -512,6 +512,11 @@ expr_level_op(/*@returned@*/ /*@only@*/ expr *e, int fold_const,
     /* Determine how many operands will need to be brought up (for leveling).
      * Go ahead and bring up any IDENT'ed values.
      */
+    while (e->op == EXPR_IDENT && e->terms[0].type == EXPR_EXPR) {
+       expr *sube = e->terms[0].data.expn;
+       xfree(e);
+       e = sube;
+    }
     level_numterms = e->numterms;
     level_fold_numterms = 0;
     for (i=0; i<e->numterms; i++) {
@@ -730,7 +735,7 @@ expr_level_tree(expr *e, int fold_const, int simplify_ident,
     e = expr_level_op(e, fold_const, simplify_ident);
     if (calc_bc_dist) {
        e = expr_xform_bc_dist(e, calc_bc_dist);
-       e = expr_level_op(e, fold_const, simplify_ident);
+       e = expr_level_tree(e, fold_const, simplify_ident, NULL, NULL);
     }
     return e;
 }