diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 5 | ||||
-rw-r--r-- | src/interp/g-opt.boot | 11 |
2 files changed, 10 insertions, 6 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index cd08dcdf..92ebd761 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,10 @@ 2010-07-26 Gabriel Dos Reis <gdr@cs.tamu.edu> + * interp/g-opt.boot (optCond): Work harder at denesting nested + if-expressions. + +2010-07-26 Gabriel Dos Reis <gdr@cs.tamu.edu> + * interp/g-opt.boot ($VMsideEffectFreeOperators): Include new opcodes %icst0, %icst1, %when, and %ccst. * interp/g-util.boot: Expand %ccst. diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot index c7121f01..2a1065b8 100644 --- a/src/interp/g-opt.boot +++ b/src/interp/g-opt.boot @@ -301,23 +301,22 @@ optMkRecord ["mkRecord",:u] == ["VECTOR",:u] optCond (x is ['COND,:l]) == - if l is [a,[aa,b]] and aa = '%true and b is ["COND",:c] then + if l is [a,[aa,b]] and aa = '%true and b is ['COND,:c] then x.rest.rest := c if l is [[p1,:c1],[p2,:c2],:.] then if (p1 is ['%not,=p2]) or (p2 is ['%not,=p1]) then l:=[[p1,:c1],['%true,:c2]] x.rest := l c1 is ['NIL] and p2 = '%true and first c2 = '%true => - p1 is ['%not,p1']=> return p1' - return ['%not,p1] + return optNot ['%not,p1] l is [[p1,:c1],[p2,:c2],[p3,:c3]] and p3 = '%true => EqualBarGensym(c1,c3) => - ["COND",[['%or,p1,['%not,p2]],:c1],['%true,:c2]] - EqualBarGensym(c1,c2) => ["COND",[['%or,p1,p2],:c1],['%true,:c3]] + optCond ['COND,[['%or,p1,['%not,p2]],:c1],['%true,:c2]] + EqualBarGensym(c1,c2) => optCond ['COND,[['%or,p1,p2],:c1],['%true,:c3]] x for y in tails l repeat while y is [[a1,c1],[a2,c2],:y'] and EqualBarGensym(c1,c2) repeat - a:=['%or,a1,a2] + a := ['%or,a1,a2] first(y).first := a y.rest := y' x |