summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2018-07-19 22:25:56 +0000
committerTeresa Johnson <tejohnson@google.com>2018-07-19 22:25:56 +0000
commit0c432b1a70d29e60c3428198dd6dba9ebcc91851 (patch)
tree1620c6ad5124747d0ca5c3308359cd0bed510b73 /llvm/test
parentc12c5d421fc92a8f689ce0cabc4962f69774d1be (diff)
downloadbcm5719-llvm-0c432b1a70d29e60c3428198dd6dba9ebcc91851.tar.gz
bcm5719-llvm-0c432b1a70d29e60c3428198dd6dba9ebcc91851.zip
[ThinLTO] Only emit referenced type id records in index files
Summary: Currently all type ids are emitted into the index file when it is written. For distributed ThinLTO, that meant that all type ids were being duplicated into every single distributed index file, regardless of whether they were referenced, leading to huge amounts of unnecessary duplication and size bloat. Keep track of the type id GUIDs actually referenced by the GV summary records being emitted, and only emit those type IDs. Add a new test, and fix test/Assembler/thinlto-summary.ll so that all type ids are referenced to prevent deletion in that test. Reviewers: pcc Subscribers: mehdi_amini, inglorion, eraman, steven_wu, dexonsmith, vitalybuka, llvm-commits Differential Revision: https://reviews.llvm.org/D49565 llvm-svn: 337503
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Assembler/thinlto-summary.ll4
-rw-r--r--llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll28
-rw-r--r--llvm/test/ThinLTO/X86/cfi-distributed.ll60
3 files changed, 90 insertions, 2 deletions
diff --git a/llvm/test/Assembler/thinlto-summary.ll b/llvm/test/Assembler/thinlto-summary.ll
index 66a5bef015e..6722fb1a8b7 100644
--- a/llvm/test/Assembler/thinlto-summary.ll
+++ b/llvm/test/Assembler/thinlto-summary.ll
@@ -50,7 +50,7 @@
^20 = gv: (guid: 19, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (^27, offset: 16))))))
^21 = gv: (guid: 20, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (^25, offset: 16))))))
^22 = gv: (guid: 21, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: (vFuncId: (^27, offset: 16), args: (42), vFuncId: (^27, offset: 24), args: (43))))))
-^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: (vFuncId: (^27, offset: 16), args: (42))))))
+^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: (vFuncId: (^28, offset: 16), args: (42))))))
; Test TypeId summaries:
@@ -88,7 +88,7 @@
; CHECK: ^20 = gv: (guid: 19, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (^27, offset: 16))))))
; CHECK: ^21 = gv: (guid: 20, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (^25, offset: 16))))))
; CHECK: ^22 = gv: (guid: 21, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: (vFuncId: (^27, offset: 16), args: (42), vFuncId: (^27, offset: 24), args: (43))))))
-; CHECK: ^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: (vFuncId: (^27, offset: 16), args: (42))))))
+; CHECK: ^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: (vFuncId: (^28, offset: 16), args: (42))))))
; CHECK: ^24 = typeid: (name: "_ZTS1A", summary: (typeTestRes: (kind: allOnes, sizeM1BitWidth: 7), wpdResolutions: ((offset: 0, wpdRes: (kind: branchFunnel)), (offset: 8, wpdRes: (kind: singleImpl, singleImplName: "_ZN1A1nEi")), (offset: 16, wpdRes: (kind: indir, resByArg: (args: (1, 2), byArg: (kind: indir, byte: 2, bit: 3), args: (3), byArg: (kind: uniformRetVal, info: 1), args: (4), byArg: (kind: uniqueRetVal, info: 1), args: (5), byArg: (kind: virtualConstProp))))))) ; guid = 7004155349499253778
; CHECK: ^25 = typeid: (name: "_ZTS1B", summary: (typeTestRes: (kind: inline, sizeM1BitWidth: 0, alignLog2: 1, sizeM1: 2, bitMask: 3, inlineBits: 4))) ; guid = 6203814149063363976
; CHECK: ^26 = typeid: (name: "_ZTS1C", summary: (typeTestRes: (kind: single, sizeM1BitWidth: 0))) ; guid = 1884921850105019584
diff --git a/llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll b/llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll
new file mode 100644
index 00000000000..376c3f5c157
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll
@@ -0,0 +1,28 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-grtev4-linux-gnu"
+
+%struct.B2 = type { %struct.A2 }
+%struct.A2 = type { i32 (...)** }
+
+@_ZTV1B2 = constant { [3 x i8*] } { [3 x i8*] [i8* undef, i8* undef, i8* undef] }, !type !0
+
+define void @test2(i8* %b) {
+entry:
+ %0 = bitcast i8* %b to i8**
+ %vtable2 = load i8*, i8** %0
+ %1 = tail call i1 @llvm.type.test(i8* %vtable2, metadata !"_ZTS1A2")
+ br i1 %1, label %cont, label %trap
+
+trap:
+ tail call void @llvm.trap()
+ unreachable
+
+cont:
+ ret void
+}
+
+declare i1 @llvm.type.test(i8*, metadata)
+declare void @llvm.trap()
+
+!0 = !{i64 16, !"_ZTS1A2"}
+!1 = !{i64 16, !"_ZTS1B2"}
diff --git a/llvm/test/ThinLTO/X86/cfi-distributed.ll b/llvm/test/ThinLTO/X86/cfi-distributed.ll
new file mode 100644
index 00000000000..40753fd2bff
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/cfi-distributed.ll
@@ -0,0 +1,60 @@
+; REQUIRES: x86-registered-target
+
+; Test to ensure that only referenced type ID records are emitted into
+; each distributed index file.
+
+; RUN: opt -thinlto-bc -o %t1.o %s
+; RUN: opt -thinlto-bc -o %t2.o %p/Inputs/cfi-distributed.ll
+
+; RUN: llvm-lto2 run -thinlto-distributed-indexes %t1.o %t2.o \
+; RUN: -o %t3 \
+; RUN: -r=%t1.o,test,px \
+; RUN: -r=%t1.o,_ZTV1B, \
+; RUN: -r=%t1.o,_ZTV1B,px \
+; RUN: -r=%t1.o,test2, \
+; RUN: -r=%t2.o,test2,px \
+; RUN: -r=%t2.o,_ZTV1B2, \
+; RUN: -r=%t2.o,_ZTV1B2,px
+
+; Since @test calls @test2, the latter should be imported here and the
+; first index file should reference both type ids.
+; RUN: llvm-dis %t1.o.thinlto.bc -o - | FileCheck %s --check-prefix=INDEX1
+; INDEX1: typeid: (name: "_ZTS1A"
+; INDEX1: typeid: (name: "_ZTS1A2"
+
+; The second index file, corresponding to @test2, should only contain the
+; typeid for _ZTS1A.
+; RUN: llvm-dis %t2.o.thinlto.bc -o - | FileCheck %s --check-prefix=INDEX2
+; INDEX2-NOT: typeid: (name: "_ZTS1A"
+; INDEX2: typeid: (name: "_ZTS1A2"
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-grtev4-linux-gnu"
+
+%struct.B = type { %struct.A }
+%struct.A = type { i32 (...)** }
+
+@_ZTV1B = constant { [3 x i8*] } { [3 x i8*] [i8* undef, i8* undef, i8* undef] }, !type !0
+
+define void @test(i8* %b) {
+entry:
+ tail call void @test2(i8* %b)
+ %0 = bitcast i8* %b to i8**
+ %vtable2 = load i8*, i8** %0
+ %1 = tail call i1 @llvm.type.test(i8* %vtable2, metadata !"_ZTS1A")
+ br i1 %1, label %cont, label %trap
+
+trap:
+ tail call void @llvm.trap()
+ unreachable
+
+cont:
+ ret void
+}
+
+declare void @test2(i8*)
+declare i1 @llvm.type.test(i8*, metadata)
+declare void @llvm.trap()
+
+!0 = !{i64 16, !"_ZTS1A"}
+!1 = !{i64 16, !"_ZTS1B"}
OpenPOWER on IntegriCloud