[llvm] [ctxprof] Move test serialization to yaml (PR #122545)
Mircea Trofin via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 10 15:44:53 PST 2025
https://github.com/mtrofin updated https://github.com/llvm/llvm-project/pull/122545
>From 7601a5ec86aaf7e228afd6f0a81a08ad2fc20454 Mon Sep 17 00:00:00 2001
From: Mircea Trofin <mtrofin at google.com>
Date: Fri, 10 Jan 2025 14:53:22 -0800
Subject: [PATCH] [ctxprof] Move test serialization to yaml
---
.../llvm/ProfileData/PGOCtxProfWriter.h | 10 ++-
llvm/lib/ProfileData/PGOCtxProfWriter.cpp | 57 +++++++---------
.../CtxProfAnalysis/flatten-and-annotate.ll | 32 +++------
.../CtxProfAnalysis/flatten-check-path.ll | 21 +++---
.../Analysis/CtxProfAnalysis/flatten-icp.ll | 25 ++++---
.../CtxProfAnalysis/flatten-zero-path.ll | 7 +-
.../Analysis/CtxProfAnalysis/full-cycle.ll | 66 +++++--------------
.../Analysis/CtxProfAnalysis/handle-select.ll | 13 +++-
llvm/test/Analysis/CtxProfAnalysis/inline.ll | 33 +++++-----
.../CtxProfAnalysis/load-unapplicable.ll | 44 ++++---------
llvm/test/Analysis/CtxProfAnalysis/load.ll | 44 ++++---------
llvm/test/ThinLTO/X86/ctxprof.ll | 4 +-
.../transform-to-local.ll | 4 +-
.../tools/llvm-ctxprof-util/Inputs/bad.json | 1 -
.../tools/llvm-ctxprof-util/Inputs/bad.yaml | 1 +
.../tools/llvm-ctxprof-util/Inputs/empty.json | 1 -
.../tools/llvm-ctxprof-util/Inputs/empty.yaml | 0
.../Inputs/invalid-bad-subctx.json | 8 ---
.../Inputs/invalid-bad-subctx.yaml | 4 ++
.../Inputs/invalid-no-counters.json | 5 --
.../Inputs/invalid-no-counters.yaml | 1 +
.../Inputs/invalid-no-ctx.json | 1 -
.../Inputs/invalid-no-ctx.yaml | 1 +
.../Inputs/invalid-no-vector.json | 1 -
.../Inputs/invalid-no-vector.yaml | 1 +
.../tools/llvm-ctxprof-util/Inputs/valid.json | 47 -------------
.../tools/llvm-ctxprof-util/Inputs/valid.yaml | 13 ++++
.../llvm-ctxprof-util-negative.test | 36 +++++-----
.../llvm-ctxprof-util/llvm-ctxprof-util.test | 8 +--
.../llvm-ctxprof-util/llvm-ctxprof-util.cpp | 14 ++--
.../Utils/CallPromotionUtilsTest.cpp | 2 +-
31 files changed, 195 insertions(+), 310 deletions(-)
delete mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/bad.json
create mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/bad.yaml
delete mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/empty.json
create mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/empty.yaml
delete mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-bad-subctx.json
create mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-bad-subctx.yaml
delete mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-counters.json
create mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-counters.yaml
delete mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-ctx.json
create mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-ctx.yaml
delete mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-vector.json
create mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-vector.yaml
delete mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/valid.json
create mode 100644 llvm/test/tools/llvm-ctxprof-util/Inputs/valid.yaml
diff --git a/llvm/include/llvm/ProfileData/PGOCtxProfWriter.h b/llvm/include/llvm/ProfileData/PGOCtxProfWriter.h
index b370fdd9ba5a1c..f6158609c12855 100644
--- a/llvm/include/llvm/ProfileData/PGOCtxProfWriter.h
+++ b/llvm/include/llvm/ProfileData/PGOCtxProfWriter.h
@@ -81,6 +81,14 @@ class PGOCtxProfileWriter final {
static constexpr StringRef ContainerMagic = "CTXP";
};
-Error createCtxProfFromJSON(StringRef Profile, raw_ostream &Out);
+/// Representation of the context node suitable for yaml / json serialization /
+/// deserialization.
+struct SerializableCtxRepresentation {
+ ctx_profile::GUID Guid = 0;
+ std::vector<uint64_t> Counters;
+ std::vector<std::vector<SerializableCtxRepresentation>> Callsites;
+};
+
+Error createCtxProfFromYAML(StringRef Profile, raw_ostream &Out);
} // namespace llvm
#endif
diff --git a/llvm/lib/ProfileData/PGOCtxProfWriter.cpp b/llvm/lib/ProfileData/PGOCtxProfWriter.cpp
index 4c0f3d459988b1..d22aadd6bd7eb0 100644
--- a/llvm/lib/ProfileData/PGOCtxProfWriter.cpp
+++ b/llvm/lib/ProfileData/PGOCtxProfWriter.cpp
@@ -13,7 +13,11 @@
#include "llvm/ProfileData/PGOCtxProfWriter.h"
#include "llvm/Bitstream/BitCodeEnums.h"
#include "llvm/ProfileData/CtxInstrContextNode.h"
+#include "llvm/Support/Error.h"
#include "llvm/Support/JSON.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/YAMLTraits.h"
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
using namespace llvm::ctx_profile;
@@ -85,22 +89,15 @@ void PGOCtxProfileWriter::write(const ContextNode &RootNode) {
}
namespace {
-// A structural representation of the JSON input.
-struct DeserializableCtx {
- ctx_profile::GUID Guid = 0;
- std::vector<uint64_t> Counters;
- std::vector<std::vector<DeserializableCtx>> Callsites;
-};
-
ctx_profile::ContextNode *
createNode(std::vector<std::unique_ptr<char[]>> &Nodes,
- const std::vector<DeserializableCtx> &DCList);
+ const std::vector<SerializableCtxRepresentation> &DCList);
// Convert a DeserializableCtx into a ContextNode, potentially linking it to
// its sibling (e.g. callee at same callsite) "Next".
ctx_profile::ContextNode *
createNode(std::vector<std::unique_ptr<char[]>> &Nodes,
- const DeserializableCtx &DC,
+ const SerializableCtxRepresentation &DC,
ctx_profile::ContextNode *Next = nullptr) {
auto AllocSize = ctx_profile::ContextNode::getAllocSize(DC.Counters.size(),
DC.Callsites.size());
@@ -115,10 +112,11 @@ createNode(std::vector<std::unique_ptr<char[]>> &Nodes,
return Ret;
}
-// Convert a list of DeserializableCtx into a linked list of ContextNodes.
+// Convert a list of SerializableCtxRepresentation into a linked list of
+// ContextNodes.
ctx_profile::ContextNode *
createNode(std::vector<std::unique_ptr<char[]>> &Nodes,
- const std::vector<DeserializableCtx> &DCList) {
+ const std::vector<SerializableCtxRepresentation> &DCList) {
ctx_profile::ContextNode *List = nullptr;
for (const auto &DC : DCList)
List = createNode(Nodes, DC, List);
@@ -126,27 +124,22 @@ createNode(std::vector<std::unique_ptr<char[]>> &Nodes,
}
} // namespace
-namespace llvm {
-namespace json {
-bool fromJSON(const Value &E, DeserializableCtx &R, Path P) {
- json::ObjectMapper Mapper(E, P);
- return Mapper && Mapper.map("Guid", R.Guid) &&
- Mapper.map("Counters", R.Counters) &&
- Mapper.mapOptional("Callsites", R.Callsites);
-}
-} // namespace json
-} // namespace llvm
-
-Error llvm::createCtxProfFromJSON(StringRef Profile, raw_ostream &Out) {
- auto P = json::parse(Profile);
- if (!P)
- return P.takeError();
+LLVM_YAML_IS_SEQUENCE_VECTOR(SerializableCtxRepresentation)
+LLVM_YAML_IS_SEQUENCE_VECTOR(std::vector<SerializableCtxRepresentation>)
+template <> struct yaml::MappingTraits<SerializableCtxRepresentation> {
+ static void mapping(yaml::IO &IO, SerializableCtxRepresentation &SCR) {
+ IO.mapRequired("Guid", SCR.Guid);
+ IO.mapRequired("Counters", SCR.Counters);
+ IO.mapOptional("Callsites", SCR.Callsites);
+ }
+};
- json::Path::Root R("");
- std::vector<DeserializableCtx> DCList;
- if (!fromJSON(*P, DCList, R))
- return R.getError();
- // Nodes provides memory backing for the ContextualNodes.
+Error llvm::createCtxProfFromYAML(StringRef Profile, raw_ostream &Out) {
+ yaml::Input In(Profile);
+ std::vector<SerializableCtxRepresentation> DCList;
+ In >> DCList;
+ if (In.error())
+ return createStringError(In.error(), "incorrect yaml content");
std::vector<std::unique_ptr<char[]>> Nodes;
std::error_code EC;
if (EC)
@@ -162,4 +155,4 @@ Error llvm::createCtxProfFromJSON(StringRef Profile, raw_ostream &Out) {
if (EC)
return createStringError(EC, "failed to write output");
return Error::success();
-}
\ No newline at end of file
+}
diff --git a/llvm/test/Analysis/CtxProfAnalysis/flatten-and-annotate.ll b/llvm/test/Analysis/CtxProfAnalysis/flatten-and-annotate.ll
index b7950b26a3ef27..9eedade925b015 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/flatten-and-annotate.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/flatten-and-annotate.ll
@@ -2,7 +2,7 @@
;
; RUN: rm -rf %t
; RUN: split-file %s %t
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile.yaml --output=%t/profile.ctxprofdata
; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' -use-ctx-profile=%t/profile.ctxprofdata \
; RUN: %t/example.ll -S -o %t/prelink.ll
; RUN: FileCheck --input-file %t/prelink.ll %s --check-prefix=PRELINK
@@ -58,27 +58,15 @@
; CHECK: ![[AN_ENTRYPOINT_EP]] = !{!"function_entry_count", i64 100}
; CHECK: ![[AN_ENTRYPOINT_BW]] = !{!"branch_weights", i32 40, i32 60}
-;--- profile.json
-[
- {
- "Guid": 4909520559318251808,
- "Counters": [100, 40],
- "Callsites": [
- [
- {
- "Guid": 11872291593386833696,
- "Counters": [ 100, 5 ]
- }
- ],
- [
- {
- "Guid": 11872291593386833696,
- "Counters": [ 40, 10 ]
- }
- ]
- ]
- }
-]
+;--- profile.yaml
+- Guid: 4909520559318251808
+ Counters: [100, 40]
+ Callsites: -
+ - Guid: 11872291593386833696
+ Counters: [ 100, 5 ]
+ -
+ - Guid: 11872291593386833696
+ Counters: [ 40, 10 ]
;--- example.ll
declare void @bar()
diff --git a/llvm/test/Analysis/CtxProfAnalysis/flatten-check-path.ll b/llvm/test/Analysis/CtxProfAnalysis/flatten-check-path.ll
index 42eaa67a983087..c84a72f60a3d02 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/flatten-check-path.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/flatten-check-path.ll
@@ -3,9 +3,9 @@
; already visited blocks count as taken (i.e. the flow continues through them).
;
; RUN: split-file %s %t
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile_ok.json --output=%t/profile_ok.ctxprofdata
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile_pump.json --output=%t/profile_pump.ctxprofdata
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile_unreachable.json --output=%t/profile_unreachable.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile_ok.yaml --output=%t/profile_ok.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile_pump.yaml --output=%t/profile_pump.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile_unreachable.yaml --output=%t/profile_unreachable.ctxprofdata
;
; RUN: opt -passes=ctx-prof-flatten %t/example_ok.ll -use-ctx-profile=%t/profile_ok.ctxprofdata -S -o - | FileCheck %s
; RUN: not --crash opt -passes=ctx-prof-flatten %t/message_pump.ll -use-ctx-profile=%t/profile_pump.ctxprofdata -S 2>&1 | FileCheck %s --check-prefix=ASSERTION
@@ -38,8 +38,9 @@ exit:
}
!0 = !{i64 1234}
-;--- profile_ok.json
-[{"Guid":1234, "Counters":[2, 2, 1, 2]}]
+;--- profile_ok.yaml
+- Guid: 1234
+ Counters: [2, 2, 1, 2]
;--- message_pump.ll
; This is a message pump: the loop never exits. This should result in an
@@ -59,8 +60,9 @@ exit:
}
!0 = !{i64 1234}
-;--- profile_pump.json
-[{"Guid":1234, "Counters":[2, 10, 0]}]
+;--- profile_pump.yaml
+- Guid: 1234
+ Counters: [2, 10, 0]
;--- unreachable.ll
; An unreachable block is reached, that's an error
@@ -81,5 +83,6 @@ exit:
}
!0 = !{i64 1234}
-;--- profile_unreachable.json
-[{"Guid":1234, "Counters":[2, 1, 1, 2]}]
\ No newline at end of file
+;--- profile_unreachable.yaml
+- Guid: 1234
+ Counters: [2, 1, 1, 2]
\ No newline at end of file
diff --git a/llvm/test/Analysis/CtxProfAnalysis/flatten-icp.ll b/llvm/test/Analysis/CtxProfAnalysis/flatten-icp.ll
index fbffe780f0afaa..46c17377710d08 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/flatten-icp.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/flatten-icp.ll
@@ -1,5 +1,5 @@
; RUN: split-file %s %t
-; RUN: llvm-ctxprof-util fromJSON --input %t/profile.json --output %t/profile.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input %t/profile.yaml --output %t/profile.ctxprofdata
;
; In the given profile, in one of the contexts the indirect call is taken, the
; target we're trying to ICP - GUID:2000 - doesn't appear at all. That should
@@ -45,11 +45,18 @@ attributes #1 = { noinline }
!1 = !{i64 3000}
!2 = !{i64 4000}
-;--- profile.json
-[ {
- "Guid": 4000, "Counters":[10], "Callsites": [
- [{"Guid":3000, "Counters":[10], "Callsites":[[{"Guid":1000, "Counters":[10]}]]}],
- [{"Guid":3000, "Counters":[10], "Callsites":[[{"Guid":9000, "Counters":[10]}]]}]
- ]
-}
-]
+;--- profile.yaml
+- Guid: 4000
+ Counters: [10]
+ Callsites: -
+ - Guid: 3000
+ Counters: [10]
+ Callsites: -
+ - Guid: 1000
+ Counters: [10]
+ -
+ - Guid: 3000
+ Counters: [10]
+ Callsites: -
+ - Guid: 9000
+ Counters: [10]
diff --git a/llvm/test/Analysis/CtxProfAnalysis/flatten-zero-path.ll b/llvm/test/Analysis/CtxProfAnalysis/flatten-zero-path.ll
index 7eea1c36afc37a..251ece655196a4 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/flatten-zero-path.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/flatten-zero-path.ll
@@ -1,6 +1,6 @@
; Check that flattened profile lowering handles cold subgraphs that end in "unreachable"
; RUN: split-file %s %t
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile.yaml --output=%t/profile.ctxprofdata
; RUN: opt -passes=ctx-prof-flatten %t/example.ll -use-ctx-profile=%t/profile.ctxprofdata -S -o - | FileCheck %s
; CHECK-LABEL: entry:
@@ -51,5 +51,6 @@ exit:
!0 = !{i64 1234}
-;--- profile.json
-[{"Guid":1234, "Counters":[6,0,0,0]}]
+;--- profile.yaml
+- Guid: 1234
+ Counters: [6,0,0,0]
diff --git a/llvm/test/Analysis/CtxProfAnalysis/full-cycle.ll b/llvm/test/Analysis/CtxProfAnalysis/full-cycle.ll
index 905e7eea9f49ee..5a8a2f4cad84b7 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/full-cycle.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/full-cycle.ll
@@ -8,7 +8,7 @@
; different counter values, and we expect resulting flat profile to be the sum
; (of values at the same index).
;
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile.yaml --output=%t/profile.ctxprofdata
;
; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' -use-ctx-profile=%t/profile.ctxprofdata -o %t/m1.bc %t/m1.ll
; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' -use-ctx-profile=%t/profile.ctxprofdata -o %t/m2.bc %t/m2.ll
@@ -65,55 +65,21 @@ define void @entrypoint() {
call void @f3()
ret void
}
-;--- profile.json
-[
- {
- "Callsites": [
- [
- {
- "Callsites": [
- [
- {
- "Counters": [
- 10,
- 7
- ],
- "Guid": 3087265239403591524
- }
- ]
- ],
- "Counters": [
- 7
- ],
- "Guid": 2072045998141807037
- }
- ],
- [
- {
- "Callsites": [
- [
- {
- "Counters": [
- 1,
- 2
- ],
- "Guid": 3087265239403591524
- }
- ]
- ],
- "Counters": [
- 2
- ],
- "Guid": 4197650231481825559
- }
- ]
- ],
- "Counters": [
- 1
- ],
- "Guid": 10507721908651011566
- }
-]
+;--- profile.yaml
+- Guid: 10507721908651011566
+ Counters: [1]
+ Callsites: -
+ - Guid: 2072045998141807037
+ Counters: [7]
+ Callsites: -
+ - Guid: 3087265239403591524
+ Counters: [10, 7]
+ -
+ - Guid: 4197650231481825559
+ Counters: [2]
+ Callsites: -
+ - Guid: 3087265239403591524
+ Counters: [1, 2]
;--- expected.txt
Function Info:
2072045998141807037 : f1. MaxCounterID: 1. MaxCallsiteID: 1
diff --git a/llvm/test/Analysis/CtxProfAnalysis/handle-select.ll b/llvm/test/Analysis/CtxProfAnalysis/handle-select.ll
index e740466a03f3e9..ce90d27fc9906b 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/handle-select.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/handle-select.ll
@@ -4,7 +4,7 @@
; the `select` is elided.
;
; RUN: split-file %s %t
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile.yaml --output=%t/profile.ctxprofdata
;
; RUN: opt -passes=ctx-instr-gen %t/example.ll -use-ctx-profile=%t/profile.ctxprofdata -S -o - | FileCheck %s --check-prefix=INSTR
; RUN: opt -passes=ctx-instr-gen,module-inline %t/example.ll -use-ctx-profile=%t/profile.ctxprofdata -S -o - | FileCheck %s --check-prefix=POST-INL
@@ -72,5 +72,12 @@ define i32 @bar(i32 %t) !guid !1 {
!0 = !{i64 1234}
!1 = !{i64 5678}
-;--- profile.json
-[{"Guid":1234, "Counters":[10, 4], "Callsites":[[{"Guid": 5678, "Counters":[4,3]}],[{"Guid": 5678, "Counters":[6,6]}]]}]
+;--- profile.yaml
+- Guid: 1234
+ Counters: [10, 4]
+ Callsites: -
+ - Guid: 5678
+ Counters: [4,3]
+ -
+ - Guid: 5678
+ Counters: [6,6]
diff --git a/llvm/test/Analysis/CtxProfAnalysis/inline.ll b/llvm/test/Analysis/CtxProfAnalysis/inline.ll
index 9381418c4e3f12..6c1e199c2ba1c0 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/inline.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/inline.ll
@@ -1,6 +1,6 @@
; RUN: rm -rf %t
; RUN: split-file %s %t
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile.yaml --output=%t/profile.ctxprofdata
; RUN: opt -passes='module-inline,print<ctx-prof-analysis>' -ctx-profile-printer-level=everything %t/module.ll -S \
; RUN: -use-ctx-profile=%t/profile.ctxprofdata -ctx-profile-printer-level=json \
@@ -94,22 +94,21 @@ define i32 @b() !guid !2 {
!0 = !{i64 1000}
!1 = !{i64 1001}
!2 = !{i64 1002}
-;--- profile.json
-[
- { "Guid": 1000,
- "Counters": [10, 2, 8],
- "Callsites": [
- [ { "Guid": 1001,
- "Counters": [2, 100],
- "Callsites": [[{"Guid": 1002, "Counters": [100]}]]}
- ],
- [ { "Guid": 1001,
- "Counters": [8, 500],
- "Callsites": [[{"Guid": 1002, "Counters": [500]}]]}
- ]
- ]
- }
-]
+;--- profile.yaml
+- Guid: 1000
+ Counters: [10, 2, 8]
+ Callsites: -
+ - Guid: 1001
+ Counters: [2, 100]
+ Callsites: -
+ - Guid: 1002
+ Counters: [100]
+ -
+ - Guid: 1001
+ Counters: [8, 500]
+ Callsites: -
+ - Guid: 1002
+ Counters: [500]
;--- expected.json
[
{ "Guid": 1000,
diff --git a/llvm/test/Analysis/CtxProfAnalysis/load-unapplicable.ll b/llvm/test/Analysis/CtxProfAnalysis/load-unapplicable.ll
index 09d2e150fbcef6..38dd0ea825d825 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/load-unapplicable.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/load-unapplicable.ll
@@ -5,7 +5,7 @@
;
; RUN: rm -rf %t
; RUN: split-file %s %t
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile.yaml --output=%t/profile.ctxprofdata
; RUN: opt -passes='require<ctx-prof-analysis>,print<ctx-prof-analysis>' -ctx-profile-printer-level=everything \
; RUN: %t/example.ll -S 2>&1 | FileCheck %s
@@ -15,38 +15,16 @@
; output it from opt. Note that the root GUIDs - 12341 and 34234 - are different from
; the GUID present in the module, which is otherwise present in the profile, but not
; as a root.
-;--- profile.json
-[
- {
- "Counters": [
- 9
- ],
- "Guid": 12341
- },
- {
- "Counters": [
- 5
- ],
- "Guid": 1000
- },
- {
- "Callsites": [
- [
- {
- "Counters": [
- 6,
- 7
- ],
- "Guid": 1000
- }
- ]
- ],
- "Counters": [
- 1
- ],
- "Guid": 34234
- }
-]
+;--- profile.yaml
+- Guid: 12341
+ Counters: [9]
+- Guid: 1000
+ Counters: [5]
+- Guid: 34234
+ Counters: [1]
+ Callsites: -
+ - Guid: 1000
+ Counters: [6, 7]
;--- example.ll
declare void @bar()
diff --git a/llvm/test/Analysis/CtxProfAnalysis/load.ll b/llvm/test/Analysis/CtxProfAnalysis/load.ll
index 0cf6c5973dc6b5..62c6344ed3fec0 100644
--- a/llvm/test/Analysis/CtxProfAnalysis/load.ll
+++ b/llvm/test/Analysis/CtxProfAnalysis/load.ll
@@ -2,7 +2,7 @@
;
; RUN: rm -rf %t
; RUN: split-file %s %t
-; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
+; RUN: llvm-ctxprof-util fromYAML --input=%t/profile.yaml --output=%t/profile.ctxprofdata
; RUN: opt -passes='require<ctx-prof-analysis>,print<ctx-prof-analysis>' -ctx-profile-printer-level=everything \
; RUN: %t/example.ll -S 2>&1 | FileCheck %s --check-prefix=NO-CTX
@@ -23,38 +23,16 @@
;
; This is the reference profile, laid out in the format the json formatter will
; output it from opt.
-;--- profile.json
-[
- {
- "Counters": [
- 9
- ],
- "Guid": 12341
- },
- {
- "Counters": [
- 5
- ],
- "Guid": 12074870348631550642
- },
- {
- "Callsites": [
- [
- {
- "Counters": [
- 6,
- 7
- ],
- "Guid": 728453322856651412
- }
- ]
- ],
- "Counters": [
- 1
- ],
- "Guid": 11872291593386833696
- }
-]
+;--- profile.yaml
+- Guid: 12341
+ Counters: [9]
+- Guid: 12074870348631550642
+ Counters: [5]
+- Guid: 11872291593386833696
+ Counters: [1]
+ Callsites: -
+ - Guid: 728453322856651412
+ Counters: [6, 7]
;--- expected-profile-output.txt
Function Info:
4909520559318251808 : an_entrypoint. MaxCounterID: 2. MaxCallsiteID: 1
diff --git a/llvm/test/ThinLTO/X86/ctxprof.ll b/llvm/test/ThinLTO/X86/ctxprof.ll
index 4baea3b25890eb..fd325dad5ada1e 100644
--- a/llvm/test/ThinLTO/X86/ctxprof.ll
+++ b/llvm/test/ThinLTO/X86/ctxprof.ll
@@ -55,8 +55,8 @@
; RUN: echo '[ \
; RUN: {"Guid": 6019442868614718803, "Counters": [1], "Callsites": [[{"Guid": 15593096274670919754, "Counters": [1]}]]}, \
; RUN: {"Guid": 15593096274670919754, "Counters": [1], "Callsites": [[{"Guid": 6019442868614718803, "Counters": [1]}]]} \
-; RUN: ]' > %t_exp/ctxprof.json
-; RUN: llvm-ctxprof-util fromJSON --input %t_exp/ctxprof.json --output %t_exp/ctxprof.bitstream
+; RUN: ]' > %t_exp/ctxprof.yaml
+; RUN: llvm-ctxprof-util fromYAML --input %t_exp/ctxprof.yaml --output %t_exp/ctxprof.bitstream
; RUN: llvm-lto2 run %t/m1-instr.bc %t/m2-instr.bc \
; RUN: -o %t_exp/result.o -save-temps \
; RUN: -use-ctx-profile=%t_exp/ctxprof.bitstream \
diff --git a/llvm/test/Transforms/EliminateAvailableExternally/transform-to-local.ll b/llvm/test/Transforms/EliminateAvailableExternally/transform-to-local.ll
index 4908fba62e3bfe..ad10c155030974 100644
--- a/llvm/test/Transforms/EliminateAvailableExternally/transform-to-local.ll
+++ b/llvm/test/Transforms/EliminateAvailableExternally/transform-to-local.ll
@@ -1,7 +1,7 @@
; REQUIRES: asserts
; RUN: opt -passes=elim-avail-extern -avail-extern-to-local -stats -S 2>&1 < %s | FileCheck %s
;
-; RUN: echo '[{"Guid":1234, "Counters": [1]}]' | llvm-ctxprof-util fromJSON --input=- --output=%t_profile.ctxprofdata
+; RUN: echo '[{"Guid":1234, "Counters": [1]}]' | llvm-ctxprof-util fromYAML --input=- --output=%t_profile.ctxprofdata
;
; Because we pass a contextual profile with a root defined in this module, we expect the outcome to be the same as-if
; we passed -avail-extern-to-local, i.e. available_externally don't get elided and instead get converted to local linkage
@@ -9,7 +9,7 @@
; If the profile doesn't apply to this module, available_externally won't get converted to internal linkage, and will be
; removed instead.
-; RUN: echo '[{"Guid":5678, "Counters": [1]}]' | llvm-ctxprof-util fromJSON --input=- --output=%t_profile_bad.ctxprofdata
+; RUN: echo '[{"Guid":5678, "Counters": [1]}]' | llvm-ctxprof-util fromYAML --input=- --output=%t_profile_bad.ctxprofdata
; RUN: opt -passes='assign-guid,require<ctx-prof-analysis>,elim-avail-extern' -use-ctx-profile=%t_profile_bad.ctxprofdata -stats -S 2>&1 < %s | FileCheck %s --check-prefix=NOOP
declare void @call_out(ptr %fct)
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/bad.json b/llvm/test/tools/llvm-ctxprof-util/Inputs/bad.json
deleted file mode 100644
index 35c169002386eb..00000000000000
--- a/llvm/test/tools/llvm-ctxprof-util/Inputs/bad.json
+++ /dev/null
@@ -1 +0,0 @@
-[{]
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/bad.yaml b/llvm/test/tools/llvm-ctxprof-util/Inputs/bad.yaml
new file mode 100644
index 00000000000000..54fc332d7c5e61
--- /dev/null
+++ b/llvm/test/tools/llvm-ctxprof-util/Inputs/bad.yaml
@@ -0,0 +1 @@
+- f
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/empty.json b/llvm/test/tools/llvm-ctxprof-util/Inputs/empty.json
deleted file mode 100644
index fe51488c7066f6..00000000000000
--- a/llvm/test/tools/llvm-ctxprof-util/Inputs/empty.json
+++ /dev/null
@@ -1 +0,0 @@
-[]
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/empty.yaml b/llvm/test/tools/llvm-ctxprof-util/Inputs/empty.yaml
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-bad-subctx.json b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-bad-subctx.json
deleted file mode 100644
index b47e0ee1a04ba1..00000000000000
--- a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-bad-subctx.json
+++ /dev/null
@@ -1,8 +0,0 @@
-[{
- "Guid": 123,
- "Counters": [1, 2],
- "Callsites":
- [
- {"Guid": 1}
- ]
-}]
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-bad-subctx.yaml b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-bad-subctx.yaml
new file mode 100644
index 00000000000000..2c2527d75ad2ac
--- /dev/null
+++ b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-bad-subctx.yaml
@@ -0,0 +1,4 @@
+- Guid: 123
+ Counters: [1, 2]
+ Callsites: - Guid: 1
+
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-counters.json b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-counters.json
deleted file mode 100644
index 95cdd45a5a0f72..00000000000000
--- a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-counters.json
+++ /dev/null
@@ -1,5 +0,0 @@
-[
- {
- "Guid": 1231
- }
-]
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-counters.yaml b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-counters.yaml
new file mode 100644
index 00000000000000..7944d92e62ab75
--- /dev/null
+++ b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-counters.yaml
@@ -0,0 +1 @@
+- Guid: 1231
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-ctx.json b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-ctx.json
deleted file mode 100644
index 93d51406d63fbe..00000000000000
--- a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-ctx.json
+++ /dev/null
@@ -1 +0,0 @@
-[{}]
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-ctx.yaml b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-ctx.yaml
new file mode 100644
index 00000000000000..3cf20d57b0b825
--- /dev/null
+++ b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-ctx.yaml
@@ -0,0 +1 @@
+-
\ No newline at end of file
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-vector.json b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-vector.json
deleted file mode 100644
index 0967ef424bce67..00000000000000
--- a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-vector.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-vector.yaml b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-vector.yaml
new file mode 100644
index 00000000000000..362277183dec9c
--- /dev/null
+++ b/llvm/test/tools/llvm-ctxprof-util/Inputs/invalid-no-vector.yaml
@@ -0,0 +1 @@
+Guid: 1
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.json b/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.json
deleted file mode 100644
index d4a6da4142110c..00000000000000
--- a/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.json
+++ /dev/null
@@ -1,47 +0,0 @@
-[
- {
- "Guid": 1000,
- "Counters": [
- 1,
- 2,
- 3
- ],
- "Callsites": [
- [],
- [
- {
- "Guid": 2000,
- "Counters": [
- 4,
- 5
- ]
- },
- {
- "Guid": 18446744073709551613,
- "Counters": [
- 6,
- 7,
- 8
- ]
- }
- ],
- [
- {
- "Guid": 3000,
- "Counters": [
- 40,
- 50
- ]
- }
- ]
- ]
- },
- {
- "Guid": 18446744073709551612,
- "Counters": [
- 5,
- 9,
- 10
- ]
- }
-]
diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.yaml b/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.yaml
new file mode 100644
index 00000000000000..6080c2414d64a0
--- /dev/null
+++ b/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.yaml
@@ -0,0 +1,13 @@
+- Guid: 1000
+ Counters: [1, 2, 3]
+ Callsites: - []
+ -
+ - Guid: 2000
+ Counters: [4, 5]
+ - Guid: 18446744073709551613
+ Counters: [6, 7, 8]
+ -
+ - Guid: 3000
+ Counters: [40, 50]
+- Guid: 18446744073709551612
+ Counters: [5, 9, 10]
diff --git a/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util-negative.test b/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util-negative.test
index e8668a7f198a98..d1f20ffdbc1c4c 100644
--- a/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util-negative.test
+++ b/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util-negative.test
@@ -1,24 +1,24 @@
; REQUIRES: x86_64-linux
-; RUN: not llvm-ctxprof-util nofile.json 2>&1 | FileCheck %s --check-prefix=NO_CMD
-; RUN: not llvm-ctxprof-util invalidCmd --input nofile.json 2>&1 | FileCheck %s --check-prefix=INVALID_CMD
-; RUN: not llvm-ctxprof-util fromJSON nofile.json 2>&1 | FileCheck %s --check-prefix=NO_FLAG
-; RUN: not llvm-ctxprof-util fromJSON --input nofile.json 2>&1 | FileCheck -DMSG=%errc_ENOENT %s --check-prefix=NO_FILE
-; RUN: not llvm-ctxprof-util fromJSON --input %S/Inputs/bad.json 2>&1 | FileCheck %s --check-prefix=BAD_JSON
-; RUN: not llvm-ctxprof-util fromJSON --input %S/Inputs/invalid-no-vector.json 2>&1 | FileCheck %s --check-prefix=NO_VECTOR
-; RUN: not llvm-ctxprof-util fromJSON --input %S/Inputs/invalid-no-ctx.json 2>&1 | FileCheck %s --check-prefix=NO_CTX
-; RUN: not llvm-ctxprof-util fromJSON --input %S/Inputs/invalid-no-counters.json 2>&1 | FileCheck %s --check-prefix=NO_COUNTERS
-; RUN: not llvm-ctxprof-util fromJSON --input %S/Inputs/invalid-bad-subctx.json 2>&1 | FileCheck %s --check-prefix=BAD_SUBCTX
+; RUN: not llvm-ctxprof-util nofile.yaml 2>&1 | FileCheck %s --check-prefix=NO_CMD
+; RUN: not llvm-ctxprof-util invalidCmd --input nofile.yaml 2>&1 | FileCheck %s --check-prefix=INVALID_CMD
+; RUN: not llvm-ctxprof-util fromYAML nofile.yaml 2>&1 | FileCheck %s --check-prefix=NO_FLAG
+; RUN: not llvm-ctxprof-util fromYAML --input nofile.yaml 2>&1 | FileCheck -DMSG=%errc_ENOENT %s --check-prefix=NO_FILE
+; RUN: not llvm-ctxprof-util fromYAML --input %S/Inputs/bad.yaml 2>&1 | FileCheck %s --check-prefix=BAD_FORMAT
+; RUN: not llvm-ctxprof-util fromYAML --input %S/Inputs/invalid-no-vector.yaml 2>&1 | FileCheck %s --check-prefix=NO_VECTOR
+; RUN: not llvm-ctxprof-util fromYAML --input %S/Inputs/invalid-no-ctx.yaml 2>&1 | FileCheck %s --check-prefix=NO_CTX
+; RUN: not llvm-ctxprof-util fromYAML --input %S/Inputs/invalid-no-counters.yaml 2>&1 | FileCheck %s --check-prefix=NO_COUNTERS
+; RUN: not llvm-ctxprof-util fromYAML --input %S/Inputs/invalid-bad-subctx.yaml 2>&1 | FileCheck %s --check-prefix=BAD_SUBCTX
; RUN: rm -rf %t
-; RUN: not llvm-ctxprof-util fromJSON --input %S/Inputs/valid.json --output %t/output.bitstream 2>&1 | FileCheck %s --check-prefix=NO_DIR
+; RUN: not llvm-ctxprof-util fromYAML --input %S/Inputs/valid.yaml --output %t/output.bitstream 2>&1 | FileCheck %s --check-prefix=NO_DIR
-; NO_CMD: Unknown subcommand 'nofile.json'
+; NO_CMD: Unknown subcommand 'nofile.yaml'
; INVALID_CMD: Unknown subcommand 'invalidCmd'
-; NO_FLAG: Unknown command line argument 'nofile.json'.
-; NO_FILE: 'nofile.json': [[MSG]]
-; BAD_JSON: Expected object key
-; NO_VECTOR: expected array
-; NO_CTX: missing value at (root)[0].Guid
-; NO_COUNTERS: missing value at (root)[0].Counters
-; BAD_SUBCTX: expected array at (root)[0].Callsites[0]
+; NO_FLAG: Unknown command line argument 'nofile.yaml'.
+; NO_FILE: 'nofile.yaml': [[MSG]]
+; BAD_FORMAT: YAML:1:3: error: not a mapping
+; NO_VECTOR: YAML:1:1: error: not a sequence
+; NO_CTX: YAML:1:2: error: not a mapping
+; NO_COUNTERS: YAML:1:3: error: missing required key 'Counters'
+; BAD_SUBCTX: YAML:3:16: error: not a sequence
; NO_DIR: failed to open output
diff --git a/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util.test b/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util.test
index 5a21bffa590229..91ebd1de59bb54 100644
--- a/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util.test
+++ b/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util.test
@@ -1,15 +1,15 @@
; REQUIRES: x86_64-linux
; RUN: mkdir -p %t
-; RUN: llvm-ctxprof-util fromJSON --input %S/Inputs/empty.json -output %t/empty.bitstream
+; RUN: llvm-ctxprof-util fromYAML --input %S/Inputs/empty.yaml -output %t/empty.bitstream
; RUN: llvm-bcanalyzer --dump %t/empty.bitstream | FileCheck %s --check-prefix=EMPTY
-; RUN: llvm-ctxprof-util fromJSON --input %S/Inputs/valid.json -output %t/valid.bitstream
+; RUN: llvm-ctxprof-util fromYAML --input %S/Inputs/valid.yaml -output %t/valid.bitstream
; For the valid case, check against a reference output.
; Note that uint64_t are printed as signed values by llvm-bcanalyzer:
-; * 18446744073709551613 in json is -3 in the output
-; * 18446744073709551612 in json is -4 in the output
+; * 18446744073709551613 in yaml is -3 in the output
+; * 18446744073709551612 in yaml is -4 in the output
; Also we have no callee/context at index 0, 2 callsites for index 1, and one for
; index 2.
; RUN: llvm-bcanalyzer --dump %t/valid.bitstream | FileCheck %s --check-prefix=VALID
diff --git a/llvm/tools/llvm-ctxprof-util/llvm-ctxprof-util.cpp b/llvm/tools/llvm-ctxprof-util/llvm-ctxprof-util.cpp
index 2cf6d7613bdc92..cfa14b22c14698 100644
--- a/llvm/tools/llvm-ctxprof-util/llvm-ctxprof-util.cpp
+++ b/llvm/tools/llvm-ctxprof-util/llvm-ctxprof-util.cpp
@@ -22,7 +22,7 @@
using namespace llvm;
-static cl::SubCommand FromJSON("fromJSON", "Convert from json");
+static cl::SubCommand FromYAML("fromYAML", "Convert from yaml");
static cl::opt<std::string> InputFilename(
"input", cl::value_desc("input"), cl::init("-"),
@@ -35,15 +35,15 @@ static cl::opt<std::string> InputFilename(
"'Contexts', optional. An array containing arrays of contexts. The "
"context array at a position 'i' is the set of callees at that "
"callsite index. Use an empty array to indicate no callees."),
- cl::sub(FromJSON));
+ cl::sub(FromYAML));
static cl::opt<std::string> OutputFilename("output", cl::value_desc("output"),
cl::init("-"),
cl::desc("Output file"),
- cl::sub(FromJSON));
+ cl::sub(FromYAML));
// Save the bitstream profile from the JSON representation.
-Error convertFromJSON() {
+Error convertFromYAML() {
auto BufOrError =
MemoryBuffer::getFileOrSTDIN(InputFilename, /*IsText=*/true);
if (!BufOrError)
@@ -58,14 +58,14 @@ Error convertFromJSON() {
if (EC)
return createStringError(EC, "failed to open output");
- return llvm::createCtxProfFromJSON(BufOrError.get()->getBuffer(), Out);
+ return llvm::createCtxProfFromYAML(BufOrError.get()->getBuffer(), Out);
}
int main(int argc, const char **argv) {
cl::ParseCommandLineOptions(argc, argv, "LLVM Contextual Profile Utils\n");
ExitOnError ExitOnErr("llvm-ctxprof-util: ");
- if (FromJSON) {
- if (auto E = convertFromJSON()) {
+ if (FromYAML) {
+ if (auto E = convertFromYAML()) {
handleAllErrors(std::move(E), [&](const ErrorInfoBase &E) {
E.log(errs());
errs() << "\n";
diff --git a/llvm/unittests/Transforms/Utils/CallPromotionUtilsTest.cpp b/llvm/unittests/Transforms/Utils/CallPromotionUtilsTest.cpp
index dcb1c10433ccf4..4420a6d0654993 100644
--- a/llvm/unittests/Transforms/Utils/CallPromotionUtilsTest.cpp
+++ b/llvm/unittests/Transforms/Utils/CallPromotionUtilsTest.cpp
@@ -547,7 +547,7 @@ define i32 @f4() !guid !3 {
raw_fd_stream Out(ProfileFile.path(), EC);
ASSERT_FALSE(EC);
// "False" means no error.
- ASSERT_FALSE(llvm::createCtxProfFromJSON(Profile, Out));
+ ASSERT_FALSE(llvm::createCtxProfFromYAML(Profile, Out));
}
ModuleAnalysisManager MAM;
More information about the llvm-commits
mailing list