131 lines · plain
1;; Make sure we assign the original callsite to a function clone (which will be2;; the original function clone), even when we cannot update its caller (due to3;; missing metadata e.g. from mismatched profiles). Otherwise we will try to use4;; the original function for a different clone, leading to confusion later when5;; rewriting the calls.6 7;; -stats requires asserts8; REQUIRES: asserts9 10; RUN: opt -passes=memprof-context-disambiguation -supports-hot-cold-new \11; RUN: -memprof-verify-ccg -memprof-verify-nodes -stats -debug \12; RUN: -pass-remarks=memprof-context-disambiguation %s -S 2>&1 | \13; RUN: FileCheck %s --implicit-check-not="Mismatch in call clone assignment" \14; RUN: --implicit-check-not="Number of callsites assigned to call multiple non-matching clones"15 16 17; ModuleID = '<stdin>'18source_filename = "reduced.ll"19target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"20target triple = "x86_64-unknown-linux-gnu"21 22; CHECK-LABEL: define void @A()23define void @A() {24 ; CHECK: call void @C()25 call void @C()26 ret void27}28 29; CHECK-LABEL: define void @B()30define void @B() {31 ; CHECK: call void @C.memprof.1()32 call void @C(), !callsite !133 ret void34}35 36; CHECK-LABEL: define void @C()37define void @C() {38 ; CHECK: call void @F()39 call void @F(), !callsite !1640 ; CHECK: call void @D()41 call void @D(), !callsite !242 ret void43}44 45; CHECK-LABEL: define void @D()46define void @D() {47 ; CHECK: call void @E()48 call void @E(), !callsite !349 ; CHECK: call void @G()50 call void @G(), !callsite !1751 ret void52}53 54; CHECK-LABEL: define void @E()55define void @E() {56 ; CHECK: call ptr @_Znwm(i64 0) #[[NOTCOLD:[0-9]+]]57 %1 = call ptr @_Znwm(i64 0), !memprof !4, !callsite !958 ret void59}60 61; CHECK-LABEL: define void @F()62define void @F() {63 ; CHECK: call void @G()64 call void @G(), !callsite !1765 ret void66}67 68; CHECK-LABEL: define void @G()69define void @G() {70 ; CHECK: call ptr @_Znwm(i64 0) #[[NOTCOLD]]71 %2 = call ptr @_Znwm(i64 0), !memprof !10, !callsite !1572 ret void73}74 75; CHECK-LABEL: define void @A1()76define void @A1() {77 ; CHECK: call void @C()78 call void @C(), !callsite !1879 ret void80}81 82; CHECK-LABEL: define void @B1()83define void @B1() {84 ; CHECK: call void @C.memprof.1()85 call void @C(), !callsite !1986 ret void87}88 89; CHECK-LABEL: define void @C.memprof.1()90 ; CHECK: call void @F.memprof.1()91 ; CHECK: call void @D.memprof.1()92 93; CHECK-LABEL: define void @D.memprof.1()94 ; CHECK: call void @E.memprof.1()95 ; CHECK: call void @G()96 97; CHECK-LABEL: define void @E.memprof.1()98 ; CHECK: call ptr @_Znwm(i64 0) #[[COLD:[0-9]+]]99 100; CHECK-LABEL: define void @F.memprof.1()101 ; CHECK: call void @G.memprof.1()102 103; CHECK-LABEL: define void @G.memprof.1()104 ; CHECK: call ptr @_Znwm(i64 0) #[[COLD]]105 106declare ptr @_Znwm(i64)107 108; IR: attributes #[[NOTCOLD]] = { "memprof"="notcold" }109; IR: attributes #[[COLD]] = { "memprof"="cold" }110 111!0 = !{i64 123}112!1 = !{i64 234}113!2 = !{i64 345}114!3 = !{i64 456}115!4 = !{!5, !7}116!5 = !{!6, !"notcold"}117!6 = !{i64 567, i64 456, i64 345, i64 123}118!7 = !{!8, !"cold"}119!8 = !{i64 567, i64 456, i64 345, i64 234}120!9 = !{i64 567}121!10 = !{!11, !13}122!11 = !{!12, !"notcold"}123!12 = !{i64 678, i64 891, i64 789, i64 912}124!13 = !{!14, !"cold"}125!14 = !{i64 678, i64 891, i64 789, i64 812}126!15 = !{i64 678}127!16 = !{i64 789}128!17 = !{i64 891}129!18 = !{i64 912}130!19 = !{i64 812}131