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

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

Inheritance diagram for analysis::BlockAnalysisPass:
Collaboration diagram for analysis::BlockAnalysisPass:

Public Types

using Result = BlockAnalysisResult
Public Types inherited from analysis::AnalysisPass< BlockAnalysisPass, BlockAnalysisResult >
using Result

Public Member Functions

const char * getName () const override
Result run (const std::vector< Token > &tokens, AnalysisManager &am) 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

Detailed Description

Computes per-block properties Responsibilities:

  • Calculate stack_effect for each block
  • Calculate min_stack_needed for each block
  • These are local properties that don't depend on other blocks. Depends on: BuildCFGPass

Definition at line 41 of file BlockAnalysisPass.hpp.

Member Typedef Documentation

◆ Result

Member Function Documentation

◆ getName()

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

Implements analysis::Pass.

Definition at line 46 of file BlockAnalysisPass.hpp.

46 {
47 return "Block Analysis Pass";
48 }

◆ run()

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

Implements analysis::AnalysisPass< BlockAnalysisPass, BlockAnalysisResult >.

Definition at line 30 of file BlockAnalysisPass.cpp.

30 {
31 const auto& cfg_result = am.getResult<BuildCFGPass>();
32
33 Result result;
34 result.cfg_blocks = cfg_result.cfg_blocks;
35
36 for (auto& block : result.cfg_blocks) {
37 int current_stack = 0;
38 int min_stack_in_block = 0;
39
40 for (int j = block.start_token_idx; j < block.end_token_idx; ++j) {
41 const auto& token = tokens[j];
42 const auto behavior = get_token_behavior(token);
43
44 int items_needed = behavior.arity;
45 if (current_stack < items_needed) {
46 min_stack_in_block =
47 std::max(min_stack_in_block, items_needed - current_stack);
48 }
49
50 current_stack += behavior.stack_effect;
51 }
52
53 block.stack_effect = current_stack;
54 block.min_stack_needed = min_stack_in_block;
55 }
56
57 return result;
58}
TokenBehavior get_token_behavior(const Token &token)

References get_token_behavior(), and analysis::AnalysisManager::getResult().


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