The legacy PM is deprecated, so update a bunch of lit tests running opt to use the new PM syntax when specifying the pipeline. In this patch focus has been put on test cases for ConstantMerge, ConstraintElimination, CorrelatedValuePropagation, GlobalDCE, GlobalOpt, SCCP, TailCallElim and PredicateInfo. Differential Revision: https://reviews.llvm.org/D114516
59 lines
2.6 KiB
LLVM
59 lines
2.6 KiB
LLVM
; RUN: opt < %s -passes=globaldce -S | FileCheck %s
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
declare dso_local noalias nonnull i8* @_Znwm(i64)
|
|
declare { i8*, i1 } @llvm.type.checked.load(i8*, i32, metadata)
|
|
|
|
; %struct.A is a C++ struct with two virtual functions, A::foo and A::bar. The
|
|
; !vcall_visibility metadata is set on the vtable, so we know that all virtual
|
|
; calls through this vtable are visible and use the @llvm.type.checked.load
|
|
; intrinsic. Function test_A makes a call to A::foo, but there is no call to
|
|
; A::bar anywhere, so A::bar can be deleted, and its vtable slot replaced with
|
|
; null.
|
|
|
|
%struct.A = type { i32 (...)** }
|
|
|
|
; The pointer to A::bar in the vtable can be removed, because it will never be
|
|
; loaded. We replace it with null to keep the layout the same. Because it is at
|
|
; the end of the vtable we could potentially shrink the vtable, but don't
|
|
; currently do that.
|
|
; CHECK: @_ZTV1A = internal unnamed_addr constant { [4 x i8*] } { [4 x i8*] [i8* null, i8* null, i8* bitcast (i32 (%struct.A*)* @_ZN1A3fooEv to i8*), i8* null] }
|
|
@_ZTV1A = internal unnamed_addr constant { [4 x i8*] } { [4 x i8*] [i8* null, i8* null, i8* bitcast (i32 (%struct.A*)* @_ZN1A3fooEv to i8*), i8* bitcast (i32 (%struct.A*)* @_ZN1A3barEv to i8*)] }, align 8, !type !0, !type !1, !type !2, !vcall_visibility !3
|
|
|
|
; A::foo is called, so must be retained.
|
|
; CHECK: define internal i32 @_ZN1A3fooEv(
|
|
define internal i32 @_ZN1A3fooEv(%struct.A* nocapture readnone %this) {
|
|
entry:
|
|
ret i32 42
|
|
}
|
|
|
|
; A::bar is not used, so can be deleted.
|
|
; CHECK-NOT: define internal i32 @_ZN1A3barEv(
|
|
define internal i32 @_ZN1A3barEv(%struct.A* nocapture readnone %this) {
|
|
entry:
|
|
ret i32 1337
|
|
}
|
|
|
|
define dso_local i32 @test_A() {
|
|
entry:
|
|
%call = tail call i8* @_Znwm(i64 8)
|
|
%0 = bitcast i8* %call to %struct.A*
|
|
%1 = bitcast i8* %call to i32 (...)***
|
|
store i32 (...)** bitcast (i8** getelementptr inbounds ({ [4 x i8*] }, { [4 x i8*] }* @_ZTV1A, i64 0, inrange i32 0, i64 2) to i32 (...)**), i32 (...)*** %1, align 8
|
|
%2 = tail call { i8*, i1 } @llvm.type.checked.load(i8* bitcast (i8** getelementptr inbounds ({ [4 x i8*] }, { [4 x i8*] }* @_ZTV1A, i64 0, inrange i32 0, i64 2) to i8*), i32 0, metadata !"_ZTS1A"), !nosanitize !9
|
|
%3 = extractvalue { i8*, i1 } %2, 0, !nosanitize !9
|
|
%4 = bitcast i8* %3 to i32 (%struct.A*)*, !nosanitize !9
|
|
%call1 = tail call i32 %4(%struct.A* nonnull %0)
|
|
ret i32 %call1
|
|
}
|
|
|
|
!llvm.module.flags = !{!4}
|
|
|
|
!0 = !{i64 16, !"_ZTS1A"}
|
|
!1 = !{i64 16, !"_ZTSM1AFivE.virtual"}
|
|
!2 = !{i64 24, !"_ZTSM1AFivE.virtual"}
|
|
!3 = !{i64 2}
|
|
!4 = !{i32 1, !"Virtual Function Elim", i32 1}
|
|
!9 = !{}
|