tint: fix UB const-eval div by zero

Bug: oss-fuzz:56904
Change-Id: I2f47fcfa238b28e1148b0b36ccbe2166445964a1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/125380
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 59776f9..084e54a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -335,8 +335,8 @@
       target_compile_options(${TARGET} PUBLIC -fsanitize=thread)
       target_link_options(${TARGET} PUBLIC -fsanitize=thread)
     elseif (${DAWN_ENABLE_UBSAN})
-      target_compile_options(${TARGET} PUBLIC -fsanitize=undefined)
-      target_link_options(${TARGET} PUBLIC -fsanitize=undefined)
+      target_compile_options(${TARGET} PUBLIC -fsanitize=undefined -fsanitize=float-divide-by-zero)
+      target_link_options(${TARGET} PUBLIC -fsanitize=undefined -fsanitize=float-divide-by-zero)
     endif()
   endif(COMPILER_IS_LIKE_GNU)
 
diff --git a/src/tint/number.h b/src/tint/number.h
index 69df284..7bc1eea 100644
--- a/src/tint/number.h
+++ b/src/tint/number.h
@@ -539,6 +539,9 @@
 /// @returns a / b, or an empty optional if the resulting value overflowed the float value
 template <typename FloatingPointT, typename = traits::EnableIf<IsFloatingPoint<FloatingPointT>>>
 inline std::optional<FloatingPointT> CheckedDiv(FloatingPointT a, FloatingPointT b) {
+    if (b == FloatingPointT{0.0} || b == FloatingPointT{-0.0}) {
+        return {};
+    }
     auto result = FloatingPointT{a.value / b.value};
     if (!std::isfinite(result.value)) {
         return {};
@@ -576,6 +579,9 @@
 /// float value
 template <typename FloatingPointT, typename = traits::EnableIf<IsFloatingPoint<FloatingPointT>>>
 inline std::optional<FloatingPointT> CheckedMod(FloatingPointT a, FloatingPointT b) {
+    if (b == FloatingPointT{0.0} || b == FloatingPointT{-0.0}) {
+        return {};
+    }
     auto result = FloatingPointT{detail::Mod(a.value, b.value)};
     if (!std::isfinite(result.value)) {
         return {};