On Apr 17, 2007, at 12:34 AM, Mikhail Fursov wrote:
On 4/17/07, Naveen Neelakantam <[EMAIL PROTECTED]> wrote:
But in general, other optimization passes can perform transformations
that break important dataflow relationships between variables. This
sometimes makes it impossible for ABCD to prove that a particular
bounds check is redundant (ABCD uses "constraints", which are derived
from dataflow).
Naveen, if any of optimizations we have can break ABCD with Maxim's
example,
it worth to be analyzed. I hope there are no such optimizations in JIT
today. If you know one we can proceed and check it: it may lead to
additional improvements in ABCD algorithm.
I could not find a pass order that break's ABCD with Maxim's
example. However, I found a pass order using loop peeling that
prevents bounds checks from being proven redundant with the
BidirectionalBubbleSort example in HARMONY-1564. The following pass
order in opt.emconf will prevent 2 bounds checks from being proven
redundant:
-
XDjit.CS_OPT.path.optimizer=ssa,devirt,inline,uce,purge,simplify,dce,uce
,lazyexc,memopt,simplify,dce,uce,dessa,statprof,peel,ssa,classic_abcd,lo
wer,dessa,statprof,markglobals
Whereas these pass orders both work (and both use loop peeling):
-
XDjit.CS_OPT.path.optimizer=ssa,devirt,inline,uce,purge,simplify,dce,uce
,lazyexc,memopt,simplify,dce,uce,dessa,statprof,peel,ssa,memopt,classic_
abcd,lower,dessa,statprof,markglobals
-
XDjit.CS_OPT.path.optimizer=ssa,devirt,inline,uce,purge,simplify,dce,uce
,lazyexc,memopt,simplify,dce,uce,classic_abcd,dessa,statprof,peel,ssa,lo
wer,dessa,statprof,markglobals
The takeaway is that classic_abcd should either be run before loop
peeling, or if it runs after loop peeling, memopt should be run
between it and loop peeling.
Naveen
--
Mikhail Fursov