[PATCH] D95495: Emit metadata if there is a profile hash mismatch

Sriraman Tallam via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 26 21:40:52 PST 2021


tmsriram updated this revision to Diff 319467.
tmsriram added a comment.

Update patch.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D95495/new/

https://reviews.llvm.org/D95495

Files:
  llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
  llvm/test/Transforms/PGOProfile/Inputs/hash_mismatch_metadata.proftext
  llvm/test/Transforms/PGOProfile/hash_mismatch_metadata.ll


Index: llvm/test/Transforms/PGOProfile/hash_mismatch_metadata.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/PGOProfile/hash_mismatch_metadata.ll
@@ -0,0 +1,18 @@
+; RUN: llvm-profdata merge %S/Inputs/hash_mismatch_metadata.proftext -o %t.profdata
+; RUN: opt < %s -mtriple=x86_64-linux-gnu -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s
+
+define void @foo() !annotation !1 {
+entry:
+   ret void
+}
+
+define void @bar() !annotation !2 {
+entry:
+   ret void
+}
+
+!1 = !{!"fake_metadata"}
+!2 = !{!"instr_prof_hash_mismatch"}
+
+; CHECK-DAG: !{{[0-9]+}} = !{!"fake_metadata", !"instr_prof_hash_mismatch"}
+; CHECK-DAG: !{{[0-9]+}} = !{!"instr_prof_hash_mismatch"}
Index: llvm/test/Transforms/PGOProfile/Inputs/hash_mismatch_metadata.proftext
===================================================================
--- /dev/null
+++ llvm/test/Transforms/PGOProfile/Inputs/hash_mismatch_metadata.proftext
@@ -0,0 +1,17 @@
+:ir
+:entry_first
+foo
+# Func Hash:
+11111
+# Num Counters:
+1
+# Counter Values:
+100
+
+bar
+# Func Hash:
+11111
+# Num Counters:
+1
+# Counter Values:
+100
Index: llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
===================================================================
--- llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
+++ llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
@@ -1245,6 +1245,27 @@
   llvm_unreachable("Cannot find the unknown count edge");
 }
 
+// Emit function metadata indicating PGO profile mismatch.
+static void annotateFunctionWithHashMismatch(Function &F,
+                                             LLVMContext &ctx) {
+  const char MetadataName[] = "instr_prof_hash_mismatch";
+  SmallVector<Metadata *, 2> Names;
+  // If this metadata already exists, ignore.
+  if (MDTuple *Tuple =
+      cast<MDTuple>(F.getMetadata(LLVMContext::MD_annotation))) {
+    for (auto &N : Tuple->operands()) {
+      if (cast<MDString>(N.get())->getString() ==  MetadataName)
+        return;
+      Names.push_back(N.get());
+    }
+  }
+
+  MDBuilder MDB(ctx);
+  Names.push_back(MDB.createString(MetadataName));
+  MDNode *MD = MDTuple::get(ctx, Names);
+  F.setMetadata(LLVMContext::MD_annotation, MD);
+}
+
 // Read the profile from ProfileFileName and assign the value to the
 // instrumented BB and the edges. This function also updates ProgramMaxCount.
 // Return true if the profile are successfully read, and false on errors.
@@ -1272,6 +1293,8 @@
              (F.hasComdat() ||
               F.getLinkage() == GlobalValue::AvailableExternallyLinkage));
         LLVM_DEBUG(dbgs() << "hash mismatch (skip=" << SkipWarning << ")");
+        // Emit function metadata indicating PGO profile mismatch.
+        annotateFunctionWithHashMismatch(F, M->getContext());
       }
 
       LLVM_DEBUG(dbgs() << " IsCS=" << IsCS << "\n");


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95495.319467.patch
Type: text/x-patch
Size: 2908 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210127/cb4ce553/attachment.bin>


More information about the llvm-commits mailing list