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

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

Inheritance diagram for analysis::VarInitPass:
Collaboration diagram for analysis::VarInitPass:

Public Types

using Result = VarInitResult
Public Types inherited from analysis::AnalysisPass< VarInitPass, VarInitResult >
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

Performs forward dataflow analysis to determine which variables and arrays are definitely initialized at each program point. Uses intersection semantics at merge points (a variable is only considered initialized if it's initialized on ALL incoming paths). Depends on: BlockAnalysisPass

Definition at line 42 of file VarInitPass.hpp.

Member Typedef Documentation

◆ Result

Definition at line 44 of file VarInitPass.hpp.

Member Function Documentation

◆ getName()

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

Implements analysis::Pass.

Definition at line 46 of file VarInitPass.hpp.

46 {
47 return "Variable Initialization Pass";
48 }

◆ run()

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

Implements analysis::AnalysisPass< VarInitPass, VarInitResult >.

Definition at line 89 of file VarInitPass.cpp.

90 {
91 const auto& block_result = am.getResult<BlockAnalysisPass>();
92 const auto& cfg_blocks = block_result.cfg_blocks;
93
94 // Collect all variables and arrays
95 std::set<std::string> all_vars;
96 for (const auto& token : tokens) {
97 if (token.type == TokenType::VarStore ||
98 token.type == TokenType::VarLoad) {
99 all_vars.insert(std::get<TokenPayloadVar>(token.payload).name);
100 } else if (token.type == TokenType::ArrayAllocStatic ||
101 token.type == TokenType::ArrayAllocDyn ||
102 token.type == TokenType::ArrayStore ||
103 token.type == TokenType::ArrayLoad) {
104 const auto& array_name =
105 std::get<TokenPayloadArrayOp>(token.payload).name;
106 all_vars.insert(var_naming::getArrayName(array_name));
107 }
108 }
109
110 VarInitAnalysis analysis(all_vars);
111 auto [in_sets, out_sets] = analysis.analyze(tokens, cfg_blocks);
112
113 Result result;
114 result.var_init_in = std::move(in_sets);
115 result.var_init_out = std::move(out_sets);
116
117 return result;
118}
@ ArrayAllocStatic
Definition Tokenizer.hpp:51
std::string getArrayName(std::string_view base_name)
Definition VarNaming.hpp:30

References ArrayAllocDyn, ArrayAllocStatic, ArrayLoad, ArrayStore, analysis::var_naming::getArrayName(), analysis::AnalysisManager::getResult(), analysis::VarInitResult::var_init_in, analysis::VarInitResult::var_init_out, VarLoad, and VarStore.


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