[Mono-devel-list] SSA and try/catch/finally regions

Massimiliano Mantione massi at ximian.com
Mon Apr 4 10:29:59 EDT 2005


On Mon, 2005-04-04 at 14:28 +0200, Zoltan Varga wrote:
>   A simpler solution would be to mark those variables used in
> catch/finally blocks as volatile.
> This is already done.

Thanks for reminding me this issue (I really forgot it!).

It is a simpler approach, but it also prevents optimizations on
those variables in the *whole* method.

A different approach would be to flag them as MONO_INST_INDIRECT
instead of MONO_INST_VOLATILE (to still prevent them from being
allocated in registers) and use the OP_DUMMY_STORE trick to mark
the places where they behave as "volatile", like I described.

I think this would still produce correct code, but enable more
optimizations opportunities.
So, my preference would go to the OP_DUMMY_STORE "trick", but
flagging catch/finally vars as MONO_INST_INDIRECT.

By the way, currently it seems to me that this flagging is done
in "mono_analyze_liveness", but what if we had some optimization
pass that runs *before* liveness has been computed but needs to
take this issue into account?

I know we have not this problem now, but the scenario is possible.
Suppose we go to semi-pruned SSA (which does not require liveness)
and also enable SSA in the presence of try/catch/finally clauses,
relying on the MONO_INST_VOLATILE flag to mark variables used in
catch/finally regions.
The flag will not be set, so the optimizations relying on it to
produce correct code would not work.

So, if we choose the MONO_INST_VOLATILE way, wouldn't it be better
to perform the flagging in a pass that we are *sure* will happen
before all the optimizations that need it?
Now we do one full code scan (handle_exception_clauses) just for
this purpose, but we do it inside mono_analyze_liveness...

Ciao,
  Massi





More information about the Mono-devel-list mailing list