#include "lattice.h" #include namespace wasm::analysis { struct SignLattice { public: enum Sign { BOTTOM, NEGATIVE, ZERO, POSITIVE, TOP }; private: Sign value; public: bool isTop() { return value == TOP; } bool isBottom() { return value == BOTTOM; } static LatticeComparison compare(const SignLattice& left, const SignLattice& right) { if (left.value == right.value) { return EQUAL; } else if (left.value == BOTTOM || right.value == TOP) { return LESS; } else if (left.value == TOP || right.value == BOTTOM) { return GREATER; } else { return NO_RELATION; } } // Modifies the left lattice element to the least upper bound between // it and the right hand lattice element in-place. Returns true // if the left lattice element has been changed. void getLeastUpperBound(const SignLattice& right) { if (value == right.value || value == TOP || right.value == BOTTOM) { return; } else if (value == BOTTOM || right.value == TOP) { value = right.value; } else { value = TOP; } } }; } // namespace wasm::analysis