]> granicus.if.org Git - clang/commit
CodeGen: Emit constant temporaries into read-only globals.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 6 Mar 2015 20:00:03 +0000 (20:00 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 6 Mar 2015 20:00:03 +0000 (20:00 +0000)
commitfe85506967c38cad114ef2014c363b7b14ca81c8
treec48a17ac7ba2a07248b755f7ecd77f1a6ed5652d
parentf6ddf1b4f9cc7b2a5016d46fd6d0d2726946988c
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231508 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/CGExpr.cpp
test/CodeGenCXX/compound-literals.cpp
test/CodeGenCXX/cxx0x-initializer-array.cpp
test/CodeGenCXX/cxx0x-initializer-references.cpp
test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp