Ping
http://gcc.gnu.org/ml/gcc-patches/2014-03/msg00051.html
On Sun, 2 Mar 2014, Marc Glisse wrote:
Hello,
inlining operator new (with LTO or otherwise), I noticed that it has a
complicated implementation, which makes it hard to use this inlined code for
optimizations. This patch does two things:
1) there are 2 calls to malloc, I am turning them into just one. At -Os, it
does not change the generated code (RTL optimizers manage to merge the calls
to malloc). At other levels (-O2, -O3, and especially with -g) it gives a
smaller object file. And with just one malloc, some optimizations become much
easier (see my recent calloc patch for instance).
2) malloc is predicted to return null 19 times out of 20 because of the loop
(that didn't change with the patch), so I am adding __builtin_expect to let
gcc optimize the fast path.
Further discussion:
a) I didn't add __builtin_expect for the test (sz == 0), it didn't change the
generated code in my limited test. I was wondering if this test is necessary
(new doesn't seem to ever call operator new(0)) or could be moved to operator
new[] (new type[0] does call operator new[](0)), but since one can call
operator new directly, it has to be protected indeed, so let's forget this
point ;-)
(too bad malloc is replacable, so we can't use the fact that glibc already
does the right thing)
b) I have a bit of trouble parsing the standard. Is the nothrow operator new
supposed to call the regular operator new? In particular, if a user replaces
only the throwing operator new, should the nothrow operator new automatically
call that function? That's not what we are currently doing (and it would be a
perf regression).
"Required behavior: Return a non-null pointer to suitably aligned storage
(3.7.4), or else return a null pointer. This nothrow version of operator new
returns a pointer obtained as if acquired from the (possibly replaced)
ordinary version. This requirement is binding on a replacement version of
this function.
Default behavior: Calls operator new(size). If the call returns normally,
returns the result of that call. Otherwise, returns a null pointer."
Passes bootstrap+testsuite on x86_64-linux-gnu. Stage 1?
2014-03-03 Marc Glisse <marc.gli...@inria.fr>
* libsupc++/new_op.cc: Factor the calls to malloc, use
__builtin_expect.
* libsupc++/new_opnt.cc: Likewise.
--
Marc Glisse