[MLton] fixing -codegen c -profile time for the release

Matthew Fluet fluet@cs.cornell.edu
Wed, 16 Nov 2005 17:45:59 -0500 (EST)


> It isn't luck :) I mean I am lucky, but the design
> is almost certain to prevent optimisation.

You're still walking on thin ice.

> The code is always a member of a C++ class
> virtual non-static member function, and it is not
> called in the same compilation unit

Same with MLton: Each .c file that MLton emits for the C-codegen contains 
exactly one (non-recursive) non-static C function.

> Also the code is entirely free of any C loops and blocks.
> Felix generates flat code with gotos exclusively.

Same with MLton: it is very easy for gcc to recompute (simple) loop 
structures from unstructured code.

> And finally .. Felix already does much more aggressive
> inlinling than gcc does (it inlines EVERYTHING!! Well,
> almost .. :)

Same with MLton: the C functions we produce can be many hundreds of lines 
long, much too large to be inlined into any other piece of code.

> None of this is true for functions .. but I only use
> assembler labels in procedures -- to support fast
> resumption of microthreads by computed gotos.
>
> I understand why the example you gave could fail.

Florian's example was very small to demonstrate the problem.  But the 
realization of the problem in MLton's emitted code shows that gcc is being 
a lot more aggressive in it's optimizations.  Note that gcc is well within 
its rights to transform:

  void foo() {
    body
  }

to

  void foo() {
    static int _z = 1;
    _z = (_z + 1) % 2;
    if (_z) {
      body
    } else {
      copy_body
    }
  }

where 'copy_body' is identical to 'body' except that C labels are renamed. 
(Granted, this ruins your code size and instruction cache behavior, but it 
is semantically equivalent to the original function.)  Now your assembler 
label is repeated, yielding an assembler error.

So, I don't see any way to prevent gcc from duplicating code, though you 
can easily prevent gcc from dropping code.