# HG changeset patch # User Shinji KONO # Date 1290756753 -32400 # Node ID dc8df3977c177449722e96b54964bb3dce981a4c # Parent c59753132812444761d5075e730370dbab351257 lvar offset in prindirect diff -r c59753132812 -r dc8df3977c17 Changes --- 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 の最適化ができなくなっている。 + + diff -r c59753132812 -r dc8df3977c17 mc-inline.c --- 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);