summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/WholeProgramDevirt
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2017-02-13 19:26:18 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2017-02-13 19:26:18 +0000
commit2b33f65317aa8f4145432f902c12d5a127bcbffe (patch)
tree53d2475025592b2340fa71a68213b4e20ab15546 /llvm/test/Transforms/WholeProgramDevirt
parent7bed48e7a3fda0eb04875d1fc05a4db516f26b5c (diff)
downloadbcm5719-llvm-2b33f65317aa8f4145432f902c12d5a127bcbffe.tar.gz
bcm5719-llvm-2b33f65317aa8f4145432f902c12d5a127bcbffe.zip
IR: Type ID summary extensions for WPD; thread summary into WPD pass.
Make the whole thing testable by adding YAML I/O support for the WPD summary information and adding some negative tests that exercise the YAML support. Differential Revision: https://reviews.llvm.org/D29782 llvm-svn: 294981
Diffstat (limited to 'llvm/test/Transforms/WholeProgramDevirt')
-rw-r--r--llvm/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml41
-rw-r--r--llvm/test/Transforms/WholeProgramDevirt/export-nothing.ll7
-rw-r--r--llvm/test/Transforms/WholeProgramDevirt/import-indir.ll99
3 files changed, 147 insertions, 0 deletions
diff --git a/llvm/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml b/llvm/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml
new file mode 100644
index 00000000000..1cb3ad3f134
--- /dev/null
+++ b/llvm/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml
@@ -0,0 +1,41 @@
+---
+GlobalValueMap:
+ 42:
+ - TypeTestAssumeVCalls:
+ - GUID: 123
+ Offset: 0
+ - GUID: 456
+ Offset: 4
+ TypeCheckedLoadVCalls:
+ - GUID: 789
+ Offset: 8
+ - GUID: 1234
+ Offset: 16
+ TypeTestAssumeConstVCalls:
+ - VFunc:
+ GUID: 123
+ Offset: 4
+ Args: [12, 24]
+ TypeCheckedLoadConstVCalls:
+ - VFunc:
+ GUID: 456
+ Offset: 8
+ Args: [24, 12]
+TypeIdMap:
+ typeid1:
+ WPDRes:
+ 0:
+ Kind: Indir
+ 4:
+ Kind: Indir
+ ResByArg:
+ "":
+ Kind: UniformRetVal
+ Info: 12
+ 12:
+ Kind: UniformRetVal
+ Info: 24
+ "12,24":
+ Kind: UniformRetVal
+ Info: 48
+...
diff --git a/llvm/test/Transforms/WholeProgramDevirt/export-nothing.ll b/llvm/test/Transforms/WholeProgramDevirt/export-nothing.ll
new file mode 100644
index 00000000000..e0814efbf9c
--- /dev/null
+++ b/llvm/test/Transforms/WholeProgramDevirt/export-nothing.ll
@@ -0,0 +1,7 @@
+; RUN: opt -wholeprogramdevirt -wholeprogramdevirt-summary-action=export -wholeprogramdevirt-write-summary=%t -o /dev/null %s
+; RUN: FileCheck %s < %t
+
+; CHECK: ---
+; CHECK-NEXT: GlobalValueMap:
+; CHECK-NEXT: TypeIdMap:
+; CHECK-NEXT: ...
diff --git a/llvm/test/Transforms/WholeProgramDevirt/import-indir.ll b/llvm/test/Transforms/WholeProgramDevirt/import-indir.ll
new file mode 100644
index 00000000000..dcd1f7f41f4
--- /dev/null
+++ b/llvm/test/Transforms/WholeProgramDevirt/import-indir.ll
@@ -0,0 +1,99 @@
+; Test that we correctly import an indir resolution for type identifier "typeid1".
+; RUN: opt -S -wholeprogramdevirt -wholeprogramdevirt-summary-action=import -wholeprogramdevirt-read-summary=%S/Inputs/import-indir.yaml -wholeprogramdevirt-write-summary=%t < %s | FileCheck %s
+; RUN: FileCheck --check-prefix=SUMMARY %s < %t
+
+; SUMMARY: GlobalValueMap:
+; SUMMARY-NEXT: 42:
+; SUMMARY-NEXT: - TypeTests:
+; SUMMARY-NEXT: TypeTestAssumeVCalls:
+; SUMMARY-NEXT: - GUID: 123
+; SUMMARY-NEXT: Offset: 0
+; SUMMARY-NEXT: - GUID: 456
+; SUMMARY-NEXT: Offset: 4
+; SUMMARY-NEXT: TypeCheckedLoadVCalls:
+; SUMMARY-NEXT: - GUID: 789
+; SUMMARY-NEXT: Offset: 8
+; SUMMARY-NEXT: - GUID: 1234
+; SUMMARY-NEXT: Offset: 16
+; SUMMARY-NEXT: TypeTestAssumeConstVCalls:
+; SUMMARY-NEXT: - VFunc:
+; SUMMARY-NEXT: GUID: 123
+; SUMMARY-NEXT: Offset: 4
+; SUMMARY-NEXT: Args:
+; SUMMARY-NEXT: - 12
+; SUMMARY-NEXT: - 24
+; SUMMARY-NEXT: TypeCheckedLoadConstVCalls:
+; SUMMARY-NEXT: - VFunc:
+; SUMMARY-NEXT: GUID: 456
+; SUMMARY-NEXT: Offset: 8
+; SUMMARY-NEXT: Args:
+; SUMMARY-NEXT: - 24
+; SUMMARY-NEXT: - 12
+; SUMMARY-NEXT: TypeIdMap:
+; SUMMARY-NEXT: typeid1:
+; SUMMARY-NEXT: TTRes:
+; SUMMARY-NEXT: Kind: Unsat
+; SUMMARY-NEXT: SizeM1BitWidth: 0
+; SUMMARY-NEXT: WPDRes:
+; SUMMARY-NEXT: 0:
+; SUMMARY-NEXT: Kind: Indir
+; SUMMARY-NEXT: SingleImplName: ''
+; SUMMARY-NEXT: ResByArg:
+; SUMMARY-NEXT: 4:
+; SUMMARY-NEXT: Kind: Indir
+; SUMMARY-NEXT: SingleImplName: ''
+; SUMMARY-NEXT: ResByArg:
+; SUMMARY-NEXT: :
+; SUMMARY-NEXT: Kind: UniformRetVal
+; SUMMARY-NEXT: Info: 12
+; SUMMARY-NEXT: 12:
+; SUMMARY-NEXT: Kind: UniformRetVal
+; SUMMARY-NEXT: Info: 24
+; SUMMARY-NEXT: 12,24:
+; SUMMARY-NEXT: Kind: UniformRetVal
+; SUMMARY-NEXT: Info: 48
+
+target datalayout = "e-p:32:32"
+
+declare void @llvm.assume(i1)
+declare void @llvm.trap()
+declare {i8*, i1} @llvm.type.checked.load(i8*, i32, metadata)
+declare i1 @llvm.type.test(i8*, metadata)
+
+; CHECK: define i1 @f1
+define i1 @f1(i8* %obj) {
+ %vtableptr = bitcast i8* %obj to [1 x i8*]**
+ %vtable = load [1 x i8*]*, [1 x i8*]** %vtableptr
+ %vtablei8 = bitcast [1 x i8*]* %vtable to i8*
+ %p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid1")
+ call void @llvm.assume(i1 %p)
+ %fptrptr = getelementptr [1 x i8*], [1 x i8*]* %vtable, i32 0, i32 0
+ %fptr = load i8*, i8** %fptrptr
+ %fptr_casted = bitcast i8* %fptr to i1 (i8*, i32)*
+ ; CHECK: call i1 %
+ %result = call i1 %fptr_casted(i8* %obj, i32 5)
+ ret i1 %result
+}
+
+; CHECK: define i1 @f2
+define i1 @f2(i8* %obj) {
+ %vtableptr = bitcast i8* %obj to [1 x i8*]**
+ %vtable = load [1 x i8*]*, [1 x i8*]** %vtableptr
+ %vtablei8 = bitcast [1 x i8*]* %vtable to i8*
+ %pair = call {i8*, i1} @llvm.type.checked.load(i8* %vtablei8, i32 4, metadata !"typeid1")
+ %fptr = extractvalue {i8*, i1} %pair, 0
+ %p = extractvalue {i8*, i1} %pair, 1
+ ; CHECK: [[P:%.*]] = call i1 @llvm.type.test
+ ; CHECK: br i1 [[P]]
+ br i1 %p, label %cont, label %trap
+
+cont:
+ %fptr_casted = bitcast i8* %fptr to i1 (i8*, i32)*
+ ; CHECK: call i1 %
+ %result = call i1 %fptr_casted(i8* %obj, i32 undef)
+ ret i1 %result
+
+trap:
+ call void @llvm.trap()
+ unreachable
+}
OpenPOWER on IntegriCloud