Jlm
Trace.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2025 HÃ¥vard Krogstie <krogstie.havard@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
9 #include <jlm/llvm/ir/Trace.hpp>
10 #include <jlm/llvm/ir/types.hpp>
13 #include <jlm/rvsdg/Trace.hpp>
14 #include <jlm/rvsdg/type.hpp>
15 
16 namespace jlm::llvm
17 {
18 
19 OutputTracer::OutputTracer(const bool enableCaching)
20  : rvsdg::OutputTracer(enableCaching)
21 {}
22 
24 OutputTracer::traceStep(rvsdg::Output & output, const rvsdg::Region * withinRegion)
25 {
26  auto & trace1 = rvsdg::OutputTracer::traceStep(output, withinRegion);
27 
28  if (const auto [node, ioBarrierOp] =
29  rvsdg::TryGetSimpleNodeAndOptionalOp<IOBarrierOperation>(trace1);
30  node && ioBarrierOp)
31  {
32  return *IOBarrierOperation::BarredInput(*node).origin();
33  }
34 
35  // If enabled, try tracing through the memory states of load nodes
37  {
38  if (const auto [node, loadOp] = rvsdg::TryGetSimpleNodeAndOptionalOp<LoadOperation>(trace1);
39  node && loadOp)
40  {
41  if (is<MemoryStateType>(trace1.Type()))
42  {
43  // Map the memory state output to the corresponding memory state input
44  auto & memoryStateInput = LoadOperation::MapMemoryStateOutputToInput(trace1);
45  return *memoryStateInput.origin();
46  }
47  }
48  }
49 
50  return trace1;
51 }
52 
54 traceOutput(rvsdg::Output & output, const rvsdg::Region * withinRegion)
55 {
56  constexpr bool enableCaching = false;
57  OutputTracer tracer(enableCaching);
58  return tracer.trace(output, withinRegion);
59 }
60 
61 std::optional<int64_t>
63 {
64  const auto & normalized = llvm::traceOutput(output, nullptr);
65 
66  if (const auto [_, constant] =
67  rvsdg::TryGetSimpleNodeAndOptionalOp<IntegerConstantOperation>(normalized);
68  constant)
69  {
70  const auto & rep = constant->Representation();
71  if (rep.is_known() && rep.nbits() <= 64)
72  return rep.to_int();
73  return std::nullopt;
74  }
75 
76  if (const auto [_, constant] =
77  rvsdg::TryGetSimpleNodeAndOptionalOp<rvsdg::BitConstantOperation>(normalized);
78  constant)
79  {
80  const auto & rep = constant->value();
81  if (rep.is_known() && rep.nbits() <= 64)
82  return rep.to_int();
83  return std::nullopt;
84  }
85 
86  return std::nullopt;
87 }
88 
89 }
static rvsdg::Input & BarredInput(const rvsdg::SimpleNode &node) noexcept
Definition: IOBarrier.hpp:70
static rvsdg::Input & MapMemoryStateOutputToInput(const rvsdg::Output &output)
Definition: Load.hpp:157
bool traceThroughLoadedStates_
Definition: Trace.hpp:48
rvsdg::Output & traceStep(rvsdg::Output &output, const rvsdg::Region *withinRegion) override
Definition: Trace.cpp:24
OutputTracer(bool enableCaching)
Definition: Trace.cpp:19
Output * origin() const noexcept
Definition: node.hpp:58
Output & trace(Output &output)
Definition: Trace.cpp:22
virtual Output & traceStep(Output &output, const rvsdg::Region *withinRegion)
Definition: Trace.cpp:145
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
Global memory state passed between functions.
rvsdg::Output & traceOutput(rvsdg::Output &output, const rvsdg::Region *withinRegion)
Definition: Trace.cpp:54
std::optional< int64_t > tryGetConstantSignedInteger(const rvsdg::Output &output)
Definition: Trace.cpp:62