brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.7 KiB · 84bb7a5 Raw
162 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52 3; Tests that ICP compares vtables by checking IR.4; RUN: opt < %s -passes='pgo-icall-prom' -pass-remarks=pgo-icall-prom -enable-vtable-profile-use -icp-max-num-vtable-last-candidate=2 -S 2>&1 | FileCheck %s --check-prefixes=VTABLE-COMMON,VTABLE-CMP5; Require exactly one vtable candidate for each function candidate. Tests that ICP compares function by checking IR.6; RUN: opt < %s -passes='pgo-icall-prom' -pass-remarks=pgo-icall-prom -enable-vtable-profile-use -icp-max-num-vtable-last-candidate=1 -S 2>&1 | FileCheck %s --check-prefixes=VTABLE-COMMON,FUNC-CMP7; On top of line 4, ignore 'Base1' and its derived types for vtable-based comparison. Tests that ICP compares functions.8; RUN: opt < %s -passes='pgo-icall-prom' -pass-remarks=pgo-icall-prom -enable-vtable-profile-use -icp-max-num-vtable-last-candidate=2 -icp-ignored-base-types='Base1' -S 2>&1 | FileCheck %s --check-prefixes=VTABLE-COMMON,FUNC-CMP9 10target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"11target triple = "x86_64-unknown-linux-gnu"12 13@Base1 = constant { [4 x ptr] } { [4 x ptr] [ptr null, ptr null, ptr @Base1_foo, ptr @Base1_bar] }, !type !014@Base2 = constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr null, ptr @Base2_foo] }, !type !215@Base3 = constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr null, ptr @Base3_foo] }, !type !616 17@Derived1 = constant { [3 x ptr], [4 x ptr] } { [3 x ptr] [ptr null, ptr null, ptr @Base2_foo], [4 x ptr] [ptr null, ptr null, ptr @Base1_foo, ptr @Derived1_bar] }, !type !1, !type !2, !type !318@Derived2 = constant { [3 x ptr], [3 x ptr], [4 x ptr] } { [3 x ptr] [ptr null, ptr null, ptr @Base3_foo], [3 x ptr] [ptr null, ptr null, ptr @Base2_foo], [4 x ptr] [ptr null, ptr null, ptr @Base1_foo, ptr @Derived2_bar] }, !type !4, !type !5, !type !6, !type !719@Derived3 = constant { [4 x ptr] } { [4 x ptr] [ptr null, ptr null, ptr @Base1_foo, ptr @Base1_bar] }, !type !0, !type !820 21; VTABLE-CMP: remark: <unknown>:0:0: Promote indirect call to Derived1_bar with count 600 out of 1600, sink 2 instruction(s) and compare 1 vtable(s): {Derived1}22; VTABLE-CMP: remark: <unknown>:0:0: Promote indirect call to Derived2_bar with count 500 out of 1000, sink 2 instruction(s) and compare 1 vtable(s): {Derived2}23; VTABLE-CMP: remark: <unknown>:0:0: Promote indirect call to Base1_bar with count 400 out of 500, sink 2 instruction(s) and compare 2 vtable(s): {Derived3, Base1}24 25define void @test(ptr %d) {26; VTABLE-CMP-LABEL: define void @test(27; VTABLE-CMP-SAME: ptr [[D:%.*]]) {28; VTABLE-CMP-NEXT:  [[ENTRY:.*:]]29; VTABLE-CMP-NEXT:    [[VTABLE:%.*]] = load ptr, ptr [[D]], align 8, !prof [[PROF9:![0-9]+]]30; VTABLE-CMP-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[VTABLE]], metadata !"Base1")31; VTABLE-CMP-NEXT:    tail call void @llvm.assume(i1 [[TMP0]])32; VTABLE-CMP-NEXT:    [[TMP1:%.*]] = icmp eq ptr [[VTABLE]], getelementptr inbounds (i8, ptr @Derived1, i32 40)33; VTABLE-CMP-NEXT:    br i1 [[TMP1]], label %[[IF_TRUE_DIRECT_TARG:.*]], label %[[IF_FALSE_ORIG_INDIRECT:.*]], !prof [[PROF10:![0-9]+]]34; VTABLE-CMP:       [[IF_TRUE_DIRECT_TARG]]:35; VTABLE-CMP-NEXT:    call void @Derived1_bar(ptr [[D]])36; VTABLE-CMP-NEXT:    br label %[[IF_END_ICP:.*]]37; VTABLE-CMP:       [[IF_FALSE_ORIG_INDIRECT]]:38; VTABLE-CMP-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[VTABLE]], getelementptr inbounds (i8, ptr @Derived2, i32 64)39; VTABLE-CMP-NEXT:    br i1 [[TMP2]], label %[[IF_TRUE_DIRECT_TARG1:.*]], label %[[IF_FALSE_ORIG_INDIRECT2:.*]], !prof [[PROF11:![0-9]+]]40; VTABLE-CMP:       [[IF_TRUE_DIRECT_TARG1]]:41; VTABLE-CMP-NEXT:    call void @Derived2_bar(ptr [[D]])42; VTABLE-CMP-NEXT:    br label %[[IF_END_ICP3:.*]]43; VTABLE-CMP:       [[IF_FALSE_ORIG_INDIRECT2]]:44; VTABLE-CMP-NEXT:    [[TMP3:%.*]] = icmp eq ptr [[VTABLE]], getelementptr inbounds (i8, ptr @Base1, i32 16)45; VTABLE-CMP-NEXT:    [[TMP4:%.*]] = icmp eq ptr [[VTABLE]], getelementptr inbounds (i8, ptr @Derived3, i32 16)46; VTABLE-CMP-NEXT:    [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]47; VTABLE-CMP-NEXT:    br i1 [[TMP5]], label %[[IF_TRUE_DIRECT_TARG4:.*]], label %[[IF_FALSE_ORIG_INDIRECT5:.*]], !prof [[PROF12:![0-9]+]]48; VTABLE-CMP:       [[IF_TRUE_DIRECT_TARG4]]:49; VTABLE-CMP-NEXT:    call void @Base1_bar(ptr [[D]])50; VTABLE-CMP-NEXT:    br label %[[IF_END_ICP6:.*]]51; VTABLE-CMP:       [[IF_FALSE_ORIG_INDIRECT5]]:52; VTABLE-CMP-NEXT:    [[VFN:%.*]] = getelementptr inbounds ptr, ptr [[VTABLE]], i64 153; VTABLE-CMP-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[VFN]], align 854; VTABLE-CMP-NEXT:    call void [[TMP6]](ptr [[D]])55; VTABLE-CMP-NEXT:    br label %[[IF_END_ICP6]]56; VTABLE-CMP:       [[IF_END_ICP6]]:57; VTABLE-CMP-NEXT:    br label %[[IF_END_ICP3]]58; VTABLE-CMP:       [[IF_END_ICP3]]:59; VTABLE-CMP-NEXT:    br label %[[IF_END_ICP]]60; VTABLE-CMP:       [[IF_END_ICP]]:61; VTABLE-CMP-NEXT:    ret void62;63; FUNC-CMP-LABEL: define void @test(64; FUNC-CMP-SAME: ptr [[D:%.*]]) {65; FUNC-CMP-NEXT:  [[ENTRY:.*:]]66; FUNC-CMP-NEXT:    [[VTABLE:%.*]] = load ptr, ptr [[D]], align 8, !prof [[PROF9:![0-9]+]]67; FUNC-CMP-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[VTABLE]], metadata !"Base1")68; FUNC-CMP-NEXT:    tail call void @llvm.assume(i1 [[TMP0]])69; FUNC-CMP-NEXT:    [[VFN:%.*]] = getelementptr inbounds ptr, ptr [[VTABLE]], i64 170; FUNC-CMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[VFN]], align 871; FUNC-CMP-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP1]], @Derived1_bar72; FUNC-CMP-NEXT:    br i1 [[TMP2]], label %[[IF_TRUE_DIRECT_TARG:.*]], label %[[IF_FALSE_ORIG_INDIRECT:.*]], !prof [[PROF10:![0-9]+]]73; FUNC-CMP:       [[IF_TRUE_DIRECT_TARG]]:74; FUNC-CMP-NEXT:    call void @Derived1_bar(ptr [[D]])75; FUNC-CMP-NEXT:    br label %[[IF_END_ICP:.*]]76; FUNC-CMP:       [[IF_FALSE_ORIG_INDIRECT]]:77; FUNC-CMP-NEXT:    [[TMP3:%.*]] = icmp eq ptr [[TMP1]], @Derived2_bar78; FUNC-CMP-NEXT:    br i1 [[TMP3]], label %[[IF_TRUE_DIRECT_TARG1:.*]], label %[[IF_FALSE_ORIG_INDIRECT2:.*]], !prof [[PROF11:![0-9]+]]79; FUNC-CMP:       [[IF_TRUE_DIRECT_TARG1]]:80; FUNC-CMP-NEXT:    call void @Derived2_bar(ptr [[D]])81; FUNC-CMP-NEXT:    br label %[[IF_END_ICP3:.*]]82; FUNC-CMP:       [[IF_FALSE_ORIG_INDIRECT2]]:83; FUNC-CMP-NEXT:    [[TMP4:%.*]] = icmp eq ptr [[TMP1]], @Base1_bar84; FUNC-CMP-NEXT:    br i1 [[TMP4]], label %[[IF_TRUE_DIRECT_TARG4:.*]], label %[[IF_FALSE_ORIG_INDIRECT5:.*]], !prof [[PROF12:![0-9]+]]85; FUNC-CMP:       [[IF_TRUE_DIRECT_TARG4]]:86; FUNC-CMP-NEXT:    call void @Base1_bar(ptr [[D]])87; FUNC-CMP-NEXT:    br label %[[IF_END_ICP6:.*]]88; FUNC-CMP:       [[IF_FALSE_ORIG_INDIRECT5]]:89; FUNC-CMP-NEXT:    call void [[TMP1]](ptr [[D]])90; FUNC-CMP-NEXT:    br label %[[IF_END_ICP6]]91; FUNC-CMP:       [[IF_END_ICP6]]:92; FUNC-CMP-NEXT:    br label %[[IF_END_ICP3]]93; FUNC-CMP:       [[IF_END_ICP3]]:94; FUNC-CMP-NEXT:    br label %[[IF_END_ICP]]95; FUNC-CMP:       [[IF_END_ICP]]:96; FUNC-CMP-NEXT:    ret void97;98entry:99  %vtable = load ptr, ptr %d, !prof !9100  %0 = tail call i1 @llvm.type.test(ptr %vtable, metadata !"Base1")101  tail call void @llvm.assume(i1 %0)102  %vfn = getelementptr inbounds ptr, ptr %vtable, i64 1103  %1 = load ptr, ptr %vfn104  call void %1(ptr %d), !prof !10105  ret void106}107 108define void @Base1_bar(ptr %this) {109  ret void110}111 112define void @Derived1_bar(ptr %this) {113  ret void114}115 116define void @Derived2_bar(ptr %this) {117  ret void118}119 120 121declare i1 @llvm.type.test(ptr, metadata)122declare void @llvm.assume(i1)123declare i32 @Base2_foo(ptr)124declare i32 @Base1_foo(ptr)125declare void @Base3_foo(ptr)126 127!llvm.module.flags = !{!11}128!0 = !{i64 16, !"Base1"}129!1 = !{i64 40, !"Base1"}130!2 = !{i64 16, !"Base2"}131!3 = !{i64 16, !"Derived1"}132!4 = !{i64 64, !"Base1"}133!5 = !{i64 40, !"Base2"}134!6 = !{i64 16, !"Base3"}135!7 = !{i64 16, !"Derived2"}136!8 = !{i64 16, !"Derived3"}137!9 = !{!"VP", i32 2, i64 1600, i64 -4123858694673519054, i64 600, i64 -7211198353767973908, i64 500, i64 -3574436251470806727, i64 200, i64 6288809125658696740, i64 200, i64 12345678, i64 100}138!10 = !{!"VP", i32 0, i64 1600, i64 3827408714133779784, i64 600, i64 5837445539218476403, i64 500, i64 -9064955852395570538, i64 400,  i64 56781234, i64 100}139 140!11 = !{i32 1, !"ProfileSummary", !12}141!12 = !{!13, !14, !15, !16, !17, !18, !19, !20}142!13 = !{!"ProfileFormat", !"InstrProf"}143!14 = !{!"TotalCount", i64 10000}144!15 = !{!"MaxCount", i64 10}145!16 = !{!"MaxInternalCount", i64 1}146!17 = !{!"MaxFunctionCount", i64 1000}147!18 = !{!"NumCounts", i64 3}148!19 = !{!"NumFunctions", i64 3}149!20 = !{!"DetailedSummary", !21}150!21 = !{!22, !23, !24}151!22 = !{i32 10000, i64 101, i32 1}152!23 = !{i32 990000, i64 101, i32 1}153!24 = !{i32 999999, i64 1, i32 2}154 155 156;.157; VTABLE-COMMON: [[PROF9]] = !{!"VP", i32 2, i64 100, i64 12345678, i64 100}158; VTABLE-COMMON: [[PROF10]] = !{!"branch_weights", i32 600, i32 1000}159; VTABLE-COMMON: [[PROF11]] = !{!"branch_weights", i32 500, i32 500}160; VTABLE-COMMON: [[PROF12]] = !{!"branch_weights", i32 400, i32 100}161 162