[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