r231508 - CodeGen: Emit constant temporaries into read-only globals.

Hans Wennborg hans at chromium.org
Fri Mar 6 16:50:16 PST 2015


On Fri, Mar 6, 2015 at 12:00 PM, Benjamin Kramer
<benny.kra at googlemail.com> wrote:
> Author: d0k
> Date: Fri Mar  6 14:00:03 2015
> New Revision: 231508
>
> URL: http://llvm.org/viewvc/llvm-project?rev=231508&view=rev
> Log:
> CodeGen: Emit constant temporaries into read-only globals.
>
> Instead of creating a copy on the stack just stash them in a private
> constant global. This saves both the copying overhead and the stack
> space, and gives the optimizer more room to constant fold.
>
> This tries to make array temporaries more similar to regular arrays,
> they can't use the same logic because a temporary has no VarDecl to be
> bound to so we roll our own version here.
>
> The original use case for this optimization was code like
>   for (int i : {1, 2, 3, 4, 5, 6, 7, 8, 10})
>     foo(i);
> where without this patch (assuming that the loop is not unrolled) we
> would alloca an array on the stack, copy the 10 values over and
> iterate on that. With this patch we put the array in .text use it
> directly. Apart from that case this helps on virtually any passing of
> a constant std::initializer_list as a function argument.
>
> Differential Revision: http://reviews.llvm.org/D8034

I've reverted this in r231541 as it broke Chromium. See error message
on the revert commit, or on the buildbot here:
http://build.chromium.org/p/chromium.fyi/builders/ClangToTLinux/builds/494/steps/compile/logs/stdio

I'll see if I can come up with a reproduction, but since it's a link
error I can't just send you the preprocessed source.

 - Hans



More information about the cfe-commits mailing list