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

Florian Weimer fw@deneb.enyo.de
Wed, 16 Nov 2005 19:07:36 +0100


> Why would it blindly duplicate a block?

Inlining and various kinds of loop optimizations are like culprits.

> Is it assuming the block contains only local symbols??

Yes, it does.  More precisely, it expects that you use relative labels
only.

> Gcc is not free to duplicate code that contains a global symbol.

GCC expects that you don't don't declare symbols in asm statements.

> And the labels are marked global,
> and gcc knows it (that's what the "g" annotation
> is for I think).

No, "g" means "any register, memory or immediate operand".  Your
snippet works by sheer luck only.

Mike Stump mentioned the %= variable, documented as:

|  `%=' outputs a number which is unique to each instruction in the
| entire compilation.  This is useful for making local labels to be
| referred to more than once in a single template that generates multiple
| assembler instructions.

The problem with that one is that you can't easily put in a reference
elsewhere to a label which contains such a unique nimber.

> I presume you have a specific test case where gcc is doing this ..
> I'm kind of curious what makes it think it can duplicate a pubdef.

extern int foo (int);

void bla (void)
{
  int i, n = foo (0);

  for (i = 0; (({{  __asm__ volatile ("foo_label:"); }}), i < n); i++)
    foo (i);
}

The statement expression is not strictly required, I think.  I just
started with the gcc.dg/tree-ssa/copy-headers.c test case and made a
minimal change to show the problem.

See <http://gcc.gnu.org/ml/gcc/2005-11/msg00593.html> for further
discussion.