https://github.com/mtrofin created https://github.com/llvm/llvm-project/pull/122545
None >From 26f606aed7fd6016f9defc2be9d0206e136d0ced Mon Sep 17 00:00:00 2001 From: Mircea Trofin <mtro...@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; _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits