demotool/c-opopt.hh

68 lines
1.7 KiB
C++
Raw Normal View History

#pragma once
#include "c-opast.hh"
2017-12-02 12:18:31 +01:00
#include "c-opcomp.hh"
#include <ebcl/Algorithms.hh>
struct T_SyncCurves;
namespace opopt {
// Persistent data for the various stages of the optimizer.
struct T_OptData
{
2017-12-02 12:18:31 +01:00
// Logger
F_OPLogger logger{ []( auto , auto ) {} };
// List of errors generated by the optimizer
T_Array< ebcl::T_SRDError > errors;
// If the size of the ouput is fixed, this field contains it as a
// <width,height> pair.
T_Optional< std::pair< uint32_t , uint32_t > > fixedSize;
// The curves that will be bound to the inputs.
2017-12-02 12:18:31 +01:00
T_SyncCurves const* curves{ nullptr };
// A visitor to be used for the tree
ebcl::T_Visitor< opast::A_Node > visitor{ opast::ASTVisitorBrowser };
// Table of input declarations; used to fold constant inputs.
struct T_InputDecl {
ebcl::T_SRDLocation location;
float value;
};
T_Optional< T_KeyValueTable< T_String , T_Array< T_InputDecl > > > inputDecls;
//----------------------------------------------------------------------
void findInputDecls( T_OpsParserOutput& program ) noexcept;
};
/*= INDIVIDUAL OPTIMISATIONS =================================================*/
// All functions below return true if transformations were made, false if not.
// Attempts to fold constant expressions into single constants.
//
bool FoldConstants(
T_OpsParserOutput& program ,
T_OptData& optData ) noexcept;
// Attempts to propagate values from variables that contain constants to the
// locations at which they are used.
//
bool PropagateConstants(
T_OpsParserOutput& program ,
T_OptData& optData ) noexcept;
// Attempt to remove blocks of code that will not be executed because of
// constant conditions.
//
bool RemoveDeadCode(
T_OpsParserOutput& program ,
T_OptData& optData ) noexcept;
} // namespace opopt