[PATCH] D16947: [PGO] assignment operator does not get profile data

David Li via llvm-commits llvm-commits at lists.llvm.org
Sat Feb 6 11:57:22 PST 2016


davidxl created this revision.
davidxl added a reviewer: vsk.
davidxl added subscribers: llvm-commits, cfe-commits.

For compiler generated assignment operator that is not trivial (calling base class operator=()), Clang FE assign region counters to the function body but does not emit profile counter increment for the function entry. This leads to many problems:

1) the operator body does not have profile data generated leading to warning in profile-use
2) the size of the function body may be large and lack of profile data may lead to wrong inlining decisions 
3) when FE assign region counters to the function, it also emit coverage mapping data for the function -- but it has no coverage data which is confusing (currently the llvm-cov tool will report malformed format (as the name of the operator is not put into the right name section).

http://reviews.llvm.org/D16947

Files:
  lib/CodeGen/CGClass.cpp
  test/Profile/def-assignop.cpp

Index: test/Profile/def-assignop.cpp
===================================================================
--- test/Profile/def-assignop.cpp
+++ test/Profile/def-assignop.cpp
@@ -0,0 +1,34 @@
+// RUN: %clang_cc1 -x c++ %s -triple x86_64-unknown-linux-gnu -main-file-name def-assignop.cpp -o - -emit-llvm -fprofile-instrument=clang | FileCheck --check-prefix=PGOGEN %s
+
+
+struct B {
+  int B;
+  void *operator=(const struct B &b2) {
+    if (b2.B == 0) {
+      B = b2.B + 1;
+    } else
+      B = b2.B;
+    return this;
+  }
+};
+
+struct A : public B {
+  A &operator=(const A &) = default;
+// PGOGEN: define {{.*}}@_ZN1AaSERKS_(
+// PGOGEN: %pgocount = load {{.*}} @__profc__ZN1AaSERKS_
+// PGOGEN: {{.*}}add{{.*}}%pgocount, 1
+// PGOGEN: store{{.*}}@__profc__ZN1AaSERKS_
+  int I;
+  int J;
+  int getI() { return I; }
+};
+
+A aa;
+int g;
+int main() {
+  A aa2;
+  aa2 = aa;
+
+  g = aa2.getI();
+  return 0;
+}
Index: lib/CodeGen/CGClass.cpp
===================================================================
--- lib/CodeGen/CGClass.cpp
+++ lib/CodeGen/CGClass.cpp
@@ -1608,6 +1608,7 @@
 
   LexicalScope Scope(*this, RootCS->getSourceRange());
 
+  incrementProfileCounter(RootCS);
   AssignmentMemcpyizer AM(*this, AssignOp, Args);
   for (auto *I : RootCS->body())
     AM.emitAssignment(I);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16947.47089.patch
Type: text/x-patch
Size: 1306 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160206/3193b01d/attachment.bin>


More information about the llvm-commits mailing list