[LLVMdev] Disabling certain optimizations at -O1?

Renato Golin renato.golin at linaro.org
Wed Nov 27 12:02:27 PST 2013


On 27 November 2013 19:36, Robinson, Paul
<Paul_Robinson at playstation.sony.com> wrote:
> That's correct, -g must not affect code generation.  This is a
> fundamental mantra among debug-info people.

I think you both got me on the wrong side, though I admit my email
wasn't clear. I didn't mean to suggest changing codegen for debug
purposes only, but on -O1 to be less aggressive on some parts than it
is today. Some flag saying "optimize-for-debug".

It's not easy to know what kind of optimization you can do that won't
change how the program runs, and thus changing how the program breaks,
so maybe the -g special flag was a bad idea to begin with. But the
need to make -O1 be debuggable could very well be the just the thing I
needed to give names to the optimization options.

Earlier this year I proposed we have names, rather than numbers, that
would represent our optimization levels:

0 = Debug
1 = FastDebug
2 = Speed
3 = Aggressive
S = Space
Z = SpaceAggressive

I'm assuming there is little value in -O1 than just a faster debug
experience, so why not make it take decisions on the debug illusion as
well? Ie. ignore my -g/-O1 dependency I proposed.


> Intuitively I'd expect that the set of passes to be run would vary with
> opt level, and much less often would a pass want to vary its behavior
> according to opt level.  But "much less often" isn't "never" and so it
> seems very weird that a pass wouldn't know the opt level.

As far as I know (and I may be wrong), the passes only have access to
things like "optimize-for-space/speed".

Because optimization levels don't mean anything concrete, it'd be a
bit silly to have an "if (opt == 3) do this" in a pass.


> Some indication of "be sanitizer/debugger friendly" that can guide
> pass internal behavior seems like a good plan.  I had this in a previous
> compiler I worked on, and it was extremely helpful in producing code
> that was easy to debug.

That's the plan.

If the optimization levels (at least in LLVM) have names, we can
easily make -OFastDebug and -ODebug have the same "debug" flag set,
and so on.

enum OptLevel {
  Debug = 1, // Debug Illusion
  Speed = 2, // Performance
  Space = 4, // Size
  Aggressive = 8,
}

-O0 = Debug
-O1 = Debug+Aggressive
-O2 = Speed
-O3 = Speed+Aggressive
-Os = Space
-Oz = Space+Aggressive

Then passes only need to know which flags are set...

In our specific case, not running SimplifyCFG and friends would only
need to know "if (OptLevel.isSpeed()) simplify();". At least the code
would make more sense to the reader...

cheers,
--renato



More information about the llvm-dev mailing list