summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2023-10-25 20:55:27 +0200
committerGitHub <noreply@github.com>2023-10-25 20:55:27 +0200
commita09ea699d69ed54741d95b9b5fa2247bdcf28152 (patch)
tree3bb1d68c93a3ca6b03671fc7ba4a966dd7a7dd8a /src
parent2b6566341cf316cc18486e96d54e8d8dd9a57a5b (diff)
downloadbinaryen-a09ea699d69ed54741d95b9b5fa2247bdcf28152.tar.gz
binaryen-a09ea699d69ed54741d95b9b5fa2247bdcf28152.tar.bz2
binaryen-a09ea699d69ed54741d95b9b5fa2247bdcf28152.zip
[analysis] Implement an Int lattice (#6037)
Implement a generic lattice template for integral types ordered by `<`.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/lattices/int.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/analysis/lattices/int.h b/src/analysis/lattices/int.h
new file mode 100644
index 000000000..a2cd37c1e
--- /dev/null
+++ b/src/analysis/lattices/int.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2023 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef wasm_analysis_lattices_int_h
+#define wasm_analysis_lattices_int_h
+
+#include <cstdint>
+#include <limits>
+
+#include "../lattice.h"
+
+namespace wasm::analysis {
+
+// The lattice of integers of the given type `T`, ordered by <. The min integer
+// is the bottom element and the max integer is the top element.
+#if __cplusplus >= 202002L
+template<std::integral T>
+#else
+template<typename T>
+#endif
+struct Integer {
+ using Element = T;
+ Element getBottom() const noexcept { return std::numeric_limits<T>::min(); }
+ LatticeComparison compare(Element a, Element b) const noexcept {
+ return a > b ? GREATER : a == b ? EQUAL : LESS;
+ }
+ bool join(Element& self, Element other) const noexcept {
+ if (self < other) {
+ self = other;
+ return true;
+ }
+ return false;
+ }
+};
+
+using Int32 = Integer<int32_t>;
+using UInt32 = Integer<uint32_t>;
+using Int64 = Integer<int64_t>;
+using UInt64 = Integer<uint64_t>;
+
+#if __cplusplus >= 202002L
+static_assert(Lattice<Int32>);
+static_assert(Lattice<Int64>);
+static_assert(Lattice<UInt32>);
+static_assert(Lattice<UInt64>);
+#endif // __cplusplus >= 202002L
+
+} // namespace wasm::analysis
+
+#endif // wasm_analysis_lattices_int_h