From acf005676ebd747b762089ecfe5f9bd7f3a0bbd9 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 20 Jul 2018 21:43:20 +0000 Subject: [PATCH] Change the cap on the amount of padding for each vtable to 32-byte (previously it was 128-byte) We tested different cap values with a recent commit of Chromium. Our results show that the 32-byte cap yields the smallest binary and all the caps yield similar performance. Based on the results, we propose to change the cap value to 32-byte. Patch by Zhaomo Yang! Differential Revision: https://reviews.llvm.org/D49405 llvm-svn: 337622 --- compiler-rt/test/cfi/create-derivers.test | 6 +++--- llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/compiler-rt/test/cfi/create-derivers.test b/compiler-rt/test/cfi/create-derivers.test index 8b569d001d89f..b651d9be6bd97 100644 --- a/compiler-rt/test/cfi/create-derivers.test +++ b/compiler-rt/test/cfi/create-derivers.test @@ -7,15 +7,15 @@ B0: {{1B|B@@}}: {{.*}} size 1 RUN: %clangxx_cfi -DB32 -flto -c -o %t2.o %S/simple-fail.cpp RUN: opt -lowertypetests -debug-only=lowertypetests -o /dev/null %t2.o 2>&1 | FileCheck --check-prefix=B32 %s -B32: {{1B|B@@}}: {{.*}} size 24 +B32: {{1B|B@@}}: {{.*}} size 2{{3|4}} B32-NOT: all-ones RUN: %clangxx_cfi -DB64 -flto -c -o %t3.o %S/simple-fail.cpp RUN: opt -lowertypetests -debug-only=lowertypetests -o /dev/null %t3.o 2>&1 | FileCheck --check-prefix=B64 %s -B64: {{1B|B@@}}: {{.*}} size 54 +B64: {{1B|B@@}}: {{.*}} size 5{{3|4}} B64-NOT: all-ones RUN: %clangxx_cfi -DBM -flto -c -o %t4.o %S/simple-fail.cpp RUN: opt -lowertypetests -debug-only=lowertypetests -o /dev/null %t4.o 2>&1 | FileCheck --check-prefix=BM %s -BM: {{1B|B@@}}: {{.*}} size 84 +BM: {{1B|B@@}}: {{.*}} size 8{{3|4}} BM-NOT: all-ones diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index 367b6282e243f..4f75718847076 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -771,10 +771,12 @@ void LowerTypeTestsModule::buildBitSetsFromGlobalVariables( // Compute the amount of padding required. uint64_t Padding = NextPowerOf2(InitSize - 1) - InitSize; - // Cap at 128 was found experimentally to have a good data/instruction - // overhead tradeoff. - if (Padding > 128) - Padding = alignTo(InitSize, 128) - InitSize; + // Experiments of different caps with Chromium on both x64 and ARM64 + // have shown that the 32-byte cap generates the smallest binary on + // both platforms while different caps yield similar performance. + // (see https://lists.llvm.org/pipermail/llvm-dev/2018-July/124694.html) + if (Padding > 32) + Padding = alignTo(InitSize, 32) - InitSize; GlobalInits.push_back( ConstantAggregateZero::get(ArrayType::get(Int8Ty, Padding)));