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);


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);
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to