[PATCH] D98389: [IndirectCallPromotion] Don't strip ".__uniq." suffix when it strips ".llvm." suffix.

Wei Mi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 10 20:47:15 PST 2021


wmi created this revision.
wmi added reviewers: davidxl, tmsriram, wenlei, hoy.
Herald added a subscriber: hiraditya.
wmi requested review of this revision.
Herald added a project: LLVM.

Currently IndirectCallPromotion simply strip everything after the first "." in LTO mode, in order to match the symbol name and the name with ".llvm." suffix in the value profile. However, if -funique-internal-linkage-names and thinlto are both enabled, the name may have both ".__uniq." suffix and ".llvm." suffix (".__uniq." will only exist before ".llvm."), and the current mechanism will strip them both, which will block indirect call promotion in both InstrPGO and SamplePGO modes. The patch fixes the problem.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D98389

Files:
  llvm/lib/ProfileData/InstrProf.cpp
  llvm/test/Transforms/PGOProfile/indirect_call_promotion_unique.ll


Index: llvm/test/Transforms/PGOProfile/indirect_call_promotion_unique.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/PGOProfile/indirect_call_promotion_unique.ll
@@ -0,0 +1,76 @@
+; RUN: opt < %s -passes='pgo-icall-prom,thinlto<O2>' -S | FileCheck %s
+
+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"
+
+ at foo = common global i32 ()* null, align 8
+
+; The names on the IR and in the profile are both "func1".
+define i32 @func1() {
+entry:
+  ret i32 1
+}
+
+define i32 @bar1() {
+entry:
+  %tmp1 = load i32 ()*, i32 ()** @foo, align 8
+; CHECK: icmp eq i32 ()* %tmp1, @func1
+  %call = call i32 %tmp1(), !prof !1
+  ret i32 %call
+}
+
+; The name on the IR has ".llvm." suffix: "func2.llvm.10895321227755557127".
+; The name in the profile has no ".llvm." suffix: "func2".
+define i32 @func2.llvm.10895321227755557127() {
+entry:
+  ret i32 1
+}
+
+define i32 @bar2() {
+entry:
+  %tmp2 = load i32 ()*, i32 ()** @foo, align 8
+; CHECK: icmp eq i32 ()* %tmp2, @func2.llvm.10895321227755557127
+  %call = call i32 %tmp2(), !prof !2
+  ret i32 %call
+}
+
+; The names on the IR and in the profile are both
+; "func3.__uniq.258901567653530696343884446915951489119".
+define i32 @func3.__uniq.258901567653530696343884446915951489119() {
+entry:
+  ret i32 2
+}
+
+define i32 @bar3() {
+entry:
+  %tmp3 = load i32 ()*, i32 ()** @foo, align 8
+; CHECK: icmp eq i32 ()* %tmp3, @func3.__uniq.258901567653530696343884446915951489119
+  %call = call i32 %tmp3(), !prof !3
+  ret i32 %call
+}
+
+; The name on the IR has ".__uniq." and ".llvm." suffix:
+; "func4.__uniq.140291095734751150107370763113257199296.llvm.10650195578168450516".
+; The name in the profile has ".__uniq." but no ".llvm." suffix:
+; "func4.__uniq.140291095734751150107370763113257199296".
+define i32 @func4.__uniq.140291095734751150107370763113257199296.llvm.10650195578168450516() {
+entry:
+  ret i32 3
+}
+
+define i32 @bar4() {
+entry:
+  %tmp4 = load i32 ()*, i32 ()** @foo, align 8
+; CHECK: icmp eq i32 ()* %tmp4, @func4.__uniq.140291095734751150107370763113257199296.llvm.10650195578168450516
+  %call = call i32 %tmp4(), !prof !4
+  ret i32 %call
+}
+
+; GUID of "func1" is 15901201718346545210.
+; GUID of "func2" is 14069196320850861797.
+; GUID of "func3.__uniq.258901567653530696343884446915951489119" is 8271224222042874235.
+; GUID of "func4.__uniq.140291095734751150107370763113257199296" is 1491826207425861106.
+!1 = !{!"VP", i32 0, i64 1600, i64 -2545542355363006406, i64 1060}
+!2 = !{!"VP", i32 0, i64 1600, i64 -4377547752858689819, i64 1060}
+!3 = !{!"VP", i32 0, i64 1600, i64 8271224222042874235, i64 1060}
+!4 = !{!"VP", i32 0, i64 1600, i64 1491826207425861106, i64 1060}
Index: llvm/lib/ProfileData/InstrProf.cpp
===================================================================
--- llvm/lib/ProfileData/InstrProf.cpp
+++ llvm/lib/ProfileData/InstrProf.cpp
@@ -356,7 +356,7 @@
     // suffix added to the function name. We need to add the stripped function
     // name to the symbol table so that we can find a match from profile.
     if (InLTO) {
-      auto pos = PGOFuncName.find('.');
+      auto pos = PGOFuncName.find(".llvm.");
       if (pos != std::string::npos) {
         const std::string &OtherFuncName = PGOFuncName.substr(0, pos);
         if (Error E = addFuncName(OtherFuncName))


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98389.329835.patch
Type: text/x-patch
Size: 3446 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210311/d1b2f6b4/attachment.bin>


More information about the llvm-commits mailing list