Simplify WPD test case for hybrid LTO and thinTLO.

1) remove verbose information (function linkage types, alignment, TBAA) 2) remove unused element or replace irrelevant element with null (as placeholders) in virtual table, remove unused definitions of deleted elements accordingly.

Differential Revision: https://reviews.llvm.org/D116071
This commit is contained in:
minglotus-6 2021-12-21 02:59:22 +00:00
parent cd407f6e52
commit 55c71c9eac
2 changed files with 28 additions and 154 deletions

View File

@ -3,124 +3,37 @@ source_filename = "lib.cc"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu" target triple = "x86_64-unknown-linux-gnu"
%class.Derived = type { %class.Base } %Derived = type { %Base }
%class.Base = type { i32 (...)** } %Base = type { i32 (...)** }
$_ZN7DerivedD2Ev = comdat any @_ZTV7Derived = constant { [3 x i8*] } { [3 x i8*] [i8* null, i8* null, i8* bitcast (void (%Derived*)* @_ZN7DerivedD0Ev to i8*)] }, !type !0, !type !1, !vcall_visibility !2
@_ZTV4Base = constant { [3 x i8*] } { [3 x i8*] [i8* null, i8* null, i8* bitcast (void (%Base*)* @_ZN4BaseD0Ev to i8*)] }, !type !0, !vcall_visibility !2
$_ZN7DerivedD0Ev = comdat any define void @_Z3fooP4Base(%Base* %b) {
$_ZN4BaseD2Ev = comdat any
$_ZN4BaseD0Ev = comdat any
$_ZTS4Base = comdat any
$_ZTI4Base = comdat any
$_ZTV4Base = comdat any
@_ZTV7Derived = hidden unnamed_addr constant { [5 x i8*] } { [5 x i8*] [i8* null, i8* bitcast ({ i8*, i8*, i8* }* @_ZTI7Derived to i8*), i8* bitcast (void (%class.Derived*)* @_ZN7DerivedD2Ev to i8*), i8* bitcast (void (%class.Derived*)* @_ZN7DerivedD0Ev to i8*), i8* bitcast (void (%class.Derived*)* @_ZN7Derived1xEv to i8*)] }, align 8, !type !0, !type !1, !type !2, !type !3, !vcall_visibility !4
@_ZTVN10__cxxabiv120__si_class_type_infoE = external dso_local global i8*
@_ZTS7Derived = hidden constant [9 x i8] c"7Derived\00", align 1
@_ZTVN10__cxxabiv117__class_type_infoE = external dso_local global i8*
@_ZTS4Base = linkonce_odr hidden constant [6 x i8] c"4Base\00", comdat, align 1
@_ZTI4Base = linkonce_odr hidden constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv117__class_type_infoE, i64 2) to i8*), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @_ZTS4Base, i32 0, i32 0) }, comdat, align 8
@_ZTI7Derived = hidden constant { i8*, i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2) to i8*), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @_ZTS7Derived, i32 0, i32 0), i8* bitcast ({ i8*, i8* }* @_ZTI4Base to i8*) }, align 8
@_ZTV4Base = linkonce_odr hidden unnamed_addr constant { [5 x i8*] } { [5 x i8*] [i8* null, i8* bitcast ({ i8*, i8* }* @_ZTI4Base to i8*), i8* bitcast (void (%class.Base*)* @_ZN4BaseD2Ev to i8*), i8* bitcast (void (%class.Base*)* @_ZN4BaseD0Ev to i8*), i8* bitcast (void ()* @__cxa_pure_virtual to i8*)] }, comdat, align 8, !type !0, !type !1, !vcall_visibility !4
@str = private unnamed_addr constant [11 x i8] c"Derived::x\00", align 1
@str.3 = private unnamed_addr constant [23 x i8] c"In Derived::~Derived()\00", align 1
@str.4 = private unnamed_addr constant [17 x i8] c"In Base::~Base()\00", align 1
; Function Attrs: mustprogress nofree nounwind uwtable
define hidden void @_ZN7Derived1xEv(%class.Derived* nocapture nonnull readnone align 8 %this) unnamed_addr align 2 {
entry: entry:
%puts = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @str, i64 0, i64 0)) %0 = bitcast %Base* %b to void (%Base*)***
ret void %vtable = load void (%Base*)**, void (%Base*)*** %0
} %1 = bitcast void (%Base*)** %vtable to i8*
; Function Attrs: mustprogress nounwind uwtable
define hidden void @_Z3fooP4Base(%class.Base* %b) local_unnamed_addr {
entry:
%isnull = icmp eq %class.Base* %b, null
br i1 %isnull, label %delete.end, label %delete.notnull
delete.notnull: ; preds = %entry
%0 = bitcast %class.Base* %b to void (%class.Base*)***
%vtable = load void (%class.Base*)**, void (%class.Base*)*** %0, align 8, !tbaa !9
%1 = bitcast void (%class.Base*)** %vtable to i8*
%2 = tail call i1 @llvm.type.test(i8* %1, metadata !"_ZTS4Base") %2 = tail call i1 @llvm.type.test(i8* %1, metadata !"_ZTS4Base")
tail call void @llvm.assume(i1 %2) tail call void @llvm.assume(i1 %2)
%vfn = getelementptr inbounds void (%class.Base*)*, void (%class.Base*)** %vtable, i64 1 %vfn = getelementptr inbounds void (%Base*)*, void (%Base*)** %vtable, i64 0
%3 = load void (%class.Base*)*, void (%class.Base*)** %vfn, align 8 %3 = load void (%Base*)*, void (%Base*)** %vfn
tail call void %3(%class.Base* nonnull align 8 dereferenceable(8) %b) tail call void %3(%Base* %b)
br label %delete.end
delete.end: ; preds = %delete.notnull, %entry
ret void ret void
} }
declare i1 @llvm.type.test(i8*, metadata) declare i1 @llvm.type.test(i8*, metadata)
declare void @llvm.assume(i1 noundef) declare void @llvm.assume(i1)
define linkonce_odr hidden void @_ZN7DerivedD2Ev(%class.Derived* nonnull align 8 dereferenceable(8) %this) unnamed_addr comdat align 2 { define void @_ZN7DerivedD0Ev(%Derived* %this) {
entry:
%0 = getelementptr inbounds %class.Derived, %class.Derived* %this, i64 0, i32 0, i32 0
store i32 (...)** bitcast (i8** getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTV7Derived, i64 0, inrange i32 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8, !tbaa !9
%puts = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([23 x i8], [23 x i8]* @str.3, i64 0, i64 0))
store i32 (...)** bitcast (i8** getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTV4Base, i64 0, inrange i32 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8, !tbaa !9
%puts.i = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @str.4, i64 0, i64 0))
ret void ret void
} }
; Function Attrs: nounwind uwtable define void @_ZN4BaseD0Ev(%Base* %this) {
define linkonce_odr hidden void @_ZN7DerivedD0Ev(%class.Derived* nonnull align 8 dereferenceable(8) %this) unnamed_addr comdat align 2 {
entry:
%0 = getelementptr inbounds %class.Derived, %class.Derived* %this, i64 0, i32 0, i32 0
store i32 (...)** bitcast (i8** getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTV7Derived, i64 0, inrange i32 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8, !tbaa !9
%puts.i = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([23 x i8], [23 x i8]* @str.3, i64 0, i64 0))
store i32 (...)** bitcast (i8** getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTV4Base, i64 0, inrange i32 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8, !tbaa !9
%puts.i.i = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @str.4, i64 0, i64 0))
%1 = bitcast %class.Derived* %this to i8*
tail call void @_ZdlPv(i8* nonnull %1)
ret void
}
; Function Attrs: nounwind uwtable
define linkonce_odr hidden void @_ZN4BaseD2Ev(%class.Base* nonnull align 8 dereferenceable(8) %this) unnamed_addr comdat align 2 {
entry:
%0 = getelementptr inbounds %class.Base, %class.Base* %this, i64 0, i32 0
store i32 (...)** bitcast (i8** getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTV4Base, i64 0, inrange i32 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8, !tbaa !9
%puts = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @str.4, i64 0, i64 0))
ret void
}
; Function Attrs: nounwind uwtable
define linkonce_odr hidden void @_ZN4BaseD0Ev(%class.Base* nonnull align 8 dereferenceable(8) %this) unnamed_addr comdat align 2 {
entry:
tail call void @llvm.trap()
unreachable unreachable
} }
declare dso_local void @__cxa_pure_virtual() unnamed_addr
declare void @llvm.trap()
declare dso_local void @_ZdlPv(i8*) local_unnamed_addr
declare noundef i32 @puts(i8* nocapture noundef readonly) local_unnamed_addr
!llvm.module.flags = !{!5, !6, !7}
!0 = !{i64 16, !"_ZTS4Base"} !0 = !{i64 16, !"_ZTS4Base"}
!1 = !{i64 32, !"_ZTSM4BaseFvvE.virtual"} !1 = !{i64 16, !"_ZTS7Derived"}
!2 = !{i64 16, !"_ZTS7Derived"} !2 = !{i64 1}
!3 = !{i64 32, !"_ZTSM7DerivedFvvE.virtual"}
!4 = !{i64 1}
!5 = !{i32 1, !"wchar_size", i32 4}
!6 = !{i32 1, !"Virtual Function Elim", i32 0}
!7 = !{i32 7, !"uwtable", i32 1}
!9 = !{!10, !10, i64 0}
!10 = !{!"vtable pointer", !11, i64 0}
!11 = !{!"Simple C++ TBAA"}

