Hey Tom,

This is a good question. There's a lot of literature on peephole
optimization, and I've read very little of it. I bet it'd be relevant
here, though there are special complications for a stack language.
Peephole optimization has limits, since you can't do much with control
flow, and the linearization order of instructions has a big impact on
what optimizations can be done. But it's not totally outdated; GCC
uses a technique based on peephole optimization for its instruction
selection pass, even though they could have gone with a more general
tree/dag rewriting approach. It seems like a reasonable way to do
things for a simple compiler like yours.

Well, here's a way to view a system like the one you're talking about
formally: consider your rewrite rules, and the program, and say all
the rewrite rules are optional and can be applied in any order to any
part of the program at any time. Now you have a set (hopefully finite,
if your rewrite rules have a certain monotonicity property) of
programs which implement the original code, and which the rewrite
rules can give you. If the rewrite rules are monotonic, then there's
an easy procedure to optimize the program: list out all programs,
calculate their efficiency, and select one of the best ones. The task
now is to construct an efficient algorithm to find an optimal program,
by some metric.

But I guess I'm not saying anything very helpful in that paragraph,
since I didn't give you the algorithm. It depends on the structure of
the rewrite rules. The phrase "rewrite rule" implies the most general
thing possible, and you can't make an algorithm on something so
general. With something like an optimizer, I don't understand why
things have to be confluent. Maybe the algorithm to find the optimal
series of peephole optimizations will be a confluent subset of the
general rewriting system of all valid peephole optimizations; is this
what you mean? If you have a confluent and always-terminating rewrite
system, it's really easy to do the rewriting, so that'd be a reason to
think about confluent rewriting systems, but they're not the only
thing you should consider.

On the topic of optimizing stack-based code: Factor's compiler might
be the most advanced stack-based compiler ever constructed. It does
not use peephole optimizations. The stack checker and compiler
'frontend' (high-level IR) form a stack code to stack code optimizer
which is much more powerful than a peephole optimizer, taking control
flow into account. The intermediate form is based on SSA, but at the
same time the stack is always present; SSA values refer to stack
locations. The most important pass is Sparse Conditional Constant
Propagation, which can be done on a stack-based, tree-structured IR
with no special difficulties. The last step, in the conversion to
low-level IR, ignores the SSA values and lets things be passed around
on the stack that was there the whole time.

On register-based architectures (like the PIC18, right?), doing
everything with a stack is inherently inefficient because of peeks and
replaces on the top of the stack. A major goal of Factor's low-level
optimizer (arguably the main goal) is to eliminate redundant peeks and
replaces between subroutine calls, exposing a value structure that
other optimizations and the register allocator can use. It seems like
any advanced-enough compiler for a stack language should have some way
of eliminating redundant peeks and replaces, and Factor's
deconcatenatization algorithm is an elegant solution to this problem.

Dan

On Tue, Aug 25, 2009 at 1:21 AM, Tom Schouten<t...@zwizwa.be> wrote:
> Hello list,
>
> I guess this is mostly for Daniel, but anyone else of course feel free
> to chime in...
>
> I'm trying to get a better idea about rewriting systems for
> concatenative languages, particularly in the area of specification of
> peephole optimizations.  It's been on my mind for a while, but I've
> always side-stepped any non-deterministic computations.  I.e. in
> Staapl[1], the PIC18 code generator[2] is written using an eager
> pattern matching approach, essentiall re-interpreting already
> generated machine code as stack machine code that can then be
> partially evaluated together with the currently compiling primitive
> operation.  (Explained here[3] in some detail).
>
> I've always been suspicious that this formulation, while it works well
> in practice and has a certain elegance, is a special case of a more
> general, non-confluent rewriting system.
>
> It seems to me that if there are any interesting optimizations to
> make, they are not going to be unique and depend on which path through
> the reduction rules is used to get to a particular irreducible
> expression.
>
> And then it stops.
>
> I have some intuition about reduction machines, as long as they
> compute a unique solution (lambda calculus w. strict eval (CEK
> machine) and lazy eval using graph reduction, ...) but I'm not sure
> how to view the other cases where you have a bunch of rewrite rules
> and you ask the compiler to pick a sequence of reduction rule
> applications that leads to the ``most optimal'' reduction under some
> kind of cost function (for PIC18 this would be the machine code
> length).
>
> I hope this makes some sense..
> Any ideas on this welcome.
>
> Cheers,
> Tom
>
> [1] http://zwizwa.be/staapl
> [2] http://zwizwa.be/darcs/staapl/staapl/pic18/pic18-unit.ss
> [3] http://zwizwa.be/archive/staapl.html
>
>
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
> trial. Simplify your report design, integration and deployment - and focus on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now.  http://p.sf.net/sfu/bobj-july
> _______________________________________________
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to