36 if (
const auto [node, ioBarrierOp] =
49 if (is<MemoryStateType>(trace1.Type()))
53 return *memoryStateInput.origin();
64 constexpr bool enableCaching =
false;
66 return tracer.
trace(output, withinRegion);
74 if (
const auto [_, constant] =
78 const auto & rep = constant->Representation();
79 if (rep.is_known() && rep.nbits() <= 64)
84 if (
const auto [_, constant] =
88 const auto & rep = constant->value();
89 if (rep.is_known() && rep.nbits() <= 64)
94 if (
const auto [sextNode, sextOp] =
99 if (!inputValue.has_value())
103 const auto inputBits = sextOp->nsrcbits();
107 if (
const auto [zextNode, zextOp] =
112 if (!inputValue.has_value())
116 const auto inputBits = zextOp->nsrcbits();
120 if (
const auto [truncNode, truncOp] =
125 if (!inputValue.has_value())
128 const auto outputBits = truncOp->ndstbits();
137std::optional<int64_t>
143 int64_t offsetInBytes = 0;
146 offsetInBytes += gepConstant.getOffsetInBytes();
149 return offsetInBytes;
156 std::vector<GetElementPtrOperation::Constant> gepConstants;
163 if (
const auto [gepNode, gepOperation] =
168 gepConstantOpt.has_value())
170 base = gepNode->input(0)->origin();
171 gepConstants.emplace_back(gepConstantOpt.value());
186 std::optional<int64_t> offsetInBytes,
188 const size_t maxTraceCollectionSize)
200 if (!it->second.has_value())
204 const auto prevOffset = *it->second;
207 if (offsetInBytes.has_value() && *offsetInBytes == prevOffset)
211 offsetInBytes = std::nullopt;
217 if (
const auto [gepNode, gepOperation] =
225 if (offsetInBytes.has_value())
228 gepConstant.has_value())
229 offsetInBytes = *offsetInBytes + gepConstant->getOffsetInBytes();
231 offsetInBytes = std::nullopt;
238 maxTraceCollectionSize);
242 if (
const auto [node, select] =
247 node->input(1)->origin(),
250 maxTraceCollectionSize)
252 node->input(2)->origin(),
255 maxTraceCollectionSize);
267 auto exitVar = gamma->MapOutputExitVar(*basePointer);
268 for (
auto result : exitVar.branchResult)
275 maxTraceCollectionSize))
288 auto loopVar = theta->MapOutputLoopVar(*basePointer);
293 loopVar.post->origin(),
296 maxTraceCollectionSize);
302 auto loopVar = theta->MapPreLoopVar(*basePointer);
309 loopVar.post->origin(),
312 maxTraceCollectionSize)
314 loopVar.input->origin(),
317 maxTraceCollectionSize);
321 traceCollection.
TopOrigins[basePointer] = offsetInBytes;
329 const size_t maxTraceCollectionSize)
335 maxTraceCollectionSize);
static rvsdg::Input & getBaseAddressInput(rvsdg::Node &node)
static std::optional< Constant > tryGetAsConstant(const rvsdg::SimpleNode &gepNode)
static rvsdg::Input & BarredInput(const rvsdg::Node &node) noexcept
static rvsdg::Input & MapMemoryStateOutputToInput(const rvsdg::Output &output)
bool traceThroughLoadedStates_
rvsdg::Output & traceStep(rvsdg::Output &output, const rvsdg::Region *withinRegion) override
OutputTracer(bool enableCaching)
Output & trace(Output &output)
virtual Output & traceStep(Output &output, const rvsdg::Region *withinRegion)
Represent acyclic RVSDG subgraphs.
Global memory state passed between functions.
bool TraceAllPointerOrigins(TracedPointerOrigin p, TraceCollection &traceCollection, const size_t maxTraceCollectionSize)
rvsdg::Output & traceOutput(rvsdg::Output &output, const rvsdg::Region *withinRegion)
static bool traceAllPointerOriginsInternal(const rvsdg::Output *basePointer, std::optional< int64_t > offsetInBytes, TraceCollection &traceCollection, const size_t maxTraceCollectionSize)
TracedPointerOrigin TracePointerOriginPrecise(const rvsdg::Output &p)
std::optional< int64_t > tryGetConstantSignedInteger(const rvsdg::Output &output)
static bool ThetaLoopVarIsInvariant(const ThetaNode::LoopVar &loopVar) noexcept
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
int64_t truncateAndZeroExtend(int64_t value, uint64_t keepBits)
int64_t truncateAndSignExtend(int64_t value, uint64_t keepBits)
std::unordered_map< const rvsdg::Output *, std::optional< int64_t > > TopOrigins
std::unordered_map< const rvsdg::Output *, std::optional< int64_t > > AllTracedOutputs
std::optional< std::vector< GetElementPtrOperation::Constant > > gepConstants
const rvsdg::Output * BasePointer
std::optional< int64_t > getOffsetInBytes() const noexcept