changeset 819:dc8df3977c17

lvar offset in prindirect
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 26 Nov 2010 16:32:33 +0900
parents c59753132812
children 9598ecec0af5
files Changes mc-inline.c
diffstat 2 files changed, 12 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Fri Nov 26 14:41:31 2010 +0900
+++ b/Changes	Fri Nov 26 16:32:33 2010 +0900
@@ -9947,6 +9947,9 @@
 
    ASS と CONST (FUNCTION)、REGISTER が特別な場合らしい
 
-
-
-
++rvalue では、0.1+1 とかも来てしまうので、無条件に INDIRECT にするのはダメ。
++INDIRECT にしている時とそうでない時がある。
+
+prindirect でも、同じ混乱があるらしい。それで、lvar の最適化ができなくなっている。
+
+
--- a/mc-inline.c	Fri Nov 26 14:41:31 2010 +0900
+++ b/mc-inline.c	Fri Nov 26 16:32:33 2010 +0900
@@ -514,12 +514,14 @@
     int e1 = pexpr(cadr(e));
     e1 = binop(ADD,e1,list2(CONST,offset),list2(POINTER,type),INT);
     type = cadddr(e);
-    e1 =  rvalue(e1);
-    return indop(e1);
+    if (car(e1)==LVAR) return rvalue(e1);
+    if (OP(car(e1))==REGISTER && car(cadr(e))==IVAR) return rvalue(e1);
+    return list3(car(e),e1,0);
 #else
     int lvar;
     int offset = caddr(e);
     int type0;
+    if (offset!=0) error(-1);
     type = cadddr(e);
     type0 = type_value(type);
     if (type0>0 && car(type0)==POINTER) 
@@ -528,9 +530,6 @@
         lvar=p_lvar(cadr(e)); // can be anything....
         switch(car(lvar)) {
         case LVAR:
-            if(offset) {
-                return list3(car(e),lvar,offset);
-            }
             return rvalue_t(lvar,cadddr(e));
         case REGISTER: case DREGISTER:
         case FREGISTER: case LREGISTER:
@@ -539,7 +538,7 @@
             if (offset) error(-1);
             return lvar;
         }
-    }
+    } 
     return list3(car(e),pexpr(cadr(e)),offset);
 #endif
 }
@@ -578,7 +577,7 @@
 {
     e1 = pexpr(e1);
     e2 = pexpr(e2);
-    if (is_const(e1)&&is_const(e2)) {
+    if (is_const(e1)||is_const(e2)) {
 	int t;
 	if((t= type_of_bop(op))) 
 	    return binop(OP(op),e1,e2,t,t);