Pliant talk forum

Pliant talk forum

i386 optimization

Discussing strategies, ideas and of course patches
to optimize the i386 machine language generated by pliant.
Portable (non-i386 specific) optimizations welcome too.
Message posted by max on 2003/01/20 16:57:19
Examining the i386 machine language produced by pliant core executable,
I found a lot of places where it is suboptimal.

So I started patching the optimize routines to enchance the produced code.

An initial patch is available in the "patch" forum,
but there is space to do much better 
(and infact I am currently working on actually doing much better)

Feedback and ideas to improve the i386 optimizer are welcome!
Message posted by hubert.tonneau on 2003/01/24 01:04:47
First of all, the sample function you selected seem fairly well selected.

Now, I've got a working way to get the same result as yours just though turning
  i386_lea to i386_mov earlier.

Then as you pointed out, there are still many no use instructions such as:
  i386_mov ESP EAX
and in facts, this one is much harder to optimise because it could have been
  i386_lea [ESP+xxx] EAX
which could not be optimised.
The fact that it is
  i386_lea [ESP+0] EAX
is just a side effect of the function beeing quite simple, and when we
discover it, it's too late in the optimizing process.

So, what I now discover is that Pliant optimiser is mainly based on trying to
assign carrefully each local variable so that the assignment will create some
copy to itself instructions that will be discarded,
but your sample clearly demonstrates the limits of this method because complex
instructions that turn to simple move instructions near the end of the
optimizing process will prevent my general framework to properly work.

So, we may need to start a whole new optimisation lap when all registers
have been assigned, as you suggest it.
Also I belive that we should rather implement first an optimisation such as:
  mov v r1
  ...
  mov r1 r2
optimised to
  mov v r2
  ...
or
  ...
  mov v r2
if there is no back jump in the middle,
and r1 is later always written first (or not used somewhere else)
etc.
Message posted by max on 2003/01/24 07:45:37
I have worked a lot on the optimizer since the first patch.

I have implemented many other optimization rules, but they are all related to consecutive instructions.

I implemented your idea to optimize

  mov v r1
  ...
  mov r1 r2

into either

  mov v3  mov v r2
  ...
or
  ...
  mov v r2

only in the case there are _NO_ instructions between them.

Up to you to improve my new patch "i386 optimizer v24" (yep, version 24) which substitutes the old one.


Message posted by hubert.tonneau on 2003/01/24 10:41:36
> I implemented your idea to optimize
> only in the case there are _NO_ instructions between them.

I did implement the general case, but it never appends !