[llvm] [llvm-profgen] Add pgo accuracy metrics (PR #93975)

via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 2 20:38:51 PDT 2024


https://github.com/lifengxiang1025 updated https://github.com/llvm/llvm-project/pull/93975

>From 81dab7e1f4ac2c3d2e62b6a765e50fb87d7505da Mon Sep 17 00:00:00 2001
From: lifengxiang <lifengxiang at kuaishou.com>
Date: Fri, 31 May 2024 23:23:16 +0800
Subject: [PATCH 1/2] [llvm-profgen] Add pgo accuracy metrics

---
 .../Inputs/pgo-accuracy-metrics.perfbin       | Bin 0 -> 33472 bytes
 .../Inputs/pgo-accuracy-metrics.perfscrpit    |   2 +
 .../llvm-profgen/pgo-accuracy-metrics.test    |  24 ++++
 llvm/tools/llvm-profgen/CMakeLists.txt        |   1 +
 .../tools/llvm-profgen/PGOAccuracyMetrics.cpp | 106 ++++++++++++++++++
 llvm/tools/llvm-profgen/PGOAccuracyMetrics.h  |  45 ++++++++
 llvm/tools/llvm-profgen/ProfiledBinary.cpp    |   8 ++
 llvm/tools/llvm-profgen/ProfiledBinary.h      |  10 ++
 llvm/tools/llvm-profgen/llvm-profgen.cpp      |  13 +++
 9 files changed, 209 insertions(+)
 create mode 100755 llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfbin
 create mode 100644 llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfscrpit
 create mode 100644 llvm/test/tools/llvm-profgen/pgo-accuracy-metrics.test
 create mode 100644 llvm/tools/llvm-profgen/PGOAccuracyMetrics.cpp
 create mode 100644 llvm/tools/llvm-profgen/PGOAccuracyMetrics.h

diff --git a/llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfbin b/llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfbin
new file mode 100755
index 0000000000000000000000000000000000000000..7ae145c299adbabe28f7e8652addaa854e21b135
GIT binary patch
literal 33472
zcmeHwd3+RA_V2Cg>Lg7ForHw$5QG>&0in}j35$ve5J)s2f*>l;cGBHROQ$<_cQ$cB
zK@=4P+!x%pnUQfF$9- at c6`dK;Sr}(@oI!tsIy$%xu6f^cZr$!mC(OLx`@G+K|D at o1
zzxSMb&fV%()xA}f>ho(G=Ifd!)MgX21xc^wOHH+zP~B}tK-FS~$VGUB7%Q?M8?2M*
z)sm1Zw-&uO=a_mMnEdWF(=&O5X{T7#keK`qwcSe<!lqc5?I1rpC75z1?=<V7Sf!`R
zD<fxYWgMosiwv+Sw)#<3?w!QR;@)F>^PL&(R(_-=zn4wFmrXy#`KF&@)t}TSgcr>8
zOfEwjZDky$`*895$pHJB2}TCbGwl_VEo~>k&+KZc_z$7#_9bR{hw7IVX8jeL-76|0
z;l`?|6_LQCNI2TwHK}Vx)ugJao<z(uncGeIlkI{<%eW at 0AIn&hX_T(=Gu8i*$iA!}
ztJTmI_M^Y{5c-Zo=;t3oPwgoKGPj9Plw~R*Ujmf(qhAkQfAthTUvq0L>Psa3 at ubfu
zeDx<U^aX<PU~@Q;48~7hI5!fD22b`kMuIY}|CG}fElth{#}d9qe<C=wJ{nHWtE}x1
zzP|dotoJo_`F;Lmuq&Jtaep*`YLF%rj`}0vvr&`}`?<-iRjWT76_69jK+{o2(Y~%C
zu{9NIZh|REm85Ty`UMU3bLRRcdnS9P368H=;hW-_%6+2?8~({5Mll)>ns^<o`n!F2
z*ddVe7Te48ADQW-N{-)-Lrxd}Wu~j+S{;WE6v%`J%;Q$+cToY at 9?Q_TnfALf^h(})
zob;n(jmDzd-nHoYyk;isx9F|M=K+g8TV(=1Xwj>>QnI_6LLtc3T5ef2X{BEFqm;*0
zOD22jSG9SoWsLOd+(DWd)fCEntmRf$vzp7rju_YmdSIXj26|wi2L^gzpa%weV4w&7
zFZV#*`hVoqU1tAPg%EWY?MmABm!g2W^)KW+FAM6K_BSN;jC~KGb5u2AB)3rF2k-V^
z8~YZ?G)4U2b(Y^CnWlyx>|%L0$uuSW-~pDOBblaxAKc3F6C~3V_JggEm(^{0zi#uf
z4?($~((5ieb|&I=o2T8vRGf>2@&3D!vg&!N583a3iN(r~>o at ILUAO6Pb?e_du=wPL
z&GuiQT6LTA>X?q*gEIE7gy|O{k8{)pNJ4ByS at oQ;eGbvggUMoa$FDtzqdOcu?>a}V
zBSRF%4EqvUpF*PXKh$kHQ1|R7$JIT1&{n7YvTn~0$s%NMwV6Rq&$}V#sCjAsb;te=
zNus at CS>5_$J1B|<BnKng$ynO$fBT1?p8YMT<1g(yk*HB4xm?8`tVN=w{@h>d|B?Sv
z?RUsayi|Ko(if5r5M6NY0rA%_?dML}zXjPpPW$Tme|^3F8<EVttoGpgUD~GFgC99A
ztNntbUwkAkt3ANc10TImxeJ3KpQ<4{tmc%OO+7Ws>o<K>v#fs8?`qJ^W6wBBU_Wf0
z)B;}GF#i3 at Kh-_^y^TiJ{vF?A7hd#na-{Na*z{q;rmyB9kDj7G*R6kEtDE^z`-e2(
zPG42CvSwAy>KfnkThk5v9OID3XnIIelLoed9vJ9>fgTv>fq@<v=z)PA80dk49vJ9>
zfgTv>f&XR?Xn2;TmD-N3h95nn8F8Se=W_7n;77nufoU!I5_l!apZ4_p7CiB at o}MDC
zByR$*1Q$U^n|AgRp>^eJrGv9`wrbh=q^D>2P4J&U2Ikhky%1xNPWG4lv!|zxY=`8}
zAL2gVncJDOP8>J<=m}HCl#`llu&frZ!;YSbikcz$8}+$)S<NUIBBcj_cTq0itx)ND
z6B|%Et!Q__KNp<xpD+C>?>m8fv^PlUbB5$!q1O&^Z?V-5Dcfw+4jFg3y>5tiV^-ae
z8SAqb4yld|nNc&uTQg+boFQd%hPYurXGjh|SNsRuXCNQz^D at eEU>oRxfgTv>fq@<v
z=z)PA80dk49vJ9>fgTv>f&O|xy;rE-Bg}knkRIyMM(--prsT(@n3A8%kY6|D!6x&9
z1 at SynzSDepw8WIv`;PROm^SmZMloE9srMUceMOskx9`gzdSWE+Hy1(boyCLZ%Yy1%
z#T-)}M8?=YlZ5xp<>ofI*knbf8 at -&)n_6paH4W5ylh(Mjxg-g<S+LSqn-x>_-fP;a
zcM(<j-}cD%Ael|^V3pe^UoyuNb5mCJz%rE6KQv^9Uz at Tinx*`|C-q)=X316Nj-7Av
za+5<QcbL4<Wb$7yckZmRad-oJeA!gb49~Q($==Fo-m1w{%Em1T2FmLENvWSSW#)LR
zaite8>sG>ga;3L&iZ^X76DCzwju%Z4f3&%*BN$JFW6`q8nI5ml+Z;}ojYCikc$#AI
zHqV-Ne>l++YlqZ2tEsIm8H+^{6^-rTNT4DT>1g$k%hV}To2Gkb_yaS%RiVZifktmr
z<IKj&z_hBWY5t(Mv8gK9G_$fQFka}!R<n6HoF?K{iJ=ZZ$hj<=ukT_EjLFf2BS#m7
z7{a-D*VU0 at 7kW+>;@Kic)3kNia`bE>Lzkh!WaCh?6Xht%l9Kci&12}V7c?GenmF8y
zq080qlB19gV%=sljs|PT>$iz)!*0(KS+?r^IG(a>o9E#$%CcS2z_j&rrfuC!+wWq!
z@^PlC{>*gs0j6v0$T`b)?Qo{+#xq?%ndyc$rW>~~-E<Grj^8ldypQSD&zNo>jFU>1
z?T*8l?wrPScRSOMwlLjyAJb1?WP0F_Ob>m`^l<(Va(`qr)6c4y9<68k`AVk8VoZ<U
z%=E-grYB!ydg^Var at v%+<}fE^_KQlUXO}WPzlQ0B4NNcI#`Mc4m|l8=>E*vNz48sy
z?x7eSS+-XvGQC#I^s8k|zYa3}ri<zI%bE7v!t}<&pln;Nwi3f9+csEBGUsXAm`gRP
zPquBOMxB#wJ6xk~$+nHrs6(=C<4nKtrr!ki)6cN`v$Bt$PD3Iqd)5))oW`c?`3{PS
zLBXs+6^|kNtU=xvm?~dqn!J~3>bp$S_A^x-V48lAX(s&zLDryIIZQ|AGach*nq9_p
z+&HEhFVmc3nC8|o&0EYge+AQmGnndHnCjb at PUvE4SjV*R5~f94nHFEibkeOvxzp}t
zs`@e0^rwl2RPSc0*~>KNznJEJ!8A`FN+z}WO!G%FEttquH;bvhj_LU2OeX}G8sbc+
ztRu>wx`n9V{2ff|?q<61mrNU8W!m@`rcGZkU2ek_C#zs{0n?UIOjk@|+L~nAb_vt=
zo0zV=hv}+^n67 at 7>6+J>u6>W``p=ne$i~GltKh~mrX4exZe7ZB$7-fKo0;xf%XIff
zrhD#Sy7x(@AHB)+lfN<D_bt-_=P=6pvkIm!W-)y^hDJfbSM at 9%T*dVDjZELHVfuDG
z(|125Dr|g~sp%D_;9E?g51E<|GPPvm0-RMC9>#R$7^XE-m?F!WT4PMn^-QtrnA+}R
zI%^kGd>>QdJEmj-F3wqn?Gu<f>X<rDVd^@Yse2RCdE1%J-@&wQC({MbGF|vO)B3+K
zZTOh!B7yl&R^i56ri)9NE;)*6Q$5qAtC=oKFl}DTbj2p7tvi^uJ<7CwH`C+$n4b8a
z>B(W3L1h&_HG%2rI-+4q{7g&NGM&t4?_tZ=vvkTfrc-ZWI(;Y8$|spt{hDd at pP76g
zGM#ad$)Am>Th_3~VN6Y9nF3Rpf^(Tdr!X~#m|EJI!W)R(ORr=K-OkkgAk*c$m~Q(m
z(<A$sUiysbEe%t_EceIxplr9$Mllc7Jj~;?Im}0Er!z0oV$6Q+Jm#dfnR%UdH}hTE
z6U>ikuQ0!=?PY#P`#bZe+E>gAb^BpdUW;DDJl+`1Ji(aAJjs~G>@nssR~So~D~(3x
z$;MgCQ;c=Y(~K*atBjkOryDz&XBtm2&oW+RKH7MT`B>uv=Gn&g%*Po8BdI<$##rV#
z##H9H#$4uFV+r$o!_U0HXk)H7&SyT}*us2*v4eS`aUb&{<4NWdjor*A8GmG6Vtm59
z)Ub`Ba+euy=H<p@=2MIY=2MLj^J&If=F^R>%&UyMm{%K5F#C+(F#C=7m>Z3Q%uUAN
zGRi+_lre`4FLSd|%^WrsGoNYrnAaFl=BRNlbIjPx+-B at xjvG6f6UNibN#j?{oyObD
zUB*9{yNz#|*BXNkr}ED+N|?_z#xb97OlMwa%xAv9SjN2G2rzFjlFSzw8<;OPu42B#
zxRZI4 at d)!}#tY1s8*egiHvYzZh4Cr#RzoYN^0yfU%vTzRGhby?F<)(*z<jN72J>}B
zJM;C%rOY=Pw=myiJi@%gc!l{E;~nN(jf2d$8HJ;%oI8w(%y$~cFyCb~FyCXWWWLvk
zF#pInhxsSQ<;?dPw=wTD9%a7Yc$N79<6Y(ljW3xWHU?p;neBeW7|#4NV*>Nfjakf(
z8OJj}Zkz_j9C#u^ZTV(xu-?M4Et;^6!=y1!-`2HN6NVX2ZqtOF;zMk6VTaVV?V89U
z4c;p at h_vNbX!!>)Pc6{T%s&Xu*H;(VbMz&JIb^1vED8rXDYD8KYB%&{g}D<+S|JMa
zycAi9Jc=B4qiArpQG5(E!>SP&qG(8#=5pp_=aYG%k>?(&`!zb1I=FOqk^X_s;+fEi
zk{H7LP6Wg3)x(S3E<MY(os4g!fIJ+xA`m6lA}n&-jZ#W2C0}=m{x6vmr8zh|_i#Or
z`@``o(y?pl8;F+t0l^3|beHNU=$tWmn3Wo#FOfR(VBf=p`!IcNU*$;sLre8Xj?xdX
z=q}T{v=auy`4kE`7D7zqFGX0MRakU*c24O^#7q1LMo@>9t|5_ at 3hvQ*tMuk(XJp|X
zqlY!F at eVkMlG`Z*b{nf-XK{NGdP~WryD57r(tU(}uuo4NssE7H3HLaCrEDzMfa_0P
zh;A6KUnEnwOHJhjz1YTkF}*9 at N9lo#{&FnB1X`3VML5dtb(c+~F(Jw(5gBEkB=k9D
z6-4>saCfEtV88zE$@*FS)lKH^o}xdUQ9m<bsvfZ<a8=yX^vC<?s`R+*#Vo8<96XqK
z*Olf%E}=bDK3%^tJu0aSMEMN;4&Em;x*QaU@|pUsOw}y?%1p<j_3yZQ(~j<A^iyoC
z>)rW|&8UDV-A>iG7Qu*{5DY)oJzF0oD=dpWPQST#89WF?d9{9b at 9LQP8vUC7?A>$p
zn=Sn?6l)^uXmUd?p#t4=@d`s`3+Cz1X|?3RgQOlYQB-T>lrADKD$PA#e?@D~uvlOi
z?mB(AmQfvcch~E`)pqo9kOyng@%9||3Hl#3I<nH`$;9#o{e^T-a%D&q?uB|#9z!%>
zg?o`+D at AG%?>^Z%?i2O;%<9Mt7VC>-0#}yZWWq`M5=#OPADOU3KQ%qpa3C$!FSN?#
zC+qvtd6A!RFVhFfyi(N?<;(StGtExXi!;sKEA(oME?o`%)GXV#a^Y*33s^fZV6zHd
zmdlS{%jL%#a`~}Wt~>V0b;o;h!STLaaQt1aLiW?TWAqDm7yOPgaBRkUg#%2e at 0YXe
z2jndKK{?BQNY1h!rdhUdpQgX6(e2dqt`kM48~N^)`aX at bN(~`%f3L#+Uafzq{kWHt
zndr;T(F0?0X3f!&cm6JzG&{x=g|f8#*ANdo#ul~M^?W)G&U74+PvdEgV;tK>9H+6|
z>R8Dfb*y5JIaYIeo1=#FILk4I{o{_goStyhGAA7yncE$m`7^Ng?R0pHI&!r9d5CvA
zDvP?Zb-o6k?U=$Bfwhk5Y<G^MndNgGVdnE3XELAfSi|Y-91Wbu1&)R6f1zU$r>}P`
zX5QeqnE4{d*~2%MUp)9+I!$qJIOt?A#$Gab-HWJ02`$~rH|53nBtU^EzcjDSB3+hu
zmPNWeFK&@G=Or!Dmb`>Tx+1ULB5lp<ut?kTIxW)nye^A$WnQ;Mx+?Eni*$9~I*W8o
z-lnwVzSgPBi#q8<{#{t{U*`-Sk^fUfZgjR5*z=v?!s}_ at I@gH88#ofl5l7zS)OGg`
z=XV-iVdS|?9+@{gv*eNZ333o6pCcUSzQvhqQI_B8+{!03?$h$yoL6#%q;$LU8a^|z
z<i5lCna(9F#{B{Z2ULtKa5;3MWEsNo6MP8obiS{b1Q0oj^Gmr1_g&66`&9I9XTFW@
zfymv<&7XLWbEGZ@|D=1Jf72XPv~d5(IYsAzAnWvFr_IJyq(HcT;w-e$O%#Vkcb{`l
zx;)|D={#L_GG$<%41ekjS*}Z|X^C*(?_4d7d(T(Iqz9Y_b*@pmyB*vG6CZSrF{?fD
zA!i4leBBQ_|01i9+CgH{BhD_(!SjUjpE>X3UBCrjk2 at x!^k#%5)Xwrpoj>Qsq!MMH
zl>glMBwrXZ^zO%;ugTpjJLqv|ST>C>`j!jD6V682H1174E$6#%ntRgOO#`jH at OnB)
zIXf}XIMS6PCO+kyXtvG$v at _e5J|ViFak_08C&}_(ICroGSEPKGa}P at y^(}wa`FlR$
zW$K at E-p7~GlwOoS at 4TN+sA(0?s9&^u^Y at _UFWIB{e+2(>Xvq<iUbfG&Io^jPO6ayx
z`78F1c_6aNz1x0_Y`hd-wa>PQ<*(U4v)KO1K2&z7wEeYxq_katyF-o!1frBuN>4(x
zgzinbe`AlzG0J_;S&^}Dzi!Xh$W~6CsTsn(#~zSZXwHvxxP-o8KUS7$smGgkbK1zw
zml^)n{-Vyu;5$^A^wG$vr8L^yzq1d^DAOT*e{cU$--7>O|2W-Pc@$9<gnO at jbh?Wi
zvvK=Ml*~mqf?NDY`)4|jQrSmu*<Y2_YKKLiYSFpC{U>`-x*##~&-URgPI}wE$R^M4
z?sx2G$_kpD@)!H;KArNeeO_88+<&$IT#9nc{muRmcc7H^*&j(svWQ9V+5e@>QR05z
ze!sP}N&jVU(72}@v=@c@@Ak!(?n>`jd8XZOkH}O`Ff06l{lRpWyw494V?VS%Pn}f$
zk$n#zc at zluKkUz>+hNw|V|&6<BJXuMx&Or8ZOK>a{%K#EQ2}#xaKL_{C4q;CS-nr~
zf9OB|&+LEclmF-Tjs0a~7V?FCpT#3x)%-A~LSGd>Q4$4 at NFd-T#+OCo_|pEb;;H2a
zi{*uz=d0yk7t2eol)fpxo%fiOzAcs)St)&2e19s<L3c7m`S-==q*S8(hhll9mF7Lg
z7p2oYLMy(+B5GRkW{aq6#oH~SO)I|EA{tupO%~Cv6~9eII5?m?tHP6|6+f5K2~W0G
z{Gvt7(Td+9J2?hD4z2hnRDV+(q`9j2YCwVT<Z7-N7ICoVnq?95G}kdH(IGvCXs(A-
zI^l6 at uH!6XzUHd4hy|J}U=a&7*P|A3sOEayA{J?`r&6L>TCwJ8PV1JBK%GmdcRa&1
z*O}=AQVEYsbG4>)!sFIlZ5FXab0t!u<2KHUWY2KTbwfIVV!~6ZxoT26;TfU1j<<-1
zX|5d>air#&YY|6jt_F)(rnz?W4kexN9Im-ON{bbwEZ0g7tDvjVXsu*~XN=}rVR0V|
zk*`z~2+t7^`6 at +$@EobRPO}(~gJ>}x57A;gL36FN7#{`EVmuL|#dwnD`mx2>1JPn!
z0nuXY)m(3-jLltF30=y=K{4T(3|-32K{4T(qPf0F`3lceh$%PWnFcZCAv{%@>syQQ
zbchz?84xYTGd0&1i}5Uo7UQEKT8xj;To+i3kA-M4o((Z=>^)9%EtU)Qw2QZzlqnzC
zVs8y8Q=YQP-Z`49DZ^cMns+Xx^v=V~Xdb2X&dAKIR&y=Q$W3_Xld^Y4!n=T!z4H*>
zI?c7bk9$2SGu at 9TWrn-w1kH6vsuRpz-vC{Pvu7c68NS{{nrpl~u~QDhdtyo^Z{b~>
zlF3tePSRZ8rOFbXB at k1^2+vZ8sS<?uWX-ieu7qXg%Tlt;e0fUd%)O`Ju(jH+NXgRv
z)RZhMbDHMbV5!XM5G|Ei2{Bz6&nnHe&0 at S7qQ%$;(PDgt=DOHo?1yMEZiJXN_BLs*
z`SJ#jY-S)O%W4NxGFRIh(p)E4?VD4wv~NktZ0`wcuD^0+c$VWi6CzheifbTpWmxn^
zG}q+xSQ6e=lGAnfMoG3*KBl=!)Ar^u&_>FXlR5m)B4x_c9Qkq0b(qDSE9^~>GVLyv
zNm6FIw`;D$E$*`aI!Kvzr<m||k}}i13zxnOcL!ggyxo-2I}bDEY)a{!k(shqbGg&G
z3GX>1r}7Zqb4gBl3h#NikX!A~C)r}Zj%17d1)9r~w&%IG at LovDl#{7kPs)_1sobEs
z##-F at g6qAAlxcUV+(^o_yHsARxol~7;k|_9l&A1+B01$Gyq97kVzs}FWQ+afB&Y3#
zR-la?JJfC)8+YZqO2-yx%SI<$NvvA*nVM}ZKJGVF*v8fmot1lZuI`RPVd&5wgNN95
zd|i<vSvi7|-B{n_Z?O=yQ#8k;MaSC4QpzzU$CX^H!Np-0^+*~t6P|dQ<Pim>g;~{Z
z+YwWdIM|~pk(}y>9tUOKRG}kXD)2Zdmu;~ARlZU7%^!x0Wnp-rG*qj~&CMkrJORo}
z)qe)Wp)N~W(HNx7hN%$6nnpDnb~y5x4%tOXxw*3ub$ifYWM;1)N)5q0%E_%5J`^U@
z5v9{v9&rTIVYCDr=|P&+XB5?ma>U~YStF{=;dG3YoB5-~GXK%(o>QtZvr=6=*33F(
ze#B5gwK!50nd<FvbjM=+5eO!vx(Ba29#zauov50XvY%wt;GzN1?08u(+@?h*vkFJH
znVRYqae_uKt>uU(P$1ra`*uhk5tQ^YDk7u!ol86(7ahQQ;6~tUU<C|xZItdDekPeG
z$o?GCZJ^j?2yD-hxSL`cZnPQ&2<#;Y^l}8+1PUgT*iFIFB+?C8JZXdRG7?u&5FlL}
zf~+ozT|l}`BwkIi8!2XBl<Mj=zyd?FmkhG)7RMWCT9)n6^PeD1E;Kn?bv%a9*j&9O
zSfJ;oRCL+JR%CY!dcWO1q}}eyO4{v7dtO$By(nviJ at 3L}5OZv^=T+G4+wEg)XM6DO
z-qx&XS-BoP3)%dCc>}VdCDt0OhzBG7ZhV0^6pS`^h4CV0MKYL33VfGUsBgat`t~cn
z`?@sQFvI5y$HFZ7nquuysC^y&NIQMqwX>;3v_})+<|tkW4RaDyjYz3kvZUrz-_rWi
zYJDf4y114;N$YFHr(f~0SYJ|f!WI;24kkOB at Il%Wee>%ZYGJ~}>V!Z}{y15+wUZT7
zLWDZQfuLYVB#YL at cqAB2R|228Z59c9dlrsJOUB at da=HFsRwM-HNbc=XS%r>JXImVV
z3W?@6Un~?#1gTsVi{VApP$bsr^T(TkpkLtgxxR$IBPb>65Pa!2fj0S at 1@cNX`J*Ax
zkx-c;W~x#eQ_<OkDz!GEu`oc#fLhy_Vvz`QTQ^gpElM0phFgOo*-CM0I4Ej5MorIX
zlXT&XsT&ifZ!#7jDH#h1v__VejIEJ6E-V>qXYLBcsf1(<6>AN)a>m4zF}M{S!V&5w
z<k-{_Cu(bqb7pZ<P9&iwHzecx#L;$q9JtFYEg)!5l?7t$^hsi_m259nA<}z)mhn#Y
z`GQ?d!L}q`81}UxXBwQ9)8oNpOB{P9m4+`ES5C{Yt(=ldCf8c*z6>w3et}?Pdo$va
zQzM%OqG-qPn1NB1(&EkJI7Fx`t4NQ?l*wkKYN{FWh5QNWhGZ5}#w?{gSW3G^f>uA4
z(vB>qJy}e-w)(rwve8t;B2BSqhrphS#G3r*Ye}pOC;X9Ud#fOBYw?4dqRDs!90=pp
zYH)Mh-_`=g;19;Ze2@^gN1G@;(dKUog4^5LIK4|cCS%e8JJU>P#0%eR#98ezd?-5D
zD*TPqclby&ojH8|2r4Da?@0TTzO&lHO>3}AQ3XGZRs>-RBBC)7^kaBo7vYugHk=+p
zQ8W?lq6|XuAfFk6Xm6`jwPJKd=>$M0f&?ObLO3fyrQ<kew*-H=8iSRN52lDD91DqV
zd_J2GHabe_VB(`S5($JmP_VC->KKXmk;FQ#rRk1g%(>Bc=19oQ9iPcQZPCos5itdM
z)#AYLE%1ff at a=812YWOgjK at W&DH2NrMJPyzEEF-QLXq}F3!ggCVw}C;!i+H1hQ`u)
zQl2fLK^p at U%9KPfxJJ;qjeU|qR4mjP4=1_Tc#vZ+QX!NDjd|=UI at IIAs2^vYco64p
zbWt$b*p9XYlO4p#*0xX>;|dHbc}8u*Nzgo>b|{u(2WQ2QIy;&t$!N+#Cg6Hw9!cnJ
z>>KJ4#Jbz)oE}besxga*9JHNsa3M(zUujOpY9M#2k=&_<vOE)$jT+3IYBYDMQQMgs
z&t_Ew#*Z4>rj@@5JHU at C4EDWW29rfoFpR#XVSzI(?X^~nE$oM`HW3MM7;DCn*j(uq
zNC}CySf at ywg+UocMj?bzWF=3IXf&U#!BkX>3~^A95aE)cgIf!9M9`rk&{0SS4=5s<
za53Z{#32;1wr;v|ry at u&RS|*fU5EmXHBqdI<t8Y)+9q=V1){8It)zHsC97I1(eyyL
zl>>}hM4 at Q)6CmQqq at arfmb*xS{-b~t;b=s(bhqJD!C^=ePD|*pMj4`uNQj6?v%eKt
zOA46`b%d_wCPB?2t1*MYwI>oM<^+l$1^WW~hC*nGST~vClUak7VyA>CKnw?HV>cC%
ziXlZQDZMM{58=!E=@_M(N|}zK<c|kfE2Gjv#v^p>;e+}3hJQL1N=G>zr&H2^I0cL|
z4NiuQk*H!Er&3|2m<ebH>(P{?>_JI5oLPiAj#Io0p(G(fXWgzYUvnhZ=#OB^6UTvy
z(;t7=-?yOQ#5pw$K3}4}(O2)I38e>ru_Gp8l1!_Hh1E1&#uqyArxLW$n-sLYZL*qU
z)9Q-su at vAB%+nNnqTxN-h8GeS<Bz+rz~Sv3yw=u^*mmH at z%{@vz at 5Ouz#G7m!1KT>
z!0&<kY$y->DeyV)J<x#+4HT9O&<9XTfpTC1PzlTct^oc7*n!!=0$>q9A4+Kg)&R7q
zISM!zcn|ml*a&O^t^;ld?gO3yUIX3&_5mLQUjaQpHWnyOU>I;1Fcz2yOa+bws(}T-
ziNGm<4+sOi;z8Rw5kC*u09*!~f;_i_Zvbuw?gbtI9s`~Q at It5fGw=%HuLFC5cY(hH
z{{+4UG~}BH90?QyBY{d_3Qz-_3tR!*2;2oc1Uv`40*t_l at K50PfKP!QAP+05QeZqV
z16Tko2hITQK>CBg<G{<n9^frtA8-Kp0T>Ls;lMaxIxrtt2Kaz55Cgh_4Z!8VRlrTa
zoxpv-BfwL at 3&3l at Z-KXg_koXr_fY3wU`%|8_&2~ai2ndKz=c2wa3nAhs06Bj*+2vE
zCQuG61y%sB0dD|4AOu8!cHkUf1aKK}A#f?M6}T3-8MqtR2|Nls4ZH}v3hV*?0K5&n
z4}1cA349MYu^$U at d=vvCfU&?tpc0q?90$|_3xTD;yTGY{4+sKlfNy{V&<$JwTntnL
zTYzhTzXGQLJAgBQyMX(Ehk<W_CxB;xPl2K6$5+66fW5$9fc?M$z=5={!5TORC<KNB
zV*n2 at 9jFHCfhEA{Kmce3I)L+mOMq>_4Zt11PT=RjF5rG(74Qo1Yv4^_FYpeq8<>Va
zy!#fs57-ZU0(=g94fFsuq&on7???Oway_^Z_$}hAz%Jl0U^Flhm<r4SYJfUm5wHwc
z2{Zy>pbcmT)&ds*mjYJ-lW`uq8GHwDFR&AM7<e3b26zG34ZIHg0eA=42Ydkh6ZjlB
z2z(Fd_^Z|&U<fc2C;>(RV}Xgl6ksM$4J-f_0n35aKoDpJ+JSR{jldPa)xb at _9l*W7
zPl2hxET9JP0U;m?bO7f87XzbEpGUxt1J3|218)NF0Q-T at fgb<|+FuMD4jctk0X0A!
zuoyT4HqAf`=mgFOE&*0h8W0BJKsRs!unE`-TnF3=+zspm9sza(zahr4G97tT;JEp>
zcSI^;ZOMvwOGO~q!GC%hOirrwR>WhmWJP--PQPJPf#0mDz>gRCs-{kg2Lmnsr2Ijn
z3fOr(>HlF|KHCGq3jFX5k_5Y(x<ge#{7;o$(HKr9{^xR+YiDZ<Wr3+F0q!v+u`Z!i
z71kJ at 7SY5JOv*Z1`OkWN=3n at td-*O|Mdi#2)q$8`Bm;q9$R}?h!5eZo2LA84%UeWn
z>vd-UGFRWsHkw2PH%tOF(Zf;<Gby!xrUYJ-Q27`L(!+-tzv%*<bdAx%4$JLOxEV>b
zj3E=bLLpmot<vgGwjloq`;&lqRk8&wh0VX;Y?v(3r9E?_Uq({D8)i+TUrO5Fue~AE
z-|P3bw+r=m{k`>BLjC=FZ#~YFIJ7c18>V&D{pua5zuUL^*aVJMbGq1DpDW7x)elZh
zFMHeP3H9BB-g>+ORA$x4xJ@{P(XT#V)b*<`Nc|q1H8-0mOnpD0w|=NlzX#P at UnKhb
z`+b`z7V3ASdfVfDrfRE3#%=f-LS4Ulw`k~BkH-uBY_`-_AbKa-1pX4RpUuW!>Fb+d
z!<%*eZ8m|wY3paR3H&WuKbx(;odr7^{(`>0%_hqGsHZ_=h);Vm6L3Yq(UKlNv}~b`
zULVwiJGFcvJKBx_$X+d5 at UVxs*$Df~zaDzB7v^$DS_^T4srP2+SDSizl4sqL5U4(C
zKdSnyV}0N8b`SJa?gJV5&=N^QWz_dSAo6yo`qOes!@)>@W|z73*WP#8sPAz^%Pvjy
z9k&i{NI{?DWw@!&tmh=?HGHKq^LQDB^IBOy<G%{_h3E(Rt8?1a>2EY5q*uR>DO0hm
zfPI+~EL_d`^gW*}W4*=DjGlc6{q={?KYR%NUg*pEW-q>gzCfhUV_2#1X5)V7>p;uO
z{C at g}p0JhoH5c=tFVJ0Ladq#+C9Lmz9-}2G^(TEefVQ9{5raP8GHy*Zp36#oX8vnA
zA7z#1&76-bHU3q~Rc5*Bwt~85(y%Y=?>f@|t&GeEUWd4;foC>}WP2#&X~J|t{gR?D
z+3Ld_AsS531B95mO%h1P;t8L>y$g5OTH7MQWH8|I_HRMIn;6CurMSP_7sQSDZrm}%
zeOF(gy|uL)E*6RJy!0}~v$G{N3u}F~i{|meHhj0mS6gQ)>*g)NEJWU+IdT5{rL`yf
zPOh2LP)kqc=pIfgC;A0Pi-LbnQuyYbx~OJh{amDBR at 3BbO0;uTA@}~#$^L&PvbuT!
z{f49YyN!K*64FdIf8tU8fTVmBkde|iclvS4jNJe2?_QorlgDt>*PaNXp=7FdUhf~s
z^aXI!RQ_ru+Gzbn%Zw`d;Fs$0KqBUA!H-~Kj%ev9zD4HqH6{{fhV--{Bby+VC-0*P
zPoldu>2Cz%fdq4lieVNSjJF9-G?ol{YUb2WqNj}>JXiCy_;Fv at 6X=e at Su!4waf<ng
zonC?uY4i-39L!i-Bq=;xRS$m66LA`fNQ-gJJi!)o at U;Zst0d_m$By(+aq^-fkO5c6
z-x_X06>vwF0uPrab4I at i`n*po2E6dl9NyR1=<^2xabK$+ZRP1WhGd8`qNj71VmHQv
z9ZJH_#|Bj#{iLFlfr`hY&Gc**<;V<RW<J<WsVEohp13-l{2w#TjBrXzU0>9^Trs^|
zYu(7!x{Zc_*>lQY&EFN5S&b1_=X<5DMC2=ciwdVh-qbu_u_|BrVU^x%I~o$rWt6{K
z4=6rhTGKS1>aP6hwk>UQ0o<ia`Kxt<;?Ky)vSqfP=0o(YEmgi+Uns_(Fz}}8uj~}B
zKq`H^OUbEqh`H{lmhP-38&!W(Et(Obyp_LNuPEMY8mjV at ziR(krvDt%PJNF|@m7mJ
zW<ja)mH%4ks84WrOm1qOV=}$wZrxNpl&%92tACm4r?^cSnw*inxFEw{-L6+$s5&OY
zUuAo7hQC^ODaKuwUR!4UH=F+E^g)O+)7<1tdnGHr+Voe|RO>j!^UUlNDL*COk>Rh_
zdy2i(xt2}sf2G=q2xen^43JLETh;GltNx}m+LXWI$DyN_#^@NLP5r*`W0Rz;?4;D!
z|3xHF6_vkQXYTqB{wlvW5TUWB{MGzg{eF4A*|Fx~l&ZgK*Pq~PEnlr$_g2Uf#z{(r
zsy&L|MT*s5RGX$=$#tfvNck!L00~xqwGOT`{WJGB*;==MLZG}<`_($D;eXTr3;0r=
zra5AAQ~rCD!emvxVtOPssG%peF2n9HI<aHhBndNYxhX$W<i`M+I!e3S^j|YZSxU~d
zrN>{HI<hQSF71z32bL83*p5Gh|LJsM#&%*x<{6 at xX8LFL-;Ym~{(r|UA?v366<3 at 7
zRvU_M3rJ07zRFM8HypzMS<_!#Kb3u^KRpu6)RFDmrvJ&Q6T8eI(>7-MXV$ZFjkLe(
z5dE+6A<i&i$Gxr6e=$uiu+cD>4yfZsU4I<Vsj-h}Y8yw-TCrW9k+~{YrpntJ{rNxJ
NDJ{;=aL5qF{{n(ac~<}c

literal 0
HcmV?d00001

diff --git a/llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfscrpit b/llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfscrpit
new file mode 100644
index 0000000000000..7152093802751
--- /dev/null
+++ b/llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfscrpit
@@ -0,0 +1,2 @@
+PERF_RECORD_MMAP2 36922/36922: [0x5592aaa7f000(0x1000) @ 0x1000 08:10 26214013168 3588669473]: r-xp /pgo-accuracy-metrics.perfbin
+     5592aaa7f1fa 0x7f2ed752662d/0x7f2ed7526850/P/-/-/3  0x7f2ed7526602/0x7f2ed7526614/P/-/-/1  0x7f2ed7526b34/0x7f2ed75265f0/P/-/-/1  0x5592aaa7f080/0x7f2ed7526b30/P/-/-/1  0x5592aaa7f1ed/0x5592aaa7f080/P/-/-/1  0x5592aaa7f21e/0x5592aaa7f1e4/P/-/-/1  0x5592aaa7f213/0x5592aaa7f215/P/-/-/1  0x5592aaa7f1fd/0x5592aaa7f20a/P/-/-/15  0x7f2ed7526b3d/0x5592aaa7f1f2/P/-/-/1  0x7f2ed752665f/0x7f2ed7526b39/P/-/-/1  0x7f2ed7526639/0x7f2ed752664a/P/-/-/1  0x7f2ed752689d/0x7f2ed7526632/P/-/-/6  0x7f2ed752662d/0x7f2ed7526850/P/-/-/3  0x7f2ed7526602/0x7f2ed7526614/P/-/-/1  0x7f2ed7526b34/0x7f2ed75265f0/P/-/-/1  0x5592aaa7f080/0x7f2ed7526b30/P/-/-/1  0x5592aaa7f1ed/0x5592aaa7f080/P/-/-/1  0x5592aaa7f21e/0x5592aaa7f1e4/P/-/-/1  0x5592aaa7f213/0x5592aaa7f215/P/-/-/1  0x5592aaa7f1fd/0x5592aaa7f20a/P/-/-/15  0x7f2ed7526b3d/0x5592aaa7f1f2/P/-/-/1  0x7f2ed752665f/0x7f2ed7526b39/P/-/-/1  0x7f2ed7526639/0x7f2ed752664a/P/-/-/1  0x7f2ed752689d/0x7f2ed7526632/P/-/-/6  0x7f2ed752662d/0x7f2ed7526850/P/-/-/3  0x7f2ed7526602/0x7f2ed7526614/P/-/-/1  0x7f2ed7526b34/0x7f2ed75265f0/P/-/-/1  0x5592aaa7f080/0x7f2ed7526b30/P/-/-/1  0x5592aaa7f1ed/0x5592aaa7f080/P/-/-/1  0x5592aaa7f21e/0x5592aaa7f1e4/P/-/-/1  0x5592aaa7f213/0x5592aaa7f215/P/-/-/1  0x5592aaa7f1fd/0x5592aaa7f20a/P/-/-/14 
diff --git a/llvm/test/tools/llvm-profgen/pgo-accuracy-metrics.test b/llvm/test/tools/llvm-profgen/pgo-accuracy-metrics.test
new file mode 100644
index 0000000000000..b4fd875bd704e
--- /dev/null
+++ b/llvm/test/tools/llvm-profgen/pgo-accuracy-metrics.test
@@ -0,0 +1,24 @@
+; Test pgo accuracy metrics
+; RUN: llvm-profgen --perfscript=%S/Inputs/pgo-accuracy-metrics.perfscript --binary=%S/Inputs/pgo-accuracy-metrics.perfbin --output=%t --pgo-accuracy-metrics 2>&1 | FileCheck %s --check-prefix=CHECK-STATS
+
+; CHECK-STATS: UnknownBranches: 0
+; CHECK-STATS: MatchedBranches: 5
+; CHECK-STATS: DismatchedBranches: 4
+
+; Original code:
+; clang++ test.cpp  -g -fbasic-block-sections=labels -mllvm -pgo-analysis-map=br-prob
+
+#include <iostream>
+#include <random>
+int main() {
+    int a = 0;
+    int b = 0;
+    for (int i = 0; i < 100000000; ++i) {
+        if (rand() % 1) {
+            ++a;
+        } else {
+            ++b;
+        }
+    }
+    return 0;
+}
diff --git a/llvm/tools/llvm-profgen/CMakeLists.txt b/llvm/tools/llvm-profgen/CMakeLists.txt
index 354c63f409ffe..af8ea240f8a54 100644
--- a/llvm/tools/llvm-profgen/CMakeLists.txt
+++ b/llvm/tools/llvm-profgen/CMakeLists.txt
@@ -22,4 +22,5 @@ add_llvm_tool(llvm-profgen
   ProfiledBinary.cpp
   ProfileGenerator.cpp
   MissingFrameInferrer.cpp
+  PGOAccuracyMetrics.cpp
   )
diff --git a/llvm/tools/llvm-profgen/PGOAccuracyMetrics.cpp b/llvm/tools/llvm-profgen/PGOAccuracyMetrics.cpp
new file mode 100644
index 0000000000000..2c9394805e072
--- /dev/null
+++ b/llvm/tools/llvm-profgen/PGOAccuracyMetrics.cpp
@@ -0,0 +1,106 @@
+#include "PGOAccuracyMetrics.h"
+static cl::opt<double> BranchProbabilityThreshold(
+    "pgo-accuracy-metrics-branch-probability-threshold",
+    cl::desc("PGO accuracy metrics branch probability threshold"),
+    cl::init(20.0));
+
+namespace llvm {
+namespace sampleprof {
+
+void PGOAccuracyMetrics::init() {
+  for (auto &Function : BBAddrMaps) {
+    for (auto &Range : Function.getBBRanges()) {
+      uint64_t BaseAddress = Range.BaseAddress;
+      for (auto &BB : Range.BBEntries) {
+        uint64_t Address = BaseAddress + BB.Offset;
+        BBAddrToID[Address] =
+            std::make_pair(Function.getFunctionAddress(), BB.ID);
+      }
+    }
+  }
+
+  for (auto It : SampleCounters) {
+    const RangeSample &RangeCounter = It.second.RangeCounter;
+    const BranchSample &BranchCounter = It.second.BranchCounter;
+
+    for (auto Item : RangeCounter) {
+      auto From = BBAddrToID.lower_bound(Item.first.first);
+      auto End = BBAddrToID.upper_bound(Item.first.second);
+      if (From == End)
+        continue;
+      for (auto To = std::next(From); To != End; ++To) {
+        assert(From->second.first == To->second.first);
+        EdgeCounter[From->second.first]
+                   [std::make_pair(From->second.second, To->second.second)] +=
+            Item.second;
+        From = To;
+      }
+    }
+
+    for (auto Item : BranchCounter) {
+      auto Ptr = BBAddrToID.upper_bound(Item.first.first);
+      if (Ptr == BBAddrToID.begin())
+        continue;
+      auto From = std::prev(Ptr)->second;
+      auto To = BBAddrToID[Item.first.second];
+      assert(From.first == To.first);
+      EdgeCounter[From.first][{From.second, To.second}] += Item.second;
+    }
+  }
+}
+
+void PGOAccuracyMetrics::emitPGOAccuracyMetrics() {
+  assert(BBAddrMaps.size() == PGOAnalysisMaps.size());
+
+  for (uint64_t I = 0; I < BBAddrMaps.size(); ++I) {
+    auto &BBAddrMap = BBAddrMaps[I];
+    auto &PGOAnalysisMap = PGOAnalysisMaps[I];
+    assert(BBAddrMap.getNumBBEntries() == PGOAnalysisMap.BBEntries.size());
+    size_t Pos = 0;
+    for (auto &Range : BBAddrMap.getBBRanges()) {
+      for (auto &BB : Range.BBEntries) {
+        uint64_t Sum = 0;
+        for (auto Successor : PGOAnalysisMap.BBEntries[Pos].Successors) {
+          Sum += EdgeCounter[BBAddrMap.getFunctionAddress()]
+                            [std::make_pair(BB.ID, Successor.ID)];
+        }
+
+        for (auto Successor : PGOAnalysisMap.BBEntries[Pos].Successors) {
+          if (Successor.Prob.isUnknown()) {
+            ++UnknownBranches;
+            continue;
+          }
+          double SampleBranchProb =
+              rint((Sum == 0
+                        ? (double)1 /
+                              PGOAnalysisMap.BBEntries[Pos].Successors.size()
+                        : (double)EdgeCounter[BBAddrMap.getFunctionAddress()]
+                                             [std::make_pair(BB.ID,
+                                                             Successor.ID)] /
+                              Sum) *
+                   100.0 * 100.0) /
+              100.0;
+          double RecordBranchProb =
+              rint(((double)Successor.Prob.getNumerator() /
+                    Successor.Prob.getDenominator()) *
+                   100.0 * 100.0) /
+              100.0;
+          if (abs(SampleBranchProb - RecordBranchProb) <
+              BranchProbabilityThreshold) {
+            ++MatchedBranches;
+          } else {
+            ++DismatchedBranches;
+          }
+        }
+        ++Pos;
+      }
+    }
+  }
+
+  llvm::outs() << "UnknownBranches: " << UnknownBranches << "\n";
+  llvm::outs() << "MatchedBranches: " << MatchedBranches << "\n";
+  llvm::outs() << "DismatchedBranches: " << DismatchedBranches << "\n";
+}
+
+} // namespace sampleprof
+} // namespace llvm
diff --git a/llvm/tools/llvm-profgen/PGOAccuracyMetrics.h b/llvm/tools/llvm-profgen/PGOAccuracyMetrics.h
new file mode 100644
index 0000000000000..5363713abbff8
--- /dev/null
+++ b/llvm/tools/llvm-profgen/PGOAccuracyMetrics.h
@@ -0,0 +1,45 @@
+//===-- PGOAccuracyMetrics.h ------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_LLVM_PROFGEN_PGOACCURACYMETRICS_H
+#define LLVM_TOOLS_LLVM_PROFGEN_PGOACCURACYMETRICS_H
+
+#include "PerfReader.h"
+#include "llvm/Object/ELFTypes.h"
+
+namespace llvm {
+namespace sampleprof {
+class PGOAccuracyMetrics {
+public:
+  PGOAccuracyMetrics(const ContextSampleCounterMap &CSCM,
+                     const std::vector<BBAddrMap> &BBAM,
+                     const std::vector<PGOAnalysisMap> &PGOAM)
+      : SampleCounters(CSCM), BBAddrMaps(BBAM), PGOAnalysisMaps(PGOAM) {
+    init();
+  }
+  void init();
+  void emitPGOAccuracyMetrics();
+
+private:
+  const ContextSampleCounterMap &SampleCounters;
+  const std::vector<BBAddrMap> &BBAddrMaps;
+  const std::vector<PGOAnalysisMap> &PGOAnalysisMaps;
+
+  // key is bb's address, value is function's address and bb's unique id;
+  std::map<uint64_t, std::pair<uint64_t, uint32_t>> BBAddrToID;
+  std::unordered_map<uint64_t,
+                     std::map<std::pair<uint32_t, uint32_t>, uint64_t>>
+      EdgeCounter;
+
+  uint64_t UnknownBranches = 0;
+  uint64_t MatchedBranches = 0;
+  uint64_t DismatchedBranches = 0;
+};
+} // namespace sampleprof
+} // namespace llvm
+
+#endif
\ No newline at end of file
diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.cpp b/llvm/tools/llvm-profgen/ProfiledBinary.cpp
index 1baf35820f97f..d0695deae86e5 100644
--- a/llvm/tools/llvm-profgen/ProfiledBinary.cpp
+++ b/llvm/tools/llvm-profgen/ProfiledBinary.cpp
@@ -256,6 +256,14 @@ void ProfiledBinary::load() {
 
   warnNoFuncEntry();
 
+  if (auto *ELFObj = dyn_cast<ELFObjectFileBase>(Obj)) {
+    auto BBAddrMapsOrErr =
+        ELFObj->readBBAddrMap(std::nullopt, &PGOAnalysisMaps);
+    if (!BBAddrMapsOrErr.takeError()) {
+      BBAddrMaps = *BBAddrMapsOrErr;
+    }
+  }
+
   // TODO: decode other sections.
 }
 
diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.h b/llvm/tools/llvm-profgen/ProfiledBinary.h
index 5d2088ad7691c..08c6d065ebca4 100644
--- a/llvm/tools/llvm-profgen/ProfiledBinary.h
+++ b/llvm/tools/llvm-profgen/ProfiledBinary.h
@@ -299,6 +299,10 @@ class ProfiledBinary {
 
   bool IsCOFF = false;
 
+  std::vector<PGOAnalysisMap> PGOAnalysisMaps;
+
+  std::vector<BBAddrMap> BBAddrMaps;
+
   void setPreferredTextSegmentAddresses(const ObjectFile *O);
 
   template <class ELFT>
@@ -600,6 +604,12 @@ class ProfiledBinary {
   bool getMissingMMapWarned() { return MissingMMapWarned; }
 
   void setMissingMMapWarned(bool Value) { MissingMMapWarned = Value; }
+
+  const std::vector<BBAddrMap> &getBBAddrMaps() const { return BBAddrMaps; }
+
+  const std::vector<PGOAnalysisMap> &getPGOAnalysisMaps() const {
+    return PGOAnalysisMaps;
+  }
 };
 
 } // end namespace sampleprof
diff --git a/llvm/tools/llvm-profgen/llvm-profgen.cpp b/llvm/tools/llvm-profgen/llvm-profgen.cpp
index 3b974e25103ad..6a904d8acbe83 100644
--- a/llvm/tools/llvm-profgen/llvm-profgen.cpp
+++ b/llvm/tools/llvm-profgen/llvm-profgen.cpp
@@ -11,6 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "ErrorHandling.h"
+#include "PGOAccuracyMetrics.h"
 #include "PerfReader.h"
 #include "ProfileGenerator.h"
 #include "ProfiledBinary.h"
@@ -67,6 +68,11 @@ static cl::opt<std::string> DebugBinPath(
              "from it instead of the executable binary."),
     cl::cat(ProfGenCategory));
 
+static cl::opt<bool>
+    EmitPGOAccuracyMetrics("pgo-accuracy-metrics", cl::init(false),
+                           cl::desc("Print PGO accuracy metrics"),
+                           cl::cat(ProfGenCategory));
+
 extern cl::opt<bool> ShowDisassemblyOnly;
 extern cl::opt<bool> ShowSourceLocations;
 extern cl::opt<bool> SkipSymbolization;
@@ -179,6 +185,13 @@ int main(int argc, const char *argv[]) {
     // Parse perf events and samples
     Reader->parsePerfTraces();
 
+    if (EmitPGOAccuracyMetrics) {
+      PGOAccuracyMetrics PGOAM(Reader->getSampleCounters(),
+                               Binary->getBBAddrMaps(),
+                               Binary->getPGOAnalysisMaps());
+      PGOAM.emitPGOAccuracyMetrics();
+    }
+
     if (SkipSymbolization)
       return EXIT_SUCCESS;
 

>From f3979e778fd86d7a9fdbf83f5d63470ef280fcd6 Mon Sep 17 00:00:00 2001
From: lifengxiang <lifengxiang at kuaishou.com>
Date: Mon, 3 Jun 2024 11:38:30 +0800
Subject: [PATCH 2/2] fix file name

---
 ...ccuracy-metrics.perfscrpit => pgo-accuracy-metrics.perfscript} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename llvm/test/tools/llvm-profgen/Inputs/{pgo-accuracy-metrics.perfscrpit => pgo-accuracy-metrics.perfscript} (100%)

diff --git a/llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfscrpit b/llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfscript
similarity index 100%
rename from llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfscrpit
rename to llvm/test/tools/llvm-profgen/Inputs/pgo-accuracy-metrics.perfscript



More information about the llvm-commits mailing list