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
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits