Mercurial > hg > CbC > old > device
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);