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