1; RUN: opt < %s -passes=globaldce -S | FileCheck %s 2 3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4 5declare { ptr, i1 } @llvm.type.checked.load(ptr, i32, metadata) 6 7@vtableA = internal unnamed_addr constant { [2 x i32] } { [2 x i32] [ 8 i32 0, 9 i32 trunc (i64 sub (i64 ptrtoint (ptr @vfunc2 to i64), i64 ptrtoint (ptr @vtableA to i64)) to i32) 10]}, align 8, !type !{i64 0, !"vfunc1.type"}, !type !{i64 4, !"vfunc2.type"}, !vcall_visibility !{i64 2} 11 12; CHECK: @vtableA = internal unnamed_addr constant { [2 x i32] } { [2 x i32] [ 13; CHECK-SAME: i32 0, 14; CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr @vfunc2 to i64), i64 ptrtoint (ptr @vtableA to i64)) to i32) 15; CHECK-SAME: ] }, align 8 16 17@vtableB = internal unnamed_addr constant { [2 x i32] } { [2 x i32] [ 18 i32 trunc (i64 sub (i64 ptrtoint (ptr @vfunc1 to i64), i64 ptrtoint (ptr @vtableB to i64)) to i32), 19 i32 trunc (i64 sub (i64 ptrtoint (ptr @vfunc2 to i64), i64 ptrtoint (ptr @vtableB to i64)) to i32) 20]}, align 8, !type !{i64 0, !"vfunc1.type"}, !type !{i64 4, !"vfunc2.type"}, !vcall_visibility !{i64 2} 21 22; CHECK: @vtableB = internal unnamed_addr constant { [2 x i32] } { [2 x i32] [ 23; CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr @vfunc1 to i64), i64 ptrtoint (ptr @vtableB to i64)) to i32), 24; CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr @vfunc2 to i64), i64 ptrtoint (ptr @vtableB to i64)) to i32) 25; CHECK-SAME: ] }, align 8 26 27define internal void @vfunc1() { 28 ret void 29} 30 31define internal void @vfunc2() { 32 ret void 33} 34 35define void @main() { 36 %1 = ptrtoint ptr @vtableA to i64 ; to keep @vtableA alive 37 %2 = ptrtoint ptr @vtableB to i64 ; to keep @vtableB alive 38 %3 = tail call { ptr, i1 } @llvm.type.checked.load(ptr null, i32 0, metadata !"vfunc1.type") 39 %4 = tail call { ptr, i1 } @llvm.type.checked.load(ptr null, i32 0, metadata !"vfunc2.type") 40 ret void 41} 42 43!999 = !{i32 1, !"Virtual Function Elim", i32 1} 44!llvm.module.flags = !{!999} 45