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 ptr] } { [2 x ptr] [ 8 ptr null, 9 ptr @vfunc2 10]}, align 8, !type !{i64 0, !"vfunc1.type"}, !type !{i64 8, !"vfunc2.type"}, !vcall_visibility !{i64 2} 11 12; CHECK: @vtableA = internal unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ 13; CHECK-SAME: ptr null, 14; CHECK-SAME: ptr @vfunc2 15; CHECK-SAME: ] }, align 8 16 17@vtableB = internal unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ 18 ptr @vfunc1, 19 ptr @vfunc2 20]}, align 8, !type !{i64 0, !"vfunc1.type"}, !type !{i64 8, !"vfunc2.type"}, !vcall_visibility !{i64 2} 21 22; CHECK: @vtableB = internal unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ 23; CHECK-SAME: ptr @vfunc1, 24; CHECK-SAME: ptr @vfunc2 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