This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

BB reordering question


I have a simple question that hopefully has a simple answer...
I'm using GCC (gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
for x86 to compile machine generated code that looks like this:

      const void *lables[] = { &&label1, &&label2, &&label3, ... };

	    blah blah
	    if (blah)
		    goto label3;
	    if (blah)
		    goto *labels[i];

At the end of each basic block, control either flows into the next
basic block, there is a return from the function, or there is a call
to another non-returning function marked __attribute__((noreturn)).

A requirement states that the labels[] array must be sorted in strictly
ascending order (all basic blocks are nonempty). But I'd also like to
enable as many optimizations as possible. So my question is, what is
the best choice of optimizations that won't reorder any blocks, ever?

I've tried "-O2 -fno-reorder-blocks"; it *almost* works but not quite.

E.g. if the last BB terminates with a call to a noreturn function,
GCC will still reorder it, presumably so an epilogue is at the end
of the function in memory (I saw some related (?) mailing list

First, is this a bug, feature, or am I confused about what the
"-fno-reorder-blocks" flag is supposed to do?

Is there some other way for me to get the desired result other than
disabling optimzation altogether?

Would getting rid of all the __attribute__((noreturn))'s be a valid
workaround for the "-O2 -fno-reorder-blocks" reordering problem?

Thanks for any insights.


P.S. please CC me with any responses (I'm not subscribed yet)

Archie Cobbs     *    Halloo Communications    *

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]