Squelch UBSAN divide-by-zero error.
It's not unexpected to divide by zero during constant-folding.
Bug: oss-fuzz:58809
Change-Id: Ia02f95d8b98ab0d691652d6aafef5fc80af30cf7
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/695876
Commit-Queue: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
diff --git a/resources/sksl/intrinsics/Normalize.sksl b/resources/sksl/intrinsics/Normalize.sksl
index 8f508ab..8a366fa 100644
--- a/resources/sksl/intrinsics/Normalize.sksl
+++ b/resources/sksl/intrinsics/Normalize.sksl
@@ -2,6 +2,9 @@
uniform half4 colorGreen, colorRed;
half4 main(float2 coords) {
+ // Ensure that normalizing zero doesn't trigger a UBSAN divide-by-zero report.
+ float normalizeZero = normalize(0);
+
const half4 constVec = half4(20, 0, 0, 0);
half4 expectedVec = half4(1, 0, 0, 0);
diff --git a/src/sksl/ir/SkSLFunctionCall.cpp b/src/sksl/ir/SkSLFunctionCall.cpp
index f425951..22f7d8d 100644
--- a/src/sksl/ir/SkSLFunctionCall.cpp
+++ b/src/sksl/ir/SkSLFunctionCall.cpp
@@ -413,7 +413,7 @@
double evaluate_add(double a, double b, double) { return a + b; }
double evaluate_sub(double a, double b, double) { return a - b; }
double evaluate_mul(double a, double b, double) { return a * b; }
-double evaluate_div(double a, double b, double) { return a / b; }
+double evaluate_div(double a, double b, double) { return sk_ieee_double_divide(a, b); }
double evaluate_abs(double a, double, double) { return std::abs(a); }
double evaluate_sign(double a, double, double) { return (a > 0) - (a < 0); }
double evaluate_opposite_sign(double a,double, double) { return (a < 0) - (a > 0); }