Live data from Hacker News

Will It Optimize? See how well you can anticipate gcc's optimizer (2010)

ridiculousfish.com

31–34 of 34 posts

Re: Will It Optimize? See how well you can anticipate gcc's optimizer (2010)

#31

Earlier quoted context omitted.

OP here. Thanks for the great description of loop hoisting of invariant code, and it's awesome to hear from the guy who wrote it. However, what I wrote was not wrong. strlen is not marked as pure or const on OS X, and yet it is hoisted. glibc does happen to mark strlen as pure in string.h, but the optimization occurs even if you do not include that header - even if there is no declaration for strlen in scope at all!…

"So this optimization really does proceed because strlen is a builtin function, and does not depend on strlen being marked as pure or const." No. It's exactly the other way around. We could not give a crap whether it is a built in function, only whether it is pure or const. We do not special case built-in functions anywhere near this optimization. ~/sources/gcc/gcc (git)-[master]- :) $ grep BUILT_IN tree-ssa-sccvn.c…

"strlen gets marked as pure by the compiler if there is no non-pure definition that overrides it"

That's what I meant when I wrote that "the compiler recognizes strlen, and optimizes it specially." It was not my intent to say that only builtins or all builtins may be hoisted in this way, although now I see how someone could interpret that. That was bad wording on my part.

The point I was trying to communicate is that gcc can do special optimizations on functions that it recognizes as builtins - for example, replacing printf() with fputs(). One illustration is how strlen is treated as pure, even if it is not marked as pure. As someone with far more gcc expertise than me, would you agree with that point?

"Basically, the compiler defines a function named "strlen" that is pure and nothrow behind your back, but you can override it by providing your own definition. This is unrelated to whether it is a builtin"

Well, the optimization is defeated by -fno-builtin, so I assumed that the underlying mechanism is that a call to strlen is replaced by a call to the builtin. Was this wrong?

Re: Will It Optimize? See how well you can anticipate gcc's optimizer (2010)

#32
post #13

Question 4 points at a huge surprise. With a scientific computing project, I got (if I recall correctly), correct and expected output at no optimization and -O1, and patently incorrect output at -O2 and -O3. Cost: one sleepless night in college."What do you mean, optimization doesn't just make it faster?!?"

It's possible that both were "correct" but that -O2 and -O3 gave different results due to x86 extended precision. For some interesting reading, see:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323 (a centi-bug of back and forth between "it's broken!" and "no it's not, and we're not going to change the compiler.")

http://gcc.gnu.org/ml/gcc/2003-08/msg01183.html (a really informative thread about the issue)

Re: Will It Optimize? See how well you can anticipate gcc's optimizer (2010)

#33

Earlier quoted context omitted.

"So this optimization really does proceed because strlen is a builtin function, and does not depend on strlen being marked as pure or const." No. It's exactly the other way around. We could not give a crap whether it is a built in function, only whether it is pure or const. We do not special case built-in functions anywhere near this optimization. ~/sources/gcc/gcc (git)-[master]- :) $ grep BUILT_IN tree-ssa-sccvn.c…

" ... if it can prove the global memory state does not otherwise change between calls in a way that impacts that pure call Would it still work with -fno-strict-aliasing? I guess it should, for functions that only work on stack and get parameters from stack, right?

Yes. -fno-strict-aliasing only disables type based analysis, not points-to or other memory disambiguation.

Re: Will It Optimize? See how well you can anticipate gcc's optimizer (2010)

#34

Earlier quoted context omitted.

"So this optimization really does proceed because strlen is a builtin function, and does not depend on strlen being marked as pure or const." No. It's exactly the other way around. We could not give a crap whether it is a built in function, only whether it is pure or const. We do not special case built-in functions anywhere near this optimization. ~/sources/gcc/gcc (git)-[master]- :) $ grep BUILT_IN tree-ssa-sccvn.c…

"strlen gets marked as pure by the compiler if there is no non-pure definition that overrides it" That's what I meant when I wrote that "the compiler recognizes strlen, and optimizes it specially." It was not my intent to say that only builtins or all builtins may be hoisted in this way, although now I see how someone could interpret that. That was bad wording on my part. The point I was trying to communicate is that…

It is wrong, but only because of the weirdness of how this works. The call to strlen is not replaced with builtin_strlen, it defines both a builtin_strlen and a strlen. Both are marked pure and nothrow.

Due to some wonderful oddness around freestanding environments, if you use -fno-builtin, it will define neither.

Post reply on HN