[llvm] 21e5a5f - [GlobalDCE] [VFE] Add a test for incorrect VFE behavior in presence of null/invalid vtable entries
Kuba Mracek via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 17 10:47:03 PST 2022
Author: Kuba Mracek
Date: 2022-02-17T10:46:54-08:00
New Revision: 21e5a5f0cfab0268e0e089170f4f8f61d89597cf
URL: https://github.com/llvm/llvm-project/commit/21e5a5f0cfab0268e0e089170f4f8f61d89597cf
DIFF: https://github.com/llvm/llvm-project/commit/21e5a5f0cfab0268e0e089170f4f8f61d89597cf.diff
LOG: [GlobalDCE] [VFE] Add a test for incorrect VFE behavior in presence of null/invalid vtable entries
Add a test for VFE where there's several vtables, and one of them contains an
invalid entry (from VFE's perspective), and which causes VFE to incorrectly skip
scanning subsequent vtables and drop their dependencies.
Added:
llvm/test/Transforms/GlobalDCE/virtual-functions-null.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/Transforms/GlobalDCE/virtual-functions-null.ll b/llvm/test/Transforms/GlobalDCE/virtual-functions-null.ll
new file mode 100644
index 0000000000000..33be6451fa3f7
--- /dev/null
+++ b/llvm/test/Transforms/GlobalDCE/virtual-functions-null.ll
@@ -0,0 +1,44 @@
+; RUN: opt < %s -globaldce -S | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+declare { i8*, i1 } @llvm.type.checked.load(i8*, i32, metadata)
+
+ at vtableA = internal unnamed_addr constant { [2 x i8*] } { [2 x i8*] [
+ i8* null,
+ i8* bitcast (void ()* @vfunc2 to i8*)
+]}, align 8, !type !{i64 0, !"vfunc1.type"}, !type !{i64 8, !"vfunc2.type"}, !vcall_visibility !{i64 2}
+
+; CHECK: @vtableA = internal unnamed_addr constant { [2 x i8*] } { [2 x i8*] [
+; CHECK-SAME: i8* null,
+; CHECK-SAME: i8* bitcast (void ()* @vfunc2 to i8*)
+; CHECK-SAME: ] }, align 8
+
+ at vtableB = internal unnamed_addr constant { [2 x i8*] } { [2 x i8*] [
+ i8* bitcast (void ()* @vfunc1 to i8*),
+ i8* bitcast (void ()* @vfunc2 to i8*)
+]}, align 8, !type !{i64 0, !"vfunc1.type"}, !type !{i64 8, !"vfunc2.type"}, !vcall_visibility !{i64 2}
+
+; CHECK: @vtableB = internal unnamed_addr constant { [2 x i8*] } { [2 x i8*] [
+; CHECK-SAME: i8* null,
+; CHECK-SAME: i8* bitcast (void ()* @vfunc2 to i8*)
+; CHECK-SAME: ] }, align 8
+
+define internal void @vfunc1() {
+ ret void
+}
+
+define internal void @vfunc2() {
+ ret void
+}
+
+define void @main() {
+ %1 = ptrtoint { [2 x i8*] }* @vtableA to i64 ; to keep @vtableA alive
+ %2 = ptrtoint { [2 x i8*] }* @vtableB to i64 ; to keep @vtableB alive
+ %3 = tail call { i8*, i1 } @llvm.type.checked.load(i8* null, i32 0, metadata !"vfunc1.type")
+ %4 = tail call { i8*, i1 } @llvm.type.checked.load(i8* null, i32 0, metadata !"vfunc2.type")
+ ret void
+}
+
+!999 = !{i32 1, !"Virtual Function Elim", i32 1}
+!llvm.module.flags = !{!999}
More information about the llvm-commits
mailing list