1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
#ifndef FPOptimizer_RangeEstimationHH
#define FPOptimizer_RangeEstimationHH
#include "codetree.hh"
#include "valuerange.hh"
namespace FPoptimizer_CodeTree
{
enum TriTruthValue { IsAlways, IsNever, Unknown };
/* This function calculates the minimum and maximum values
* of the tree's result. If an estimate cannot be made,
* -inf..+inf is assumed (min.known=max.known=false).
*/
template<typename Value_t>
range<Value_t> CalculateResultBoundaries(const CodeTree<Value_t>& tree);
template<typename Value_t>
bool IsLogicalValue(const CodeTree<Value_t>& tree);
template<typename Value_t>
TriTruthValue GetIntegerInfo(const CodeTree<Value_t>& tree);
template<typename Value_t>
inline TriTruthValue GetEvennessInfo(const CodeTree<Value_t>& tree)
{
if(!tree.IsImmed()) return Unknown;
const Value_t& value = tree.GetImmed();
if(FUNCTIONPARSERTYPES::isEvenInteger(value)) return IsAlways;
if(FUNCTIONPARSERTYPES::isOddInteger(value)) return IsNever;
return Unknown;
}
template<typename Value_t>
inline TriTruthValue GetPositivityInfo(const CodeTree<Value_t>& tree)
{
range<Value_t> p = CalculateResultBoundaries(tree);
if(p.min.known && p.min.val >= Value_t()) return IsAlways;
if(p.max.known && p.max.val < Value_t()) return IsNever;
return Unknown;
}
template<typename Value_t>
inline TriTruthValue GetLogicalValue(const CodeTree<Value_t>& tree, bool abs)
{
range<Value_t> p = CalculateResultBoundaries(tree);
if(IsLogicalTrueValue(p, abs)) return IsAlways;
if(IsLogicalFalseValue(p, abs)) return IsNever;
return Unknown;
}
}
#endif
|