VapourSynth-llvmexpr
Loading...
Searching...
No Matches
analysis::RelAccessAnalysisPass Class Reference

#include <llvmexpr/analysis/passes/RelAccessAnalysisPass.hpp>

Inheritance diagram for analysis::RelAccessAnalysisPass:
Collaboration diagram for analysis::RelAccessAnalysisPass:

Public Member Functions

RelAccessAnalysisResult run (const std::vector< Token > &tokens, AnalysisManager &am) override
const char * getName () const override
Public Member Functions inherited from analysis::Pass
 Pass ()=default
virtual ~Pass ()=default
 Pass (const Pass &)=delete
Passoperator= (const Pass &)=delete
 Pass (Pass &&)=delete
Passoperator= (Pass &&)=delete

Additional Inherited Members

Public Types inherited from analysis::AnalysisPass< RelAccessAnalysisPass, RelAccessAnalysisResult >
using Result

Detailed Description

Analyzes the expression to identify all relative clip accesses. Collects:

  • All unique relative y-accesses and their mirroring modes.
  • The minimum and maximum relative x-accesses across the expression. This information is used by the IR generator to optimize memory access patterns. Depends on: None

Definition at line 43 of file RelAccessAnalysisPass.hpp.

Member Function Documentation

◆ getName()

const char * analysis::RelAccessAnalysisPass::getName ( ) const
inlinenodiscardoverridevirtual

Implements analysis::Pass.

Definition at line 49 of file RelAccessAnalysisPass.hpp.

49 {
50 return "RelAccessAnalysisPass";
51 }

◆ run()

RelAccessAnalysisResult analysis::RelAccessAnalysisPass::run ( const std::vector< Token > & tokens,
AnalysisManager & am )
overridevirtual

Implements analysis::AnalysisPass< RelAccessAnalysisPass, RelAccessAnalysisResult >.

Definition at line 29 of file RelAccessAnalysisPass.cpp.

30 {
31 RelAccessAnalysisResult result;
32 result.mirror_boundary = am.getMirrorBoundary();
33
34 std::set<RelYAccess> seen;
35 for (const auto& token : tokens) {
36 if (token.type == TokenType::ClipRel) {
37 const auto& payload =
38 std::get<TokenPayloadClipAccess>(token.payload);
39 bool use_mirror =
40 payload.has_mode ? payload.use_mirror : result.mirror_boundary;
41 RelYAccess access{.clip_idx = payload.clip_idx,
42 .rel_y = payload.rel_y,
43 .use_mirror = use_mirror};
44 if (!seen.contains(access)) {
45 seen.insert(access);
46 result.unique_rel_y_accesses.push_back(access);
47 }
48 result.min_rel_x = std::min(result.min_rel_x, payload.rel_x);
49 result.max_rel_x = std::max(result.max_rel_x, payload.rel_x);
50 } else if (token.type == TokenType::ClipCur) {
51 const auto& payload =
52 std::get<TokenPayloadClipAccess>(token.payload);
53 RelYAccess access{.clip_idx = payload.clip_idx,
54 .rel_y = 0,
55 .use_mirror = result.mirror_boundary};
56 if (!seen.contains(access)) {
57 seen.insert(access);
58 result.unique_rel_y_accesses.push_back(access);
59 }
60 }
61 }
62 return result;
63}

References ClipCur, ClipRel, analysis::AnalysisManager::getMirrorBoundary(), analysis::RelAccessAnalysisResult::max_rel_x, analysis::RelAccessAnalysisResult::min_rel_x, analysis::RelAccessAnalysisResult::mirror_boundary, and analysis::RelAccessAnalysisResult::unique_rel_y_accesses.


The documentation for this class was generated from the following files: