CodeGen: use non-zero memset when possible for automatic variables
authorJF Bastien <jfbastien@apple.com>
Wed, 25 Jul 2018 04:29:03 +0000 (04:29 +0000)
committerJF Bastien <jfbastien@apple.com>
Wed, 25 Jul 2018 04:29:03 +0000 (04:29 +0000)
commit6508929da9b2d7729f0047ce798fd648e3d63c3a
tree06441558fa974a61d597622aad3f3795047db2bb
parent3b3edcb0b7bd37435d176034eea720fe2a692647
CodeGen: use non-zero memset when possible for automatic variables

Summary:
Right now automatic variables are either initialized with bzero followed by a few stores, or memcpy'd from a synthesized global. We end up encountering a fair amount of code where memcpy of non-zero byte patterns would be better than memcpy from a global because it touches less memory and generates a smaller binary. The optimizer could reason about this, but it's not really worth it when clang already knows.

This code could definitely be more clever but I'm not sure it's worth it. In particular we could track a histogram of bytes seen and figure out (as we do with bzero) if a memset could be followed by a handful of stores. Similarly, we could tune the heuristics for GlobalSize, but using the same as for bzero seems conservatively OK for now.

<rdar://problem/42563091>

Reviewers: dexonsmith

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D49771

llvm-svn: 337887
clang/lib/CodeGen/CGDecl.cpp
clang/test/CodeGen/init.c