View File

@ -14,32 +14,14 @@
; Tests that devirtualization happens. ; Tests that devirtualization happens.
; RUN: llvm-lto2 run -save-temps %t-main.bc %t-foo.bc -pass-remarks=. -o %t \ ; RUN: llvm-lto2 run -save-temps %t-main.bc %t-foo.bc -pass-remarks=. -o %t \
; RUN: -whole-program-visibility \ ; RUN: -whole-program-visibility \
; RUN: -r=%t-foo.bc,_ZN7Derived1xEv,pl \
; RUN: -r=%t-foo.bc,puts, \
; RUN: -r=%t-foo.bc,_Z3fooP4Base,pl \ ; RUN: -r=%t-foo.bc,_Z3fooP4Base,pl \
; RUN: -r=%t-foo.bc,_ZN7DerivedD2Ev,pl \
; RUN: -r=%t-foo.bc,_ZN7DerivedD0Ev,pl \ ; RUN: -r=%t-foo.bc,_ZN7DerivedD0Ev,pl \
; RUN: -r=%t-foo.bc,_ZN4BaseD2Ev,pl \
; RUN: -r=%t-foo.bc,_ZN4BaseD0Ev,pl \ ; RUN: -r=%t-foo.bc,_ZN4BaseD0Ev,pl \
; RUN: -r=%t-foo.bc,__cxa_pure_virtual, \
; RUN: -r=%t-foo.bc,_ZdlPv, \
; RUN: -r=%t-foo.bc,_ZTV7Derived,l \ ; RUN: -r=%t-foo.bc,_ZTV7Derived,l \
; RUN: -r=%t-foo.bc,_ZTVN10__cxxabiv120__si_class_type_infoE, \
; RUN: -r=%t-foo.bc,_ZTS7Derived,pl \
; RUN: -r=%t-foo.bc,_ZTVN10__cxxabiv117__class_type_infoE, \
; RUN: -r=%t-foo.bc,_ZTS4Base,pl \
; RUN: -r=%t-foo.bc,_ZTI4Base,pl \
; RUN: -r=%t-foo.bc,_ZTI7Derived,pl \
; RUN: -r=%t-foo.bc,_ZTV4Base,l \ ; RUN: -r=%t-foo.bc,_ZTV4Base,l \
; RUN: -r=%t-foo.bc,__cxa_pure_virtual, \
; RUN: -r=%t-foo.bc,_ZN7Derived1xEv, \
; RUN: -r=%t-foo.bc,_ZN7DerivedD2Ev, \
; RUN: -r=%t-foo.bc,_ZN7DerivedD0Ev, \ ; RUN: -r=%t-foo.bc,_ZN7DerivedD0Ev, \
; RUN: -r=%t-foo.bc,_ZN4BaseD2Ev, \
; RUN: -r=%t-foo.bc,_ZN4BaseD0Ev, \ ; RUN: -r=%t-foo.bc,_ZN4BaseD0Ev, \
; RUN: -r=%t-foo.bc,_ZTV7Derived,pl \ ; RUN: -r=%t-foo.bc,_ZTV7Derived,pl \
; RUN: -r=%t-foo.bc,_ZTI4Base, \
; RUN: -r=%t-foo.bc,_ZTI7Derived, \
; RUN: -r=%t-foo.bc,_ZTV4Base,pl \ ; RUN: -r=%t-foo.bc,_ZTV4Base,pl \
; RUN: -r=%t-main.bc,main,plx \ ; RUN: -r=%t-main.bc,main,plx \
; RUN: -r=%t-main.bc,_Znwm,pl \ ; RUN: -r=%t-main.bc,_Znwm,pl \
@ -62,22 +44,10 @@
; RUN: -whole-program-visibility \ ; RUN: -whole-program-visibility \
; RUN: -wholeprogramdevirt-print-index-based \ ; RUN: -wholeprogramdevirt-print-index-based \
; RUN: -o %t5 \ ; RUN: -o %t5 \
; RUN: -r=%t4.o,_ZN7Derived1xEv,pl \
; RUN: -r=%t4.o,puts, \
; RUN: -r=%t4.o,_Z3fooP4Base,pl \ ; RUN: -r=%t4.o,_Z3fooP4Base,pl \
; RUN: -r=%t4.o,_ZN7DerivedD2Ev,pl \
; RUN: -r=%t4.o,_ZN7DerivedD0Ev,pl \ ; RUN: -r=%t4.o,_ZN7DerivedD0Ev,pl \
; RUN: -r=%t4.o,_ZN4BaseD2Ev,pl \
; RUN: -r=%t4.o,_ZN4BaseD0Ev,pl \ ; RUN: -r=%t4.o,_ZN4BaseD0Ev,pl \
; RUN: -r=%t4.o,__cxa_pure_virtual, \
; RUN: -r=%t4.o,_ZdlPv, \
; RUN: -r=%t4.o,_ZTV7Derived,pl \ ; RUN: -r=%t4.o,_ZTV7Derived,pl \
; RUN: -r=%t4.o,_ZTVN10__cxxabiv120__si_class_type_infoE, \
; RUN: -r=%t4.o,_ZTS7Derived,pl \
; RUN: -r=%t4.o,_ZTVN10__cxxabiv117__class_type_infoE, \
; RUN: -r=%t4.o,_ZTS4Base,pl \
; RUN: -r=%t4.o,_ZTI4Base,pl \
; RUN: -r=%t4.o,_ZTI7Derived,pl \
; RUN: -r=%t4.o,_ZTV4Base,pl \ ; RUN: -r=%t4.o,_ZTV4Base,pl \
; RUN: -r=%t3.o,main,plx \ ; RUN: -r=%t3.o,main,plx \
; RUN: -r=%t3.o,_Znwm, \ ; RUN: -r=%t3.o,_Znwm, \
@ -93,31 +63,22 @@ source_filename = "tmp.cc"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu" target triple = "x86_64-unknown-linux-gnu"
%class.Derived = type { %class.Base } %Derived = type { %Base }
%class.Base = type { i32 (...)** } %Base = type { i32 (...)** }
@_ZTV7Derived = external dso_local unnamed_addr constant { [5 x i8*] }, align 8 @_ZTV7Derived = external constant { [5 x i8*] }
define hidden i32 @main() local_unnamed_addr { define hidden i32 @main() {
entry: entry:
%call = tail call noalias nonnull dereferenceable(8) i8* @_Znwm(i64 8) %call = tail call i8* @_Znwm(i64 8)
%0 = bitcast i8* %call to %class.Derived* %0 = bitcast i8* %call to %Derived*
%1 = getelementptr inbounds %class.Derived, %class.Derived* %0, i64 0, i32 0, i32 0 %1 = getelementptr inbounds %Derived, %Derived* %0, i64 0, i32 0, i32 0
store i32 (...)** bitcast (i8** getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTV7Derived, i64 0, inrange i32 0, i64 2) to i32 (...)**), i32 (...)*** %1, align 8, !tbaa !4 store i32 (...)** bitcast (i8** getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTV7Derived, i64 0, inrange i32 0, i64 2) to i32 (...)**), i32 (...)*** %1
%2 = getelementptr %class.Derived, %class.Derived* %0, i64 0, i32 0 %2 = getelementptr %Derived, %Derived* %0, i64 0, i32 0
tail call void @_Z3fooP4Base(%class.Base* nonnull %2) tail call void @_Z3fooP4Base(%Base* nonnull %2)
ret i32 0 ret i32 0
} }
declare dso_local nonnull i8* @_Znwm(i64) local_unnamed_addr declare i8* @_Znwm(i64)
declare dso_local void @_Z3fooP4Base(%class.Base*) local_unnamed_addr declare void @_Z3fooP4Base(%Base*)
!llvm.module.flags = !{!0, !1, !2}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 1, !"Virtual Function Elim", i32 0}
!2 = !{i32 7, !"uwtable", i32 1}
!4 = !{!5, !5, i64 0}
!5 = !{!"vtable pointer", !6, i64 0}
!6 = !{!"Simple C++ TBAA"}