#ifndef SOURCE_OPT_SCALAR_ANALYSIS_H_
#define SOURCE_OPT_SCALAR_ANALYSIS_H_
#include <algorithm>
#include <cstdint>
#include <map>
#include <memory>
#include <unordered_set>
#include <utility>
#include <vector>
#include "source/opt/basic_block.h"
#include "source/opt/instruction.h"
#include "source/opt/scalar_analysis_nodes.h"
namespace spvtools {
namespace opt {
class IRContext;
class Loop;
class ScalarEvolutionAnalysis { … };
class SExpression { … };
inline SExpression SExpression::operator+(SENode* rhs) const { … }
template <typename T,
typename std::enable_if<std::is_integral<T>::value, int>::type>
inline SExpression SExpression::operator+(T integer) const { … }
inline SExpression SExpression::operator+(SExpression rhs) const { … }
inline SExpression SExpression::operator-() const { … }
inline SExpression SExpression::operator-(SENode* rhs) const { … }
template <typename T,
typename std::enable_if<std::is_integral<T>::value, int>::type>
inline SExpression SExpression::operator-(T integer) const { … }
inline SExpression SExpression::operator-(SExpression rhs) const { … }
inline SExpression SExpression::operator*(SENode* rhs) const { … }
template <typename T,
typename std::enable_if<std::is_integral<T>::value, int>::type>
inline SExpression SExpression::operator*(T integer) const { … }
inline SExpression SExpression::operator*(SExpression rhs) const { … }
template <typename T,
typename std::enable_if<std::is_integral<T>::value, int>::type>
inline std::pair<SExpression, int64_t> SExpression::operator/(T integer) const { … }
template <typename T,
typename std::enable_if<std::is_integral<T>::value, int>::type>
inline SExpression operator+(T lhs, SExpression rhs) { … }
inline SExpression operator+(SENode* lhs, SExpression rhs) { … }
template <typename T,
typename std::enable_if<std::is_integral<T>::value, int>::type>
inline SExpression operator-(T lhs, SExpression rhs) { … }
inline SExpression operator-(SENode* lhs, SExpression rhs) { … }
template <typename T,
typename std::enable_if<std::is_integral<T>::value, int>::type>
inline SExpression operator*(T lhs, SExpression rhs) { … }
inline SExpression operator*(SENode* lhs, SExpression rhs) { … }
template <typename T,
typename std::enable_if<std::is_integral<T>::value, int>::type>
inline std::pair<SExpression, int64_t> operator/(T lhs, SExpression rhs) { … }
inline std::pair<SExpression, int64_t> operator/(SENode* lhs, SExpression rhs) { … }
}
}
#endif