Disable MSan and TSan in most microkernels with Out-of-Bounds reads

PiperOrigin-RevId: 416222214
diff --git a/src/f16-dwconv/gen/up16x25-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up16x25-minmax-neonfp16arith-acc2.c
index 74f19ec..9a7a42f 100644
--- a/src/f16-dwconv/gen/up16x25-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up16x25-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up16x25-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up16x25-minmax-neonfp16arith.c
index 5828d09..d3fd830 100644
--- a/src/f16-dwconv/gen/up16x25-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up16x25-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up16x4-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up16x4-minmax-neonfp16arith-acc2.c
index cf2f1c6..76e49df 100644
--- a/src/f16-dwconv/gen/up16x4-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up16x4-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up16x4-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up16x4-minmax-neonfp16arith.c
index 69f5c05..1adcca2 100644
--- a/src/f16-dwconv/gen/up16x4-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up16x4-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up16x9-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up16x9-minmax-neonfp16arith-acc2.c
index a983fe6..460af19 100644
--- a/src/f16-dwconv/gen/up16x9-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up16x9-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up16x9-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up16x9-minmax-neonfp16arith.c
index cf61076..c295ff0 100644
--- a/src/f16-dwconv/gen/up16x9-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up16x9-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up32x25-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up32x25-minmax-neonfp16arith-acc2.c
index 9b42a1f..23ba1d7 100644
--- a/src/f16-dwconv/gen/up32x25-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up32x25-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up32x25-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up32x25-minmax-neonfp16arith.c
index d4dbc11..f5cc446 100644
--- a/src/f16-dwconv/gen/up32x25-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up32x25-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up32x4-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up32x4-minmax-neonfp16arith-acc2.c
index 1440e04..d2ba17d 100644
--- a/src/f16-dwconv/gen/up32x4-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up32x4-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up32x4-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up32x4-minmax-neonfp16arith.c
index 4f4da81..c24db1d 100644
--- a/src/f16-dwconv/gen/up32x4-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up32x4-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up32x9-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up32x9-minmax-neonfp16arith-acc2.c
index 757930a..20c48c9 100644
--- a/src/f16-dwconv/gen/up32x9-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up32x9-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up32x9-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up32x9-minmax-neonfp16arith.c
index 6775553..2db6732 100644
--- a/src/f16-dwconv/gen/up32x9-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up32x9-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up8x25-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up8x25-minmax-neonfp16arith-acc2.c
index bbd99a3..8317531 100644
--- a/src/f16-dwconv/gen/up8x25-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up8x25-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up8x25-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up8x25-minmax-neonfp16arith.c
index cba0a8a..3070cf2 100644
--- a/src/f16-dwconv/gen/up8x25-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up8x25-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up8x4-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up8x4-minmax-neonfp16arith-acc2.c
index 6754187..37bcfe8 100644
--- a/src/f16-dwconv/gen/up8x4-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up8x4-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up8x4-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up8x4-minmax-neonfp16arith.c
index 6b6838e..8516ef2 100644
--- a/src/f16-dwconv/gen/up8x4-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up8x4-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up8x9-minmax-neonfp16arith-acc2.c b/src/f16-dwconv/gen/up8x9-minmax-neonfp16arith-acc2.c
index 0c4fdc3..929c730 100644
--- a/src/f16-dwconv/gen/up8x9-minmax-neonfp16arith-acc2.c
+++ b/src/f16-dwconv/gen/up8x9-minmax-neonfp16arith-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/gen/up8x9-minmax-neonfp16arith.c b/src/f16-dwconv/gen/up8x9-minmax-neonfp16arith.c
index 49b591b..13fc9d8 100644
--- a/src/f16-dwconv/gen/up8x9-minmax-neonfp16arith.c
+++ b/src/f16-dwconv/gen/up8x9-minmax-neonfp16arith.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-dwconv/up-neonfp16arith.c.in b/src/f16-dwconv/up-neonfp16arith.c.in
index 458c9d3..31b47a4 100644
--- a/src/f16-dwconv/up-neonfp16arith.c.in
+++ b/src/f16-dwconv/up-neonfp16arith.c.in
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const void* zero,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f16-f32-vcvt/f16c.c.in b/src/f16-f32-vcvt/f16c.c.in
index ede8b68..88994f4 100644
--- a/src/f16-f32-vcvt/f16c.c.in
+++ b/src/f16-f32-vcvt/f16c.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-avx-int16-x16.c b/src/f16-f32-vcvt/gen/vcvt-avx-int16-x16.c
index e44ef71..4d03a33 100644
--- a/src/f16-f32-vcvt/gen/vcvt-avx-int16-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-avx-int16-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-avx-int16-x24.c b/src/f16-f32-vcvt/gen/vcvt-avx-int16-x24.c
index b1b22b3..916f178 100644
--- a/src/f16-f32-vcvt/gen/vcvt-avx-int16-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-avx-int16-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-avx-int16-x32.c b/src/f16-f32-vcvt/gen/vcvt-avx-int16-x32.c
index b010903..2467081 100644
--- a/src/f16-f32-vcvt/gen/vcvt-avx-int16-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-avx-int16-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-avx-int16-x8.c b/src/f16-f32-vcvt/gen/vcvt-avx-int16-x8.c
index f3eebef..ef32952 100644
--- a/src/f16-f32-vcvt/gen/vcvt-avx-int16-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-avx-int16-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-avx-int32-x16.c b/src/f16-f32-vcvt/gen/vcvt-avx-int32-x16.c
index 2702237..e5010f9 100644
--- a/src/f16-f32-vcvt/gen/vcvt-avx-int32-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-avx-int32-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-avx-int32-x24.c b/src/f16-f32-vcvt/gen/vcvt-avx-int32-x24.c
index c750945..b02ac24 100644
--- a/src/f16-f32-vcvt/gen/vcvt-avx-int32-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-avx-int32-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-avx-int32-x32.c b/src/f16-f32-vcvt/gen/vcvt-avx-int32-x32.c
index 742bfbe..560fcbd 100644
--- a/src/f16-f32-vcvt/gen/vcvt-avx-int32-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-avx-int32-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-avx-int32-x8.c b/src/f16-f32-vcvt/gen/vcvt-avx-int32-x8.c
index 54bde0c..81555ca 100644
--- a/src/f16-f32-vcvt/gen/vcvt-avx-int32-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-avx-int32-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-f16c-x16.c b/src/f16-f32-vcvt/gen/vcvt-f16c-x16.c
index 8b78d9b..caf67e6 100644
--- a/src/f16-f32-vcvt/gen/vcvt-f16c-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-f16c-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-f16c-x8.c b/src/f16-f32-vcvt/gen/vcvt-f16c-x8.c
index 02e3595..fd369e6 100644
--- a/src/f16-f32-vcvt/gen/vcvt-f16c-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-f16c-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neon-int16-x16.c b/src/f16-f32-vcvt/gen/vcvt-neon-int16-x16.c
index dd97e0f..aeb0a2b 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neon-int16-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neon-int16-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neon-int16-x24.c b/src/f16-f32-vcvt/gen/vcvt-neon-int16-x24.c
index 3c4d6ed..cde738b 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neon-int16-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neon-int16-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neon-int16-x32.c b/src/f16-f32-vcvt/gen/vcvt-neon-int16-x32.c
index 286efca..082b658 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neon-int16-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neon-int16-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neon-int16-x8.c b/src/f16-f32-vcvt/gen/vcvt-neon-int16-x8.c
index 0e6e71c..2a5f239 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neon-int16-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neon-int16-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neon-int32-x16.c b/src/f16-f32-vcvt/gen/vcvt-neon-int32-x16.c
index 49ba906..5e371cc 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neon-int32-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neon-int32-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neon-int32-x24.c b/src/f16-f32-vcvt/gen/vcvt-neon-int32-x24.c
index 1086a22..3db3386 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neon-int32-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neon-int32-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neon-int32-x32.c b/src/f16-f32-vcvt/gen/vcvt-neon-int32-x32.c
index d6e0d30..6247615 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neon-int32-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neon-int32-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neon-int32-x8.c b/src/f16-f32-vcvt/gen/vcvt-neon-int32-x8.c
index 279cdf1..618aa30 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neon-int32-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neon-int32-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neonfp16-x16.c b/src/f16-f32-vcvt/gen/vcvt-neonfp16-x16.c
index 6e99a2c..098fe43 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neonfp16-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neonfp16-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-neonfp16-x8.c b/src/f16-f32-vcvt/gen/vcvt-neonfp16-x8.c
index d3bc778..1ad86b4 100644
--- a/src/f16-f32-vcvt/gen/vcvt-neonfp16-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-neonfp16-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x16.c b/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x16.c
index 8a6c8f7..761f937 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x24.c b/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x24.c
index 5858d87..0f757e0 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x32.c b/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x32.c
index 282c1f0..f331419 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x8.c b/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x8.c
index f529e4d..8c3852d 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse2-int16-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x16.c b/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x16.c
index 1dbd12e..1829598 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x24.c b/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x24.c
index 9cd0cb4..2986b1c 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x32.c b/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x32.c
index 7b35abc..0ddf55c 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x8.c b/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x8.c
index 9f0b63d..1247042 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse2-int32-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x16.c b/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x16.c
index 5158500..d9cadd4 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x24.c b/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x24.c
index 0b4d325..28b083e 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x32.c b/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x32.c
index 825b03c..106468a 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x8.c b/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x8.c
index 7b4eb89..9a78c0b 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse41-int16-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x16.c b/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x16.c
index 06d6d17..a7ca720 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x24.c b/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x24.c
index 171a493..3e30a9b 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x32.c b/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x32.c
index 78f17af..4c71faf 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x8.c b/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x8.c
index fd0504e..41b56a2 100644
--- a/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-sse41-int32-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x16.c b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x16.c
index be4442b..6b4dd98 100644
--- a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x24.c b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x24.c
index af31d79..dc7cacb 100644
--- a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x32.c b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x32.c
index 1b33ea2..096a4a5 100644
--- a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x8.c b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x8.c
index 9c9aaf8..de88e8a 100644
--- a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int16-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x16.c b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x16.c
index db83aed..a9b0ea2 100644
--- a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x16.c
+++ b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x24.c b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x24.c
index 107fb9e..93a3219 100644
--- a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x24.c
+++ b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x32.c b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x32.c
index 86f5646..8fea782 100644
--- a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x32.c
+++ b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x8.c b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x8.c
index bcb6bac..7ffbb9e 100644
--- a/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x8.c
+++ b/src/f16-f32-vcvt/gen/vcvt-wasmsimd-int32-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/neon-int16.c.in b/src/f16-f32-vcvt/neon-int16.c.in
index 9c745a7..ec0089e 100644
--- a/src/f16-f32-vcvt/neon-int16.c.in
+++ b/src/f16-f32-vcvt/neon-int16.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/neon-int32.c.in b/src/f16-f32-vcvt/neon-int32.c.in
index b776e38..bedecce 100644
--- a/src/f16-f32-vcvt/neon-int32.c.in
+++ b/src/f16-f32-vcvt/neon-int32.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/neonfp16.c.in b/src/f16-f32-vcvt/neonfp16.c.in
index 84f04e7..3987d00 100644
--- a/src/f16-f32-vcvt/neonfp16.c.in
+++ b/src/f16-f32-vcvt/neonfp16.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/sse-int16.c.in b/src/f16-f32-vcvt/sse-int16.c.in
index 31e13a5..dd663bd 100644
--- a/src/f16-f32-vcvt/sse-int16.c.in
+++ b/src/f16-f32-vcvt/sse-int16.c.in
@@ -23,7 +23,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/sse-int32.c.in b/src/f16-f32-vcvt/sse-int32.c.in
index d0d4e4d..0935003 100644
--- a/src/f16-f32-vcvt/sse-int32.c.in
+++ b/src/f16-f32-vcvt/sse-int32.c.in
@@ -23,7 +23,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/wasmsimd-int16.c.in b/src/f16-f32-vcvt/wasmsimd-int16.c.in
index 4661706..65e73e4 100644
--- a/src/f16-f32-vcvt/wasmsimd-int16.c.in
+++ b/src/f16-f32-vcvt/wasmsimd-int16.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-f32-vcvt/wasmsimd-int32.c.in b/src/f16-f32-vcvt/wasmsimd-int32.c.in
index 5ac5361..ca44d53 100644
--- a/src/f16-f32-vcvt/wasmsimd-int32.c.in
+++ b/src/f16-f32-vcvt/wasmsimd-int32.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const void* input,
     float* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint16_t) == 0);
diff --git a/src/f16-gavgpool/7p7x-minmax-neonfp16arith-c8.c b/src/f16-gavgpool/7p7x-minmax-neonfp16arith-c8.c
index c50a1a5..5cebacf 100644
--- a/src/f16-gavgpool/7p7x-minmax-neonfp16arith-c8.c
+++ b/src/f16-gavgpool/7p7x-minmax-neonfp16arith-c8.c
@@ -19,7 +19,7 @@
     const void* zero,
     void* buffer,
     void* output_ptr,
-    const struct xnn_f16_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/f16-gavgpool/7x-minmax-neonfp16arith-c8.c b/src/f16-gavgpool/7x-minmax-neonfp16arith-c8.c
index 352cd15..89340b8 100644
--- a/src/f16-gavgpool/7x-minmax-neonfp16arith-c8.c
+++ b/src/f16-gavgpool/7x-minmax-neonfp16arith-c8.c
@@ -17,7 +17,7 @@
     size_t input_stride,
     const void* zero,
     void* output_ptr,
-    const struct xnn_f16_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/f16-prelu/gen/neonfp16arith-2x16.c b/src/f16-prelu/gen/neonfp16arith-2x16.c
index c39ec10..243c0b3 100644
--- a/src/f16-prelu/gen/neonfp16arith-2x16.c
+++ b/src/f16-prelu/gen/neonfp16arith-2x16.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const void* restrict weights,
     void* restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f16-prelu/gen/neonfp16arith-2x8.c b/src/f16-prelu/gen/neonfp16arith-2x8.c
index f4144ec..a20e3a3 100644
--- a/src/f16-prelu/gen/neonfp16arith-2x8.c
+++ b/src/f16-prelu/gen/neonfp16arith-2x8.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const void* restrict weights,
     void* restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f16-prelu/neonfp16arith.c.in b/src/f16-prelu/neonfp16arith.c.in
index 659b2e8..7ea78a4 100644
--- a/src/f16-prelu/neonfp16arith.c.in
+++ b/src/f16-prelu/neonfp16arith.c.in
@@ -22,7 +22,7 @@
     size_t input_stride,
     const void* restrict weights,
     void* restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f16-vbinary/gen/vadd-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vadd-minmax-neonfp16arith-x16.c
index 51d1f6f..6b71a47 100644
--- a/src/f16-vbinary/gen/vadd-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vadd-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vadd-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vadd-minmax-neonfp16arith-x8.c
index 4974616..4aa0fb2 100644
--- a/src/f16-vbinary/gen/vadd-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vadd-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vaddc-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vaddc-minmax-neonfp16arith-x16.c
index e492e38..7bc7bae 100644
--- a/src/f16-vbinary/gen/vaddc-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vaddc-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vaddc-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vaddc-minmax-neonfp16arith-x8.c
index b90e4a2..fe38687 100644
--- a/src/f16-vbinary/gen/vaddc-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vaddc-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vdiv-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vdiv-minmax-neonfp16arith-x16.c
index e1a71e1..36ee1aa 100644
--- a/src/f16-vbinary/gen/vdiv-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vdiv-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vdiv-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vdiv-minmax-neonfp16arith-x8.c
index dec8c7d..242bb7c 100644
--- a/src/f16-vbinary/gen/vdiv-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vdiv-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vdivc-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vdivc-minmax-neonfp16arith-x16.c
index 08606c0..e250f74 100644
--- a/src/f16-vbinary/gen/vdivc-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vdivc-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vdivc-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vdivc-minmax-neonfp16arith-x8.c
index 807dacd..4cf125b 100644
--- a/src/f16-vbinary/gen/vdivc-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vdivc-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vmax-neonfp16arith-x16.c
index 56a5378..2ed0f6f 100644
--- a/src/f16-vbinary/gen/vmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vmax-neonfp16arith-x8.c
index 052a3e2..205cefe 100644
--- a/src/f16-vbinary/gen/vmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmaxc-neonfp16arith-x16.c b/src/f16-vbinary/gen/vmaxc-neonfp16arith-x16.c
index 4f378d8..32768ae 100644
--- a/src/f16-vbinary/gen/vmaxc-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vmaxc-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmaxc-neonfp16arith-x8.c b/src/f16-vbinary/gen/vmaxc-neonfp16arith-x8.c
index 3696e8b..f8a2016 100644
--- a/src/f16-vbinary/gen/vmaxc-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vmaxc-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmin-neonfp16arith-x16.c b/src/f16-vbinary/gen/vmin-neonfp16arith-x16.c
index bd19c6b..e1457e5 100644
--- a/src/f16-vbinary/gen/vmin-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vmin-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmin-neonfp16arith-x8.c b/src/f16-vbinary/gen/vmin-neonfp16arith-x8.c
index e378885..357b98f 100644
--- a/src/f16-vbinary/gen/vmin-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vmin-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vminc-neonfp16arith-x16.c b/src/f16-vbinary/gen/vminc-neonfp16arith-x16.c
index 8e5aa39..8700031 100644
--- a/src/f16-vbinary/gen/vminc-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vminc-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vminc-neonfp16arith-x8.c b/src/f16-vbinary/gen/vminc-neonfp16arith-x8.c
index f2fa001..6f0cbbd 100644
--- a/src/f16-vbinary/gen/vminc-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vminc-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmul-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vmul-minmax-neonfp16arith-x16.c
index 38bfc6f..374aec6 100644
--- a/src/f16-vbinary/gen/vmul-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vmul-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmul-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vmul-minmax-neonfp16arith-x8.c
index b857c3e..b2a2220 100644
--- a/src/f16-vbinary/gen/vmul-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vmul-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmulc-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vmulc-minmax-neonfp16arith-x16.c
index 44ab026..a20c8ea 100644
--- a/src/f16-vbinary/gen/vmulc-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vmulc-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vmulc-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vmulc-minmax-neonfp16arith-x8.c
index 90848ea..156d2d0 100644
--- a/src/f16-vbinary/gen/vmulc-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vmulc-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vrdivc-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vrdivc-minmax-neonfp16arith-x16.c
index 5034c2b..f9f639b 100644
--- a/src/f16-vbinary/gen/vrdivc-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vrdivc-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vrdivc-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vrdivc-minmax-neonfp16arith-x8.c
index 85be5eb..d06dd3a 100644
--- a/src/f16-vbinary/gen/vrdivc-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vrdivc-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vrsubc-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vrsubc-minmax-neonfp16arith-x16.c
index 4f6b0ec..48cbd85 100644
--- a/src/f16-vbinary/gen/vrsubc-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vrsubc-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vrsubc-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vrsubc-minmax-neonfp16arith-x8.c
index d696724..84cc528 100644
--- a/src/f16-vbinary/gen/vrsubc-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vrsubc-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vsqrdiff-neonfp16arith-x16.c b/src/f16-vbinary/gen/vsqrdiff-neonfp16arith-x16.c
index 3822170..c0f782a 100644
--- a/src/f16-vbinary/gen/vsqrdiff-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vsqrdiff-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vsqrdiff-neonfp16arith-x8.c b/src/f16-vbinary/gen/vsqrdiff-neonfp16arith-x8.c
index 3d5701c..75778a7 100644
--- a/src/f16-vbinary/gen/vsqrdiff-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vsqrdiff-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vsqrdiffc-neonfp16arith-x16.c b/src/f16-vbinary/gen/vsqrdiffc-neonfp16arith-x16.c
index a8c32b0..6abae6b 100644
--- a/src/f16-vbinary/gen/vsqrdiffc-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vsqrdiffc-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vsqrdiffc-neonfp16arith-x8.c b/src/f16-vbinary/gen/vsqrdiffc-neonfp16arith-x8.c
index 63888b1..b545b8d 100644
--- a/src/f16-vbinary/gen/vsqrdiffc-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vsqrdiffc-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vsub-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vsub-minmax-neonfp16arith-x16.c
index 380c14b..8020182 100644
--- a/src/f16-vbinary/gen/vsub-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vsub-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vsub-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vsub-minmax-neonfp16arith-x8.c
index 529fc5c..220cd69 100644
--- a/src/f16-vbinary/gen/vsub-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vsub-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vsubc-minmax-neonfp16arith-x16.c b/src/f16-vbinary/gen/vsubc-minmax-neonfp16arith-x16.c
index 89bd930..ba00561 100644
--- a/src/f16-vbinary/gen/vsubc-minmax-neonfp16arith-x16.c
+++ b/src/f16-vbinary/gen/vsubc-minmax-neonfp16arith-x16.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/gen/vsubc-minmax-neonfp16arith-x8.c b/src/f16-vbinary/gen/vsubc-minmax-neonfp16arith-x8.c
index 13aeebc..7246984 100644
--- a/src/f16-vbinary/gen/vsubc-minmax-neonfp16arith-x8.c
+++ b/src/f16-vbinary/gen/vsubc-minmax-neonfp16arith-x8.c
@@ -20,7 +20,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/vop-neonfp16arith.c.in b/src/f16-vbinary/vop-neonfp16arith.c.in
index 78921af..e3978b9 100644
--- a/src/f16-vbinary/vop-neonfp16arith.c.in
+++ b/src/f16-vbinary/vop-neonfp16arith.c.in
@@ -32,7 +32,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vbinary/vopc-neonfp16arith.c.in b/src/f16-vbinary/vopc-neonfp16arith.c.in
index db80dfa..6fd7daf 100644
--- a/src/f16-vbinary/vopc-neonfp16arith.c.in
+++ b/src/f16-vbinary/vopc-neonfp16arith.c.in
@@ -34,7 +34,7 @@
     const void* restrict a_ptr,
     const void* restrict b_ptr,
     void* restrict y_ptr,
-    const struct ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vclamp/gen/vclamp-neonfp16arith-x16.c b/src/f16-vclamp/gen/vclamp-neonfp16arith-x16.c
index 3d54263..984e423 100644
--- a/src/f16-vclamp/gen/vclamp-neonfp16arith-x16.c
+++ b/src/f16-vclamp/gen/vclamp-neonfp16arith-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vclamp/gen/vclamp-neonfp16arith-x8.c b/src/f16-vclamp/gen/vclamp-neonfp16arith-x8.c
index b78288d..9926b78 100644
--- a/src/f16-vclamp/gen/vclamp-neonfp16arith-x8.c
+++ b/src/f16-vclamp/gen/vclamp-neonfp16arith-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vclamp/neonfp16arith.c.in b/src/f16-vclamp/neonfp16arith.c.in
index 0f6ade4..1f76f25 100644
--- a/src/f16-vclamp/neonfp16arith.c.in
+++ b/src/f16-vclamp/neonfp16arith.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vhswish/gen/vhswish-neonfp16arith-x16.c b/src/f16-vhswish/gen/vhswish-neonfp16arith-x16.c
index 2a8c822..023cfc3 100644
--- a/src/f16-vhswish/gen/vhswish-neonfp16arith-x16.c
+++ b/src/f16-vhswish/gen/vhswish-neonfp16arith-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vhswish/gen/vhswish-neonfp16arith-x8.c b/src/f16-vhswish/gen/vhswish-neonfp16arith-x8.c
index a24f025..e091b04 100644
--- a/src/f16-vhswish/gen/vhswish-neonfp16arith-x8.c
+++ b/src/f16-vhswish/gen/vhswish-neonfp16arith-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vhswish/neonfp16arith.c.in b/src/f16-vhswish/neonfp16arith.c.in
index 3691ec8..9f3e2a3 100644
--- a/src/f16-vhswish/neonfp16arith.c.in
+++ b/src/f16-vhswish/neonfp16arith.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vmulcaddc/gen/c16-minmax-neonfp16arith-2x.c b/src/f16-vmulcaddc/gen/c16-minmax-neonfp16arith-2x.c
index 0fd0630..58c73a4 100644
--- a/src/f16-vmulcaddc/gen/c16-minmax-neonfp16arith-2x.c
+++ b/src/f16-vmulcaddc/gen/c16-minmax-neonfp16arith-2x.c
@@ -23,7 +23,7 @@
     const void*restrict weights,
     void*restrict output,
     size_t output_stride,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f16-vmulcaddc/gen/c8-minmax-neonfp16arith-2x.c b/src/f16-vmulcaddc/gen/c8-minmax-neonfp16arith-2x.c
index ac2fe98..5fb307a 100644
--- a/src/f16-vmulcaddc/gen/c8-minmax-neonfp16arith-2x.c
+++ b/src/f16-vmulcaddc/gen/c8-minmax-neonfp16arith-2x.c
@@ -23,7 +23,7 @@
     const void*restrict weights,
     void*restrict output,
     size_t output_stride,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f16-vmulcaddc/neonfp16arith.c.in b/src/f16-vmulcaddc/neonfp16arith.c.in
index c2988ce..976f7b9 100644
--- a/src/f16-vmulcaddc/neonfp16arith.c.in
+++ b/src/f16-vmulcaddc/neonfp16arith.c.in
@@ -23,7 +23,7 @@
     const void*restrict weights,
     void*restrict output,
     size_t output_stride,
-    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f16-vrelu/gen/vrelu-neonfp16arith-x16.c b/src/f16-vrelu/gen/vrelu-neonfp16arith-x16.c
index 53dc4ef..db46070 100644
--- a/src/f16-vrelu/gen/vrelu-neonfp16arith-x16.c
+++ b/src/f16-vrelu/gen/vrelu-neonfp16arith-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vrelu/gen/vrelu-neonfp16arith-x8.c b/src/f16-vrelu/gen/vrelu-neonfp16arith-x8.c
index 1798ca3..9b3613c 100644
--- a/src/f16-vrelu/gen/vrelu-neonfp16arith-x8.c
+++ b/src/f16-vrelu/gen/vrelu-neonfp16arith-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f16-vrelu/neonfp16arith.c.in b/src/f16-vrelu/neonfp16arith.c.in
index b6b1585..64ac804 100644
--- a/src/f16-vrelu/neonfp16arith.c.in
+++ b/src/f16-vrelu/neonfp16arith.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const void* restrict x_ptr,
     void* restrict y_ptr,
-    const struct xnn_f16_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const struct xnn_f16_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(__fp16) == 0);
diff --git a/src/f32-argmaxpool/4x-neon-c4.c b/src/f32-argmaxpool/4x-neon-c4.c
index d74d94c..056f5d4 100644
--- a/src/f32-argmaxpool/4x-neon-c4.c
+++ b/src/f32-argmaxpool/4x-neon-c4.c
@@ -19,7 +19,7 @@
     float* output,
     uint32_t* index,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-argmaxpool/4x-sse2-c4.c b/src/f32-argmaxpool/4x-sse2-c4.c
index a4486ef..bdcc1cb 100644
--- a/src/f32-argmaxpool/4x-sse2-c4.c
+++ b/src/f32-argmaxpool/4x-sse2-c4.c
@@ -19,7 +19,7 @@
     float* output,
     uint32_t* index,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-argmaxpool/4x-wasmsimd-c4.c b/src/f32-argmaxpool/4x-wasmsimd-c4.c
index 9a4003f..7031d1b 100644
--- a/src/f32-argmaxpool/4x-wasmsimd-c4.c
+++ b/src/f32-argmaxpool/4x-wasmsimd-c4.c
@@ -19,7 +19,7 @@
     float* output,
     uint32_t* index_ptr,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-argmaxpool/9p8x-neon-c4.c b/src/f32-argmaxpool/9p8x-neon-c4.c
index 7cf1ff1..1b178cd 100644
--- a/src/f32-argmaxpool/9p8x-neon-c4.c
+++ b/src/f32-argmaxpool/9p8x-neon-c4.c
@@ -21,7 +21,7 @@
     float* output,
     uint32_t* index,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-argmaxpool/9p8x-sse2-c4.c b/src/f32-argmaxpool/9p8x-sse2-c4.c
index bcd7f2e..a88f782 100644
--- a/src/f32-argmaxpool/9p8x-sse2-c4.c
+++ b/src/f32-argmaxpool/9p8x-sse2-c4.c
@@ -21,7 +21,7 @@
     float* output,
     uint32_t* index,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-argmaxpool/9p8x-wasmsimd-c4.c b/src/f32-argmaxpool/9p8x-wasmsimd-c4.c
index 3d5864c..7e70dfa 100644
--- a/src/f32-argmaxpool/9p8x-wasmsimd-c4.c
+++ b/src/f32-argmaxpool/9p8x-wasmsimd-c4.c
@@ -21,7 +21,7 @@
     float* output,
     uint32_t* index,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-argmaxpool/9x-neon-c4.c b/src/f32-argmaxpool/9x-neon-c4.c
index ec3f263..a85b9f7 100644
--- a/src/f32-argmaxpool/9x-neon-c4.c
+++ b/src/f32-argmaxpool/9x-neon-c4.c
@@ -19,7 +19,7 @@
     float* output,
     uint32_t* index,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-argmaxpool/9x-sse2-c4.c b/src/f32-argmaxpool/9x-sse2-c4.c
index 660863c..6cf3d1f 100644
--- a/src/f32-argmaxpool/9x-sse2-c4.c
+++ b/src/f32-argmaxpool/9x-sse2-c4.c
@@ -19,7 +19,7 @@
     float* output,
     uint32_t* index,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-argmaxpool/9x-wasmsimd-c4.c b/src/f32-argmaxpool/9x-wasmsimd-c4.c
index 8c7dacf..30bfc61 100644
--- a/src/f32-argmaxpool/9x-wasmsimd-c4.c
+++ b/src/f32-argmaxpool/9x-wasmsimd-c4.c
@@ -19,7 +19,7 @@
     float* output,
     uint32_t* index_ptr,
     size_t input_increment,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(pooling_elements != 0);
diff --git a/src/f32-avgpool/9p8x-minmax-neon-c4.c b/src/f32-avgpool/9p8x-minmax-neon-c4.c
index aeba47d..438cb45 100644
--- a/src/f32-avgpool/9p8x-minmax-neon-c4.c
+++ b/src/f32-avgpool/9p8x-minmax-neon-c4.c
@@ -21,7 +21,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/f32-avgpool/9p8x-minmax-sse-c4.c b/src/f32-avgpool/9p8x-minmax-sse-c4.c
index e971599..aa1a007 100644
--- a/src/f32-avgpool/9p8x-minmax-sse-c4.c
+++ b/src/f32-avgpool/9p8x-minmax-sse-c4.c
@@ -21,7 +21,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/f32-avgpool/9p8x-minmax-wasmsimd-arm-c4.c b/src/f32-avgpool/9p8x-minmax-wasmsimd-arm-c4.c
index 51f0f26..174e515 100644
--- a/src/f32-avgpool/9p8x-minmax-wasmsimd-arm-c4.c
+++ b/src/f32-avgpool/9p8x-minmax-wasmsimd-arm-c4.c
@@ -21,7 +21,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/f32-avgpool/9p8x-minmax-wasmsimd-x86-c4.c b/src/f32-avgpool/9p8x-minmax-wasmsimd-x86-c4.c
index b2ca90c..4173337 100644
--- a/src/f32-avgpool/9p8x-minmax-wasmsimd-x86-c4.c
+++ b/src/f32-avgpool/9p8x-minmax-wasmsimd-x86-c4.c
@@ -21,7 +21,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/f32-avgpool/9x-minmax-neon-c4.c b/src/f32-avgpool/9x-minmax-neon-c4.c
index 87aea8d..b16223d 100644
--- a/src/f32-avgpool/9x-minmax-neon-c4.c
+++ b/src/f32-avgpool/9x-minmax-neon-c4.c
@@ -20,7 +20,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-avgpool/9x-minmax-sse-c4.c b/src/f32-avgpool/9x-minmax-sse-c4.c
index 39fb76a..ee5aa65 100644
--- a/src/f32-avgpool/9x-minmax-sse-c4.c
+++ b/src/f32-avgpool/9x-minmax-sse-c4.c
@@ -20,7 +20,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-avgpool/9x-minmax-wasmsimd-arm-c4.c b/src/f32-avgpool/9x-minmax-wasmsimd-arm-c4.c
index 7450a4e..eb0a7e7 100644
--- a/src/f32-avgpool/9x-minmax-wasmsimd-arm-c4.c
+++ b/src/f32-avgpool/9x-minmax-wasmsimd-arm-c4.c
@@ -20,7 +20,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-avgpool/9x-minmax-wasmsimd-x86-c4.c b/src/f32-avgpool/9x-minmax-wasmsimd-x86-c4.c
index 31ac9e1..bc0f22d 100644
--- a/src/f32-avgpool/9x-minmax-wasmsimd-x86-c4.c
+++ b/src/f32-avgpool/9x-minmax-wasmsimd-x86-c4.c
@@ -20,7 +20,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-conv-hwc/3x3s2p0p1c3-neon-x1.c.in b/src/f32-conv-hwc/3x3s2p0p1c3-neon-x1.c.in
index 3f18491..eb1906a 100644
--- a/src/f32-conv-hwc/3x3s2p0p1c3-neon-x1.c.in
+++ b/src/f32-conv-hwc/3x3s2p0p1c3-neon-x1.c.in
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/3x3s2p0p1c3-neon-x2.c.in b/src/f32-conv-hwc/3x3s2p0p1c3-neon-x2.c.in
index 77040e7..36e0e25 100644
--- a/src/f32-conv-hwc/3x3s2p0p1c3-neon-x2.c.in
+++ b/src/f32-conv-hwc/3x3s2p0p1c3-neon-x2.c.in
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/3x3s2p1c3-neon-x1.c.in b/src/f32-conv-hwc/3x3s2p1c3-neon-x1.c.in
index 9766f70..74d7175 100644
--- a/src/f32-conv-hwc/3x3s2p1c3-neon-x1.c.in
+++ b/src/f32-conv-hwc/3x3s2p1c3-neon-x1.c.in
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/3x3s2p1c3-neon-x2.c.in b/src/f32-conv-hwc/3x3s2p1c3-neon-x2.c.in
index a322bf9..ba40cd6 100644
--- a/src/f32-conv-hwc/3x3s2p1c3-neon-x2.c.in
+++ b/src/f32-conv-hwc/3x3s2p1c3-neon-x2.c.in
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neon-2x1.c b/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neon-2x1.c
index 6c708d6..dedd857 100644
--- a/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neon-2x1.c
+++ b/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neon-2x1.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neon-2x2.c b/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neon-2x2.c
index 06ddb9f..5eee738 100644
--- a/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neon-2x2.c
+++ b/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neon-2x2.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neonfma-2x1.c b/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neonfma-2x1.c
index f239154..0ee5925 100644
--- a/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neonfma-2x1.c
+++ b/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neonfma-2x1.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neonfma-2x2.c b/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neonfma-2x2.c
index 867db42..d81d08d 100644
--- a/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neonfma-2x2.c
+++ b/src/f32-conv-hwc/gen/3x3s2p0p1c3x4-neonfma-2x2.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neon-2x1.c b/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neon-2x1.c
index 6ca8504..8f022c5 100644
--- a/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neon-2x1.c
+++ b/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neon-2x1.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neon-2x2.c b/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neon-2x2.c
index 4850206..4ea1b05 100644
--- a/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neon-2x2.c
+++ b/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neon-2x2.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neonfma-2x1.c b/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neonfma-2x1.c
index 617c95a..cb75ae5 100644
--- a/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neonfma-2x1.c
+++ b/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neonfma-2x1.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neonfma-2x2.c b/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neonfma-2x2.c
index a51ffff..5a7264c 100644
--- a/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neonfma-2x2.c
+++ b/src/f32-conv-hwc/gen/3x3s2p0p1c3x8-neonfma-2x2.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p1c3x4-neon-2x1.c b/src/f32-conv-hwc/gen/3x3s2p1c3x4-neon-2x1.c
index 2221e5f..27c9e5d 100644
--- a/src/f32-conv-hwc/gen/3x3s2p1c3x4-neon-2x1.c
+++ b/src/f32-conv-hwc/gen/3x3s2p1c3x4-neon-2x1.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p1c3x4-neon-2x2.c b/src/f32-conv-hwc/gen/3x3s2p1c3x4-neon-2x2.c
index c5a15d6..947d515 100644
--- a/src/f32-conv-hwc/gen/3x3s2p1c3x4-neon-2x2.c
+++ b/src/f32-conv-hwc/gen/3x3s2p1c3x4-neon-2x2.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p1c3x4-neonfma-2x1.c b/src/f32-conv-hwc/gen/3x3s2p1c3x4-neonfma-2x1.c
index 7222273..d134791 100644
--- a/src/f32-conv-hwc/gen/3x3s2p1c3x4-neonfma-2x1.c
+++ b/src/f32-conv-hwc/gen/3x3s2p1c3x4-neonfma-2x1.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p1c3x4-neonfma-2x2.c b/src/f32-conv-hwc/gen/3x3s2p1c3x4-neonfma-2x2.c
index 91c1318..acdf4ce 100644
--- a/src/f32-conv-hwc/gen/3x3s2p1c3x4-neonfma-2x2.c
+++ b/src/f32-conv-hwc/gen/3x3s2p1c3x4-neonfma-2x2.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p1c3x8-neon-2x1.c b/src/f32-conv-hwc/gen/3x3s2p1c3x8-neon-2x1.c
index afa9223..900da52 100644
--- a/src/f32-conv-hwc/gen/3x3s2p1c3x8-neon-2x1.c
+++ b/src/f32-conv-hwc/gen/3x3s2p1c3x8-neon-2x1.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p1c3x8-neon-2x2.c b/src/f32-conv-hwc/gen/3x3s2p1c3x8-neon-2x2.c
index e9f108b..b4a5606 100644
--- a/src/f32-conv-hwc/gen/3x3s2p1c3x8-neon-2x2.c
+++ b/src/f32-conv-hwc/gen/3x3s2p1c3x8-neon-2x2.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p1c3x8-neonfma-2x1.c b/src/f32-conv-hwc/gen/3x3s2p1c3x8-neonfma-2x1.c
index bdd05e2..4a9b615 100644
--- a/src/f32-conv-hwc/gen/3x3s2p1c3x8-neonfma-2x1.c
+++ b/src/f32-conv-hwc/gen/3x3s2p1c3x8-neonfma-2x1.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc/gen/3x3s2p1c3x8-neonfma-2x2.c b/src/f32-conv-hwc/gen/3x3s2p1c3x8-neonfma-2x2.c
index d91e596..e5507f0 100644
--- a/src/f32-conv-hwc/gen/3x3s2p1c3x8-neonfma-2x2.c
+++ b/src/f32-conv-hwc/gen/3x3s2p1c3x8-neonfma-2x2.c
@@ -29,7 +29,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_width_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc2chw/3x3s2p1c3x4-neon-2x2.c b/src/f32-conv-hwc2chw/3x3s2p1c3x4-neon-2x2.c
index ab8684d..77d596a 100644
--- a/src/f32-conv-hwc2chw/3x3s2p1c3x4-neon-2x2.c
+++ b/src/f32-conv-hwc2chw/3x3s2p1c3x4-neon-2x2.c
@@ -24,7 +24,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_channel_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc2chw/3x3s2p1c3x4-neonfma-2x2.c b/src/f32-conv-hwc2chw/3x3s2p1c3x4-neonfma-2x2.c
index 50961ab..b21d2c3 100644
--- a/src/f32-conv-hwc2chw/3x3s2p1c3x4-neonfma-2x2.c
+++ b/src/f32-conv-hwc2chw/3x3s2p1c3x4-neonfma-2x2.c
@@ -24,7 +24,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_channel_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc2chw/3x3s2p1c3x4-sse-1x1.c b/src/f32-conv-hwc2chw/3x3s2p1c3x4-sse-1x1.c
index 12843f9..9c0a317 100644
--- a/src/f32-conv-hwc2chw/3x3s2p1c3x4-sse-1x1.c
+++ b/src/f32-conv-hwc2chw/3x3s2p1c3x4-sse-1x1.c
@@ -24,7 +24,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_channel_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc2chw/3x3s2p1c3x4-sse-2x2.c b/src/f32-conv-hwc2chw/3x3s2p1c3x4-sse-2x2.c
index 7b7aaf2..c2c8ad1 100644
--- a/src/f32-conv-hwc2chw/3x3s2p1c3x4-sse-2x2.c
+++ b/src/f32-conv-hwc2chw/3x3s2p1c3x4-sse-2x2.c
@@ -24,7 +24,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_channel_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-conv-hwc2chw/3x3s2p1c3x4-wasmsimd-2x2.c b/src/f32-conv-hwc2chw/3x3s2p1c3x4-wasmsimd-2x2.c
index 27c593f..a9ed910 100644
--- a/src/f32-conv-hwc2chw/3x3s2p1c3x4-wasmsimd-2x2.c
+++ b/src/f32-conv-hwc2chw/3x3s2p1c3x4-wasmsimd-2x2.c
@@ -24,7 +24,7 @@
     size_t output_channels,
     size_t output_height_stride,
     size_t output_channel_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_width != 0);
   assert(output_y_end > output_y_start);
diff --git a/src/f32-dwconv/gen/up16x25-minmax-avx-acc2.c b/src/f32-dwconv/gen/up16x25-minmax-avx-acc2.c
index efed2a0..f156b76 100644
--- a/src/f32-dwconv/gen/up16x25-minmax-avx-acc2.c
+++ b/src/f32-dwconv/gen/up16x25-minmax-avx-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x25-minmax-avx.c b/src/f32-dwconv/gen/up16x25-minmax-avx.c
index c695cc4..d823048 100644
--- a/src/f32-dwconv/gen/up16x25-minmax-avx.c
+++ b/src/f32-dwconv/gen/up16x25-minmax-avx.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x25-minmax-fma3-acc2.c b/src/f32-dwconv/gen/up16x25-minmax-fma3-acc2.c
index 2e4a7d8..3b8754e 100644
--- a/src/f32-dwconv/gen/up16x25-minmax-fma3-acc2.c
+++ b/src/f32-dwconv/gen/up16x25-minmax-fma3-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x25-minmax-fma3.c b/src/f32-dwconv/gen/up16x25-minmax-fma3.c
index 853490a..acce6e5 100644
--- a/src/f32-dwconv/gen/up16x25-minmax-fma3.c
+++ b/src/f32-dwconv/gen/up16x25-minmax-fma3.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x25-minmax-neon-acc2.c b/src/f32-dwconv/gen/up16x25-minmax-neon-acc2.c
index a83383e..5dbae74 100644
--- a/src/f32-dwconv/gen/up16x25-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up16x25-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x25-minmax-neon.c b/src/f32-dwconv/gen/up16x25-minmax-neon.c
index aff8d2c..f4f02d7 100644
--- a/src/f32-dwconv/gen/up16x25-minmax-neon.c
+++ b/src/f32-dwconv/gen/up16x25-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x25-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up16x25-minmax-neonfma-acc2.c
index 437ea8e..e8dca64 100644
--- a/src/f32-dwconv/gen/up16x25-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up16x25-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x25-minmax-neonfma.c b/src/f32-dwconv/gen/up16x25-minmax-neonfma.c
index ca9f2ec..9b1392f 100644
--- a/src/f32-dwconv/gen/up16x25-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up16x25-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x3-minmax-avx-acc2.c b/src/f32-dwconv/gen/up16x3-minmax-avx-acc2.c
index dfba6ed..de5a76a 100644
--- a/src/f32-dwconv/gen/up16x3-minmax-avx-acc2.c
+++ b/src/f32-dwconv/gen/up16x3-minmax-avx-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x3-minmax-avx.c b/src/f32-dwconv/gen/up16x3-minmax-avx.c
index 1757a69..4511e98 100644
--- a/src/f32-dwconv/gen/up16x3-minmax-avx.c
+++ b/src/f32-dwconv/gen/up16x3-minmax-avx.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x3-minmax-fma3-acc2.c b/src/f32-dwconv/gen/up16x3-minmax-fma3-acc2.c
index dcb38ae..2821111 100644
--- a/src/f32-dwconv/gen/up16x3-minmax-fma3-acc2.c
+++ b/src/f32-dwconv/gen/up16x3-minmax-fma3-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x3-minmax-fma3.c b/src/f32-dwconv/gen/up16x3-minmax-fma3.c
index 61e391e..4bc0dcf 100644
--- a/src/f32-dwconv/gen/up16x3-minmax-fma3.c
+++ b/src/f32-dwconv/gen/up16x3-minmax-fma3.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x3-minmax-neon-acc2.c b/src/f32-dwconv/gen/up16x3-minmax-neon-acc2.c
index cee27d1..30667f6 100644
--- a/src/f32-dwconv/gen/up16x3-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up16x3-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x3-minmax-neon.c b/src/f32-dwconv/gen/up16x3-minmax-neon.c
index c85c824..a9a8b06 100644
--- a/src/f32-dwconv/gen/up16x3-minmax-neon.c
+++ b/src/f32-dwconv/gen/up16x3-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x3-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up16x3-minmax-neonfma-acc2.c
index 6734eab..c90b4d7 100644
--- a/src/f32-dwconv/gen/up16x3-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up16x3-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x3-minmax-neonfma.c b/src/f32-dwconv/gen/up16x3-minmax-neonfma.c
index ef91036..3573559 100644
--- a/src/f32-dwconv/gen/up16x3-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up16x3-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x4-minmax-avx-acc2.c b/src/f32-dwconv/gen/up16x4-minmax-avx-acc2.c
index 0582f4d..41ccad1 100644
--- a/src/f32-dwconv/gen/up16x4-minmax-avx-acc2.c
+++ b/src/f32-dwconv/gen/up16x4-minmax-avx-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x4-minmax-avx.c b/src/f32-dwconv/gen/up16x4-minmax-avx.c
index f203888..1556325 100644
--- a/src/f32-dwconv/gen/up16x4-minmax-avx.c
+++ b/src/f32-dwconv/gen/up16x4-minmax-avx.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x4-minmax-fma3-acc2.c b/src/f32-dwconv/gen/up16x4-minmax-fma3-acc2.c
index e8bed54..f08d366 100644
--- a/src/f32-dwconv/gen/up16x4-minmax-fma3-acc2.c
+++ b/src/f32-dwconv/gen/up16x4-minmax-fma3-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x4-minmax-fma3.c b/src/f32-dwconv/gen/up16x4-minmax-fma3.c
index 1c9bd0a..4f86e1e 100644
--- a/src/f32-dwconv/gen/up16x4-minmax-fma3.c
+++ b/src/f32-dwconv/gen/up16x4-minmax-fma3.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x4-minmax-neon-acc2.c b/src/f32-dwconv/gen/up16x4-minmax-neon-acc2.c
index 4d1b565..d739cfb 100644
--- a/src/f32-dwconv/gen/up16x4-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up16x4-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x4-minmax-neon.c b/src/f32-dwconv/gen/up16x4-minmax-neon.c
index 213be0e..321d70f 100644
--- a/src/f32-dwconv/gen/up16x4-minmax-neon.c
+++ b/src/f32-dwconv/gen/up16x4-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x4-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up16x4-minmax-neonfma-acc2.c
index 4f006db..ab13483 100644
--- a/src/f32-dwconv/gen/up16x4-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up16x4-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x4-minmax-neonfma.c b/src/f32-dwconv/gen/up16x4-minmax-neonfma.c
index 0e7498b..827d8d2 100644
--- a/src/f32-dwconv/gen/up16x4-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up16x4-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x9-minmax-avx-acc2.c b/src/f32-dwconv/gen/up16x9-minmax-avx-acc2.c
index 3928b36..1397937 100644
--- a/src/f32-dwconv/gen/up16x9-minmax-avx-acc2.c
+++ b/src/f32-dwconv/gen/up16x9-minmax-avx-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x9-minmax-avx.c b/src/f32-dwconv/gen/up16x9-minmax-avx.c
index db63e4f..d14b8b2 100644
--- a/src/f32-dwconv/gen/up16x9-minmax-avx.c
+++ b/src/f32-dwconv/gen/up16x9-minmax-avx.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x9-minmax-fma3-acc2.c b/src/f32-dwconv/gen/up16x9-minmax-fma3-acc2.c
index 7fc5f6b..103789b 100644
--- a/src/f32-dwconv/gen/up16x9-minmax-fma3-acc2.c
+++ b/src/f32-dwconv/gen/up16x9-minmax-fma3-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x9-minmax-fma3.c b/src/f32-dwconv/gen/up16x9-minmax-fma3.c
index 5de504e..a69b6ed 100644
--- a/src/f32-dwconv/gen/up16x9-minmax-fma3.c
+++ b/src/f32-dwconv/gen/up16x9-minmax-fma3.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x9-minmax-neon-acc2.c b/src/f32-dwconv/gen/up16x9-minmax-neon-acc2.c
index 94bf438..dcc0222 100644
--- a/src/f32-dwconv/gen/up16x9-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up16x9-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x9-minmax-neon.c b/src/f32-dwconv/gen/up16x9-minmax-neon.c
index e83c2e5..1959e4c 100644
--- a/src/f32-dwconv/gen/up16x9-minmax-neon.c
+++ b/src/f32-dwconv/gen/up16x9-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x9-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up16x9-minmax-neonfma-acc2.c
index 04be321..7854a42 100644
--- a/src/f32-dwconv/gen/up16x9-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up16x9-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up16x9-minmax-neonfma.c b/src/f32-dwconv/gen/up16x9-minmax-neonfma.c
index f89fafc..0c37dfb 100644
--- a/src/f32-dwconv/gen/up16x9-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up16x9-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-neon-acc2.c b/src/f32-dwconv/gen/up4x25-minmax-neon-acc2.c
index cbbd85f..048687b 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-neon.c b/src/f32-dwconv/gen/up4x25-minmax-neon.c
index c3fc7f2..bdabfd5 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-neon.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up4x25-minmax-neonfma-acc2.c
index dd28a21..b096576 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-neonfma.c b/src/f32-dwconv/gen/up4x25-minmax-neonfma.c
index da23ccc..1894746 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-sse-acc2.c b/src/f32-dwconv/gen/up4x25-minmax-sse-acc2.c
index aa3c2fc..4b5efc2 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-sse-acc2.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-sse-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-sse.c b/src/f32-dwconv/gen/up4x25-minmax-sse.c
index c78f2d4..beb3e6a 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-sse.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-sse.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-arm-acc2.c b/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-arm-acc2.c
index a8699dd..4d262e1 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-arm-acc2.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-arm-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-arm.c b/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-arm.c
index 0484470..7fe7c3f 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-arm.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-x86-acc2.c b/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-x86-acc2.c
index ac51ac9..6ef4a4e 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-x86-acc2.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-x86-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-x86.c b/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-x86.c
index 7269010..de53d65 100644
--- a/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-x86.c
+++ b/src/f32-dwconv/gen/up4x25-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x25-wasmsimd.c b/src/f32-dwconv/gen/up4x25-wasmsimd.c
index 89fd332..8a199e3 100644
--- a/src/f32-dwconv/gen/up4x25-wasmsimd.c
+++ b/src/f32-dwconv/gen/up4x25-wasmsimd.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-neon-acc2.c b/src/f32-dwconv/gen/up4x3-minmax-neon-acc2.c
index e2e556f..aa5a6d1 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-neon.c b/src/f32-dwconv/gen/up4x3-minmax-neon.c
index 6544f18..112054b 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-neon.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up4x3-minmax-neonfma-acc2.c
index 6eba284..9170279 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-neonfma.c b/src/f32-dwconv/gen/up4x3-minmax-neonfma.c
index 4840c33..45b461e 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-sse-acc2.c b/src/f32-dwconv/gen/up4x3-minmax-sse-acc2.c
index eeea843..d6488ea 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-sse-acc2.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-sse-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-sse.c b/src/f32-dwconv/gen/up4x3-minmax-sse.c
index 8bd1399..18706a3 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-sse.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-sse.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-arm-acc2.c b/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-arm-acc2.c
index b2809d5..ca385e1 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-arm-acc2.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-arm-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-arm.c b/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-arm.c
index d014b5f..a9b4962 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-arm.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-x86-acc2.c b/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-x86-acc2.c
index 9d0d74b..77bc507 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-x86-acc2.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-x86-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-x86.c b/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-x86.c
index 0f636ef..ddc4768 100644
--- a/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-x86.c
+++ b/src/f32-dwconv/gen/up4x3-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x3-wasmsimd.c b/src/f32-dwconv/gen/up4x3-wasmsimd.c
index 2ae9ba4..7861a15 100644
--- a/src/f32-dwconv/gen/up4x3-wasmsimd.c
+++ b/src/f32-dwconv/gen/up4x3-wasmsimd.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-neon-acc2.c b/src/f32-dwconv/gen/up4x4-minmax-neon-acc2.c
index 7fa489e..b9107d5 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-neon.c b/src/f32-dwconv/gen/up4x4-minmax-neon.c
index 48c47e0..3e4441e 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-neon.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up4x4-minmax-neonfma-acc2.c
index f4f3af8..b1f0453 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-neonfma.c b/src/f32-dwconv/gen/up4x4-minmax-neonfma.c
index 5f460d4..40c55c3 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-sse-acc2.c b/src/f32-dwconv/gen/up4x4-minmax-sse-acc2.c
index e05e06b..524078a 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-sse-acc2.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-sse-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-sse.c b/src/f32-dwconv/gen/up4x4-minmax-sse.c
index 8b5380e..34e4fe3 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-sse.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-sse.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-arm-acc2.c b/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-arm-acc2.c
index cb3560c..271814c 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-arm-acc2.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-arm-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-arm.c b/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-arm.c
index 7b51f47..6c3a215 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-arm.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-x86-acc2.c b/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-x86-acc2.c
index 60b082c..abc4a02 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-x86-acc2.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-x86-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-x86.c b/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-x86.c
index 8d4734d..e58a48d 100644
--- a/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-x86.c
+++ b/src/f32-dwconv/gen/up4x4-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x4-wasmsimd.c b/src/f32-dwconv/gen/up4x4-wasmsimd.c
index 8f9b278..e8208f0 100644
--- a/src/f32-dwconv/gen/up4x4-wasmsimd.c
+++ b/src/f32-dwconv/gen/up4x4-wasmsimd.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-neon-acc2.c b/src/f32-dwconv/gen/up4x9-minmax-neon-acc2.c
index 5abe348..09a2319 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-neon.c b/src/f32-dwconv/gen/up4x9-minmax-neon.c
index 4ad77eb..724b62f 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-neon.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up4x9-minmax-neonfma-acc2.c
index c353641..734dac4 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-neonfma.c b/src/f32-dwconv/gen/up4x9-minmax-neonfma.c
index 7aa12ec..0e4dd98 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-sse-acc2.c b/src/f32-dwconv/gen/up4x9-minmax-sse-acc2.c
index 793a417..15e83ab 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-sse-acc2.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-sse-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-sse.c b/src/f32-dwconv/gen/up4x9-minmax-sse.c
index fc6bffb..5a4219a 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-sse.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-sse.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-arm-acc2.c b/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-arm-acc2.c
index aa50bd8..7feff61 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-arm-acc2.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-arm-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-arm.c b/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-arm.c
index dfda7e5..feb5885 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-arm.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-x86-acc2.c b/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-x86-acc2.c
index a0386f8..65cb79b 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-x86-acc2.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-x86-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-x86.c b/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-x86.c
index da8c78d..b5a663b 100644
--- a/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-x86.c
+++ b/src/f32-dwconv/gen/up4x9-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up4x9-wasmsimd.c b/src/f32-dwconv/gen/up4x9-wasmsimd.c
index 240c18d..2aa1978 100644
--- a/src/f32-dwconv/gen/up4x9-wasmsimd.c
+++ b/src/f32-dwconv/gen/up4x9-wasmsimd.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-avx-acc2.c b/src/f32-dwconv/gen/up8x25-minmax-avx-acc2.c
index 46dd2fe..ab66509 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-avx-acc2.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-avx-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-avx.c b/src/f32-dwconv/gen/up8x25-minmax-avx.c
index c8fe6d9..6965f1e 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-avx.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-avx.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-fma3-acc2.c b/src/f32-dwconv/gen/up8x25-minmax-fma3-acc2.c
index 9cb169d..335d791 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-fma3-acc2.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-fma3-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-fma3.c b/src/f32-dwconv/gen/up8x25-minmax-fma3.c
index 7c5387d..dddf449 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-fma3.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-fma3.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-neon-acc2.c b/src/f32-dwconv/gen/up8x25-minmax-neon-acc2.c
index 9c0c580..38f3c74 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-neon.c b/src/f32-dwconv/gen/up8x25-minmax-neon.c
index 6dbe6ca..44b3351 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-neon.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up8x25-minmax-neonfma-acc2.c
index 121f13e..f5a89ae 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-neonfma.c b/src/f32-dwconv/gen/up8x25-minmax-neonfma.c
index eb38e96..912bcf0 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-sse-acc2.c b/src/f32-dwconv/gen/up8x25-minmax-sse-acc2.c
index 3d22d34..0f8a957 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-sse-acc2.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-sse-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-sse.c b/src/f32-dwconv/gen/up8x25-minmax-sse.c
index 2bf86b9..dc19173 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-sse.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-sse.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-arm-acc2.c b/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-arm-acc2.c
index be0fb5e..4a69192 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-arm-acc2.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-arm-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-arm.c b/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-arm.c
index c4ee609..1c73d86 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-arm.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-x86-acc2.c b/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-x86-acc2.c
index 01e052e..8ee3bfe 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-x86-acc2.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-x86-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-x86.c b/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-x86.c
index b2ca246..7ef1b44 100644
--- a/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-x86.c
+++ b/src/f32-dwconv/gen/up8x25-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x25-wasmsimd.c b/src/f32-dwconv/gen/up8x25-wasmsimd.c
index 4cb50fd..21001e2 100644
--- a/src/f32-dwconv/gen/up8x25-wasmsimd.c
+++ b/src/f32-dwconv/gen/up8x25-wasmsimd.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-avx-acc2.c b/src/f32-dwconv/gen/up8x3-minmax-avx-acc2.c
index a2fdfad..b66af33 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-avx-acc2.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-avx-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-avx.c b/src/f32-dwconv/gen/up8x3-minmax-avx.c
index a92cefe..5b9e724 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-avx.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-avx.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-fma3-acc2.c b/src/f32-dwconv/gen/up8x3-minmax-fma3-acc2.c
index 3ec6a61..7a477d3 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-fma3-acc2.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-fma3-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-fma3.c b/src/f32-dwconv/gen/up8x3-minmax-fma3.c
index f431a04..d9030ec 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-fma3.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-fma3.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-neon-acc2.c b/src/f32-dwconv/gen/up8x3-minmax-neon-acc2.c
index 7eca00c..9eab29a 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-neon.c b/src/f32-dwconv/gen/up8x3-minmax-neon.c
index e93861d..e6688eb 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-neon.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up8x3-minmax-neonfma-acc2.c
index e5f4969..fe8e3d3 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-neonfma.c b/src/f32-dwconv/gen/up8x3-minmax-neonfma.c
index 0701ea0..9b10f98 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-sse-acc2.c b/src/f32-dwconv/gen/up8x3-minmax-sse-acc2.c
index a1bdc46..b01b6b8 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-sse-acc2.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-sse-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-sse.c b/src/f32-dwconv/gen/up8x3-minmax-sse.c
index 022c992..e1f9f09 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-sse.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-sse.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-arm-acc2.c b/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-arm-acc2.c
index bd506ee..d917347 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-arm-acc2.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-arm-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-arm.c b/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-arm.c
index 7bca60d..aeb705e 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-arm.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-x86-acc2.c b/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-x86-acc2.c
index 4608c41..afbd70f 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-x86-acc2.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-x86-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-x86.c b/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-x86.c
index 7e096ef..b6a2bfb 100644
--- a/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-x86.c
+++ b/src/f32-dwconv/gen/up8x3-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x3-wasmsimd.c b/src/f32-dwconv/gen/up8x3-wasmsimd.c
index 1eeb601..7b72931 100644
--- a/src/f32-dwconv/gen/up8x3-wasmsimd.c
+++ b/src/f32-dwconv/gen/up8x3-wasmsimd.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-avx-acc2.c b/src/f32-dwconv/gen/up8x4-minmax-avx-acc2.c
index 87f4e7f..e22d30e 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-avx-acc2.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-avx-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-avx.c b/src/f32-dwconv/gen/up8x4-minmax-avx.c
index bd6496f..f67fc5e 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-avx.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-avx.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-fma3-acc2.c b/src/f32-dwconv/gen/up8x4-minmax-fma3-acc2.c
index 70b8f19..d8bba96 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-fma3-acc2.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-fma3-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-fma3.c b/src/f32-dwconv/gen/up8x4-minmax-fma3.c
index 81b12ab..3620ef8 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-fma3.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-fma3.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-neon-acc2.c b/src/f32-dwconv/gen/up8x4-minmax-neon-acc2.c
index e6a3c9b..9bf4bd6 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-neon.c b/src/f32-dwconv/gen/up8x4-minmax-neon.c
index 805a069..d5acc2f 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-neon.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up8x4-minmax-neonfma-acc2.c
index b83dd91..aca4dfb 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-neonfma.c b/src/f32-dwconv/gen/up8x4-minmax-neonfma.c
index 54bb1ed..b0291a7 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-sse-acc2.c b/src/f32-dwconv/gen/up8x4-minmax-sse-acc2.c
index 0725b00..09c1ac2 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-sse-acc2.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-sse-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-sse.c b/src/f32-dwconv/gen/up8x4-minmax-sse.c
index c2470be..f3373f9 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-sse.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-sse.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-arm-acc2.c b/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-arm-acc2.c
index e7fb32d..0c1517d 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-arm-acc2.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-arm-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-arm.c b/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-arm.c
index bbfbb55..aa0ef70 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-arm.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-x86-acc2.c b/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-x86-acc2.c
index e99ea7a..edb904d 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-x86-acc2.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-x86-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-x86.c b/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-x86.c
index 6c41379..51062e4 100644
--- a/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-x86.c
+++ b/src/f32-dwconv/gen/up8x4-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x4-wasmsimd.c b/src/f32-dwconv/gen/up8x4-wasmsimd.c
index 1858a80..ca993b2 100644
--- a/src/f32-dwconv/gen/up8x4-wasmsimd.c
+++ b/src/f32-dwconv/gen/up8x4-wasmsimd.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-avx-acc2.c b/src/f32-dwconv/gen/up8x9-minmax-avx-acc2.c
index f96c687..98d9e71 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-avx-acc2.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-avx-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-avx.c b/src/f32-dwconv/gen/up8x9-minmax-avx.c
index 7827273..6c090ce 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-avx.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-avx.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-fma3-acc2.c b/src/f32-dwconv/gen/up8x9-minmax-fma3-acc2.c
index ca45906..6059cea 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-fma3-acc2.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-fma3-acc2.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-fma3.c b/src/f32-dwconv/gen/up8x9-minmax-fma3.c
index f078ae2..bebfa78 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-fma3.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-fma3.c
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-neon-acc2.c b/src/f32-dwconv/gen/up8x9-minmax-neon-acc2.c
index f29cd7a..87def9e 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-neon-acc2.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-neon-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-neon.c b/src/f32-dwconv/gen/up8x9-minmax-neon.c
index 95e5426..d5c3834 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-neon.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-neon.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-neonfma-acc2.c b/src/f32-dwconv/gen/up8x9-minmax-neonfma-acc2.c
index 7a94d54..cffea9f 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-neonfma-acc2.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-neonfma-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-neonfma.c b/src/f32-dwconv/gen/up8x9-minmax-neonfma.c
index e4df716..278fea7 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-neonfma.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-neonfma.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-sse-acc2.c b/src/f32-dwconv/gen/up8x9-minmax-sse-acc2.c
index b9c528c..c4a8563 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-sse-acc2.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-sse-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-sse.c b/src/f32-dwconv/gen/up8x9-minmax-sse.c
index d3b64a5..4fa9539 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-sse.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-sse.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-arm-acc2.c b/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-arm-acc2.c
index 578cabc..ffc09d4 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-arm-acc2.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-arm-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-arm.c b/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-arm.c
index 07c2d5e..4c7f187 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-arm.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-x86-acc2.c b/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-x86-acc2.c
index c447dd2..00d16d4 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-x86-acc2.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-x86-acc2.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-x86.c b/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-x86.c
index 5d09b01..b3c06e7 100644
--- a/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-x86.c
+++ b/src/f32-dwconv/gen/up8x9-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/gen/up8x9-wasmsimd.c b/src/f32-dwconv/gen/up8x9-wasmsimd.c
index 6c78837..c4a5485 100644
--- a/src/f32-dwconv/gen/up8x9-wasmsimd.c
+++ b/src/f32-dwconv/gen/up8x9-wasmsimd.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/up-avx.c.in b/src/f32-dwconv/up-avx.c.in
index c2d139f..e0e205a 100644
--- a/src/f32-dwconv/up-avx.c.in
+++ b/src/f32-dwconv/up-avx.c.in
@@ -27,7 +27,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/up-neon.c.in b/src/f32-dwconv/up-neon.c.in
index 03a8ec0..9353c9c 100644
--- a/src/f32-dwconv/up-neon.c.in
+++ b/src/f32-dwconv/up-neon.c.in
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/up-sse.c.in b/src/f32-dwconv/up-sse.c.in
index a8f750e..4231a0f 100644
--- a/src/f32-dwconv/up-sse.c.in
+++ b/src/f32-dwconv/up-sse.c.in
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv/up-wasmsimd.c.in b/src/f32-dwconv/up-wasmsimd.c.in
index bb6e882..4cd1762 100644
--- a/src/f32-dwconv/up-wasmsimd.c.in
+++ b/src/f32-dwconv/up-wasmsimd.c.in
@@ -28,7 +28,7 @@
     size_t output_increment,
     size_t input_offset,
     const float* zero,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3p1-neon.c.in b/src/f32-dwconv2d-chw/3x3p1-neon.c.in
index 89baeb5..b4ddd60 100644
--- a/src/f32-dwconv2d-chw/3x3p1-neon.c.in
+++ b/src/f32-dwconv2d-chw/3x3p1-neon.c.in
@@ -22,7 +22,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3p1-sse.c.in b/src/f32-dwconv2d-chw/3x3p1-sse.c.in
index 1efaacf..91129a1 100644
--- a/src/f32-dwconv2d-chw/3x3p1-sse.c.in
+++ b/src/f32-dwconv2d-chw/3x3p1-sse.c.in
@@ -21,7 +21,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3p1-ssse3.c.in b/src/f32-dwconv2d-chw/3x3p1-ssse3.c.in
index 320f6c4..102547d 100644
--- a/src/f32-dwconv2d-chw/3x3p1-ssse3.c.in
+++ b/src/f32-dwconv2d-chw/3x3p1-ssse3.c.in
@@ -21,7 +21,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3p1-wasmsimd-loadsplat.c.in b/src/f32-dwconv2d-chw/3x3p1-wasmsimd-loadsplat.c.in
index 41fdd34..366375c 100644
--- a/src/f32-dwconv2d-chw/3x3p1-wasmsimd-loadsplat.c.in
+++ b/src/f32-dwconv2d-chw/3x3p1-wasmsimd-loadsplat.c.in
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3p1-wasmsimd-splat.c.in b/src/f32-dwconv2d-chw/3x3p1-wasmsimd-splat.c.in
index 0fb700a..51edf65 100644
--- a/src/f32-dwconv2d-chw/3x3p1-wasmsimd-splat.c.in
+++ b/src/f32-dwconv2d-chw/3x3p1-wasmsimd-splat.c.in
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3s2p1-neon.c.in b/src/f32-dwconv2d-chw/3x3s2p1-neon.c.in
index 420f2cd..922c5a9 100644
--- a/src/f32-dwconv2d-chw/3x3s2p1-neon.c.in
+++ b/src/f32-dwconv2d-chw/3x3s2p1-neon.c.in
@@ -22,7 +22,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3s2p1-sse.c.in b/src/f32-dwconv2d-chw/3x3s2p1-sse.c.in
index 8723dfa..e2b008d 100644
--- a/src/f32-dwconv2d-chw/3x3s2p1-sse.c.in
+++ b/src/f32-dwconv2d-chw/3x3s2p1-sse.c.in
@@ -21,7 +21,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3s2p1-wasmsimd-loadsplat.c.in b/src/f32-dwconv2d-chw/3x3s2p1-wasmsimd-loadsplat.c.in
index 883460c..b19eba8 100644
--- a/src/f32-dwconv2d-chw/3x3s2p1-wasmsimd-loadsplat.c.in
+++ b/src/f32-dwconv2d-chw/3x3s2p1-wasmsimd-loadsplat.c.in
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/3x3s2p1-wasmsimd-splat.c.in b/src/f32-dwconv2d-chw/3x3s2p1-wasmsimd-splat.c.in
index f8107e0..ce35204 100644
--- a/src/f32-dwconv2d-chw/3x3s2p1-wasmsimd-splat.c.in
+++ b/src/f32-dwconv2d-chw/3x3s2p1-wasmsimd-splat.c.in
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/5x5p2-neon.c.in b/src/f32-dwconv2d-chw/5x5p2-neon.c.in
index 7401d5e..b78c7a3 100644
--- a/src/f32-dwconv2d-chw/5x5p2-neon.c.in
+++ b/src/f32-dwconv2d-chw/5x5p2-neon.c.in
@@ -22,7 +22,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/5x5p2-sse.c.in b/src/f32-dwconv2d-chw/5x5p2-sse.c.in
index 341a07e..37c20c0 100644
--- a/src/f32-dwconv2d-chw/5x5p2-sse.c.in
+++ b/src/f32-dwconv2d-chw/5x5p2-sse.c.in
@@ -21,7 +21,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/5x5p2-wasmsimd-loadsplat.c.in b/src/f32-dwconv2d-chw/5x5p2-wasmsimd-loadsplat.c.in
index ad7c3f6..fb2376a 100644
--- a/src/f32-dwconv2d-chw/5x5p2-wasmsimd-loadsplat.c.in
+++ b/src/f32-dwconv2d-chw/5x5p2-wasmsimd-loadsplat.c.in
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/5x5p2-wasmsimd-splat.c.in b/src/f32-dwconv2d-chw/5x5p2-wasmsimd-splat.c.in
index a6e7b93..60c84d7 100644
--- a/src/f32-dwconv2d-chw/5x5p2-wasmsimd-splat.c.in
+++ b/src/f32-dwconv2d-chw/5x5p2-wasmsimd-splat.c.in
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/5x5s2p2-neon.c.in b/src/f32-dwconv2d-chw/5x5s2p2-neon.c.in
index 501e2a6..956321e 100644
--- a/src/f32-dwconv2d-chw/5x5s2p2-neon.c.in
+++ b/src/f32-dwconv2d-chw/5x5s2p2-neon.c.in
@@ -22,7 +22,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/5x5s2p2-sse.c.in b/src/f32-dwconv2d-chw/5x5s2p2-sse.c.in
index 2493a6e..fdd6399 100644
--- a/src/f32-dwconv2d-chw/5x5s2p2-sse.c.in
+++ b/src/f32-dwconv2d-chw/5x5s2p2-sse.c.in
@@ -21,7 +21,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/5x5s2p2-wasmsimd-loadsplat.c.in b/src/f32-dwconv2d-chw/5x5s2p2-wasmsimd-loadsplat.c.in
index eef81a3..0bfe18e 100644
--- a/src/f32-dwconv2d-chw/5x5s2p2-wasmsimd-loadsplat.c.in
+++ b/src/f32-dwconv2d-chw/5x5s2p2-wasmsimd-loadsplat.c.in
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/5x5s2p2-wasmsimd-splat.c.in b/src/f32-dwconv2d-chw/5x5s2p2-wasmsimd-splat.c.in
index de6a4b4..c162c7e 100644
--- a/src/f32-dwconv2d-chw/5x5s2p2-wasmsimd-splat.c.in
+++ b/src/f32-dwconv2d-chw/5x5s2p2-wasmsimd-splat.c.in
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc2.c
index e7595a4..906c76d 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc3.c
index 44075bb..8cb072b 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc4.c
index 1b50d2a..660a7f6 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4.c
index 5e6e465..aa7644d 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-2x4-acc2.c
index a1f9d7a..a385cb7 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-2x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-2x4.c
index 8fb4842..a034b78 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-3x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-3x4.c
index facaf40..ce979ce 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-4x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-4x4.c
index f3ee1cb..a5cec43 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-5x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-5x4.c
index 6432964..857cd17 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-5x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-6x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-6x4.c
index d8d63d8..257febb 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-6x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neon-6x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc2.c
index d17cb43..fdf3f67 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc3.c
index f6f23e1..7f119ec 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc4.c
index ed20bea..666628c 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4.c
index d09e595..21f8e8b 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-2x4-acc2.c
index 901d326..d52b7a7 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-2x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-2x4.c
index 54750da..f888427 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-3x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-3x4.c
index 84f53fe..623763d 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-4x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-4x4.c
index 0e202d2..00e00b9 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-5x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-5x4.c
index 34613bb..e51b1d6 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-5x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-6x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-6x4.c
index 6bc45f3..6089830 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-6x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-neonfma-6x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc2.c
index 0d3f10e..45e652d 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc3.c
index 0362b11..bc165bf 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc4.c
index 4aa9ce3..7f6afb0 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4.c
index c7106cb..a338607 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-2x4-acc2.c
index 171fa28..57b1dde 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-2x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-2x4.c
index 13afcc5..363c32c 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-3x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-3x4.c
index 1e0fef5..c3ab219 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-4x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-4x4.c
index 3227e0e..e1c84cc 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-5x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-5x4.c
index 20f30cb..b831c36 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-5x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-6x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-6x4.c
index b9d5b83..1f34b49 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-6x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-sse-6x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc2.c
index 10975be..ca51cbe 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc3.c
index c08e3dc..e5749d0 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc4.c
index 1cf67be..b523e3c 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4.c
index e237842..676acd3 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-2x4-acc2.c
index f17ba46..a7065a8 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-2x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-2x4.c
index 366b76a..d102f86 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-3x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-3x4.c
index 90e3164..ea56b77 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-4x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-4x4.c
index b811bd2..3c15d95 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-5x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-5x4.c
index 1ac610c..8c7cbd0 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-5x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-6x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-6x4.c
index 738ab55..8868f1c 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-6x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-ssse3-6x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
index 6ae23b8..5619de1 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
index 092a331..e7ea241 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
index f1ec63c..7b3b110 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4.c
index 3729f83..e99bb78 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-1x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
index d7aab0f..1f673ca 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-2x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-2x4.c
index 7a0d340..496ad63 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-2x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-3x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-3x4.c
index 2a8ca81..02ced67 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-3x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-4x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-4x4.c
index 5429fde..ea669b3 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-4x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-5x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-5x4.c
index 3d867b8..fa45a34 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-5x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-6x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-6x4.c
index 7e5612e..5201af4 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-6x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-loadsplat-6x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc2.c
index aee60de..2200e06 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc3.c
index 253613e..c838d32 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc4.c
index 0d31467..0c99377 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4.c
index 867910b..016dbc7 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-2x4-acc2.c
index 5f20623..ba49a29 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-2x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-2x4.c
index 1ce7687..6b23d05 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-3x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-3x4.c
index b67b482..70e1e3d 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-4x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-4x4.c
index a38b84a..9882e05 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-5x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-5x4.c
index c860560..4a90fc7 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-5x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-6x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-6x4.c
index 571dbc1..9965c0a 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-6x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-arm-splat-6x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
index 61b35e6..4da90dd 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
index a746b0a..b741b71 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
index ba5b704..473e426 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4.c
index 3b04d59..c529ce7 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-1x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
index 831b52e..87af98a 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-2x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-2x4.c
index b5792c8..53c0321 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-2x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-3x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-3x4.c
index dae4dd0..e4d4c00 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-3x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-4x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-4x4.c
index 1d37213..71cd2bb 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-4x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-5x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-5x4.c
index 457e431..9ffd776 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-5x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-6x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-6x4.c
index a54c9b8..357433f 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-6x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-loadsplat-6x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc2.c
index c00c556..c0904cf 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc3.c
index e9d6a9a..d310119 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc4.c
index 36cd6dd..4cbe923 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4.c
index e99bdc7..d742954 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-2x4-acc2.c
index 631a474..45f9624 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-2x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-2x4.c
index b29a48c..4345866 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-3x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-3x4.c
index 23e53fc..3059491 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-4x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-4x4.c
index 237e77a..8a4f759 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-5x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-5x4.c
index 642e476..b73ca9a 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-5x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-6x4.c b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-6x4.c
index 8477329..9bb775d 100644
--- a/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-6x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3p1-minmax-wasmsimd-x86-splat-6x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc2.c
index ce91331..8fd3e17 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc3.c
index d113377..4ad597a 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc4.c
index e1842fe..ce0381b 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4.c
index c6f638f..49d62fb 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-2x4-acc2.c
index a34da64..282641b 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-2x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-2x4.c
index 71890af..5f3d6fb 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-3x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-3x4.c
index 09f38d9..39e4260 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-4x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-4x4.c
index 333fd1d..1682f92 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neon-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc2.c
index 9b65eb9..34a8769 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc3.c
index cfb951a..eeae633 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc4.c
index 715697a..8873b9e 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4.c
index 575ef07..ffd3857 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-2x4-acc2.c
index a47d905..eab2a13 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-2x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-2x4.c
index 6679e35..a603790 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-3x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-3x4.c
index 4bdfa35..f375074 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-4x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-4x4.c
index 6cd4715..cd9103a 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-neonfma-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc2.c
index e56b4f7..e348739 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc3.c
index 5854f4f..d22fcc4 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc4.c
index f98d126..daf2e18 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4.c
index 62f8633..762345c 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-2x4-acc2.c
index af74f94..04eda49 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-2x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-2x4.c
index 7a86c18..74fd9d9 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-3x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-3x4.c
index 879cfb1..e858fae 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-4x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-4x4.c
index 7e5b10a..518f6d8 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-sse-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
index 2d21500..94f3df7 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
index 802dc1a..784b229 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
index b5a402e..403833e 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4.c
index b431cc3..38e786b 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
index 631e37b..70c8676 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-2x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-2x4.c
index 8c2b702..fbc02a4 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-3x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-3x4.c
index 3e76070..540b571 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-4x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-4x4.c
index b1127a1..00d557e 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-loadsplat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc2.c
index 6aee7bb..64cfa82 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc3.c
index 449f85b..1fb7094 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc4.c
index 31a0a4e..fdb964c 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4.c
index 96ac71a..865af4c 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-2x4-acc2.c
index 58a5353..d456345 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-2x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-2x4.c
index 380b471..2976f7e 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-3x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-3x4.c
index 1a4d1ac..4b96d8e 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-4x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-4x4.c
index 812f3a5..90916b2 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-arm-splat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
index 9f01486..dabb236 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
index 52591ad..aadf51a 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
index 402ecca..efc22d6 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4.c
index fdf5494..5258e4b 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
index 1466395..f272d08 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-2x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-2x4.c
index bef93a9..bd54c33 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-3x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-3x4.c
index 796c008..3f667c5 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-4x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-4x4.c
index b0f3394..95a5d9d 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-loadsplat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc2.c
index 5c48c0a..0eb9515 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc3.c
index 5286928..50e5cd1 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc4.c
index cf9502d..4b6cc3b 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4.c
index f2ad229..bf89534 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-2x4-acc2.c
index c61c1df..ac14e30 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-2x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-2x4.c
index 664935a..fb4f75f 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-3x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-3x4.c
index 802e69a..25b2f02 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-4x4.c b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-4x4.c
index ff31a5f..b5df4ab 100644
--- a/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/3x3s2p1-minmax-wasmsimd-x86-splat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc2.c
index 805bbd2..b1956c4 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc3.c
index 13a7124..ef27beb 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc4.c
index 5b0a766..02ff65f 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc5.c
index 0a087b6..815d6b9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4-acc5.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4.c
index 8bd517c..d15d937 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4-acc2.c
index 2dc5a8e..bc189a6 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4-acc3.c
index bf16ad9..5537476 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4.c
index 8123b4e..e2806a6 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-3x4-acc2.c
index 90a7daa..c49f91d 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-3x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-3x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-3x4.c
index 7b1f8eb..ccc4b25 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-4x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-4x4-acc2.c
index f069d8c..5989e8c 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-4x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-4x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-4x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-4x4.c
index 1c9cd24..78e7bc8 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-5x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-5x4.c
index ee43031..0472ed4 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neon-5x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc2.c
index 1033c48..2d1a8dd 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc3.c
index 9dc0e24..8c88f42 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc4.c
index 222ec34..379fa1e 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc5.c
index b4c62df..a726e93 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4-acc5.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4.c
index 1a74700..897b29b 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4-acc2.c
index 67ad569..c9f3791 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4-acc3.c
index fc3df4b..6bc9daf 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4.c
index 10fc843..ea4a0cd 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-3x4-acc2.c
index d7d7176..05c2a55 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-3x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-3x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-3x4.c
index b4dae09..3a1c73d 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-4x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-4x4-acc2.c
index 58a0f94..b01bef0 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-4x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-4x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-4x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-4x4.c
index c805ce2..1bab871 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-5x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-5x4.c
index 3bf0c5b..8f0cd63 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-neonfma-5x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc2.c
index 32664d5..444f1aa 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc3.c
index e9ba8a9..5e4b692 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc4.c
index b8e820e..a945dac 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc5.c
index ff8ba98..7158b4b 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4-acc5.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4.c
index 3e94c39..5155324 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4-acc2.c
index 805adce..fe2c942 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4-acc3.c
index 77bc7c7..368e9bf 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4.c
index 7ed31c5..6965d36 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-3x4-acc2.c
index 08eb078..8c56116 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-3x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-3x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-3x4.c
index cf32acc..53336e0 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-4x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-4x4-acc2.c
index 29e8116..68d05da 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-4x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-4x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-4x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-4x4.c
index e1d071c..9d89737 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-4x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-5x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-5x4.c
index 832c8cb..f0a91ab 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-sse-5x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
index acf40c5..8e215b7 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
index d9b1233..40cfc06 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
index 9940af4..6757543 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc5.c
index d502121..b409124 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4-acc5.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4.c
index 4c93f0e..94cf044 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
index 6ab3d77..233c83e 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4-acc3.c
index 3c74703..271e0e2 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4.c
index 4750fc9..87b59f9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-3x4-acc2.c
index 4432f0c..e2f8cfd 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-3x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-3x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-3x4.c
index cf6f001..302a9cc 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-4x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-4x4-acc2.c
index 6b0275b..80ad7b9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-4x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-4x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-4x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-4x4.c
index d4257d2..2741c23 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-5x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-5x4.c
index f009271..5e3baca 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-loadsplat-5x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc2.c
index fbc6c57..585a976 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc3.c
index 5e4f86c..f9df60b 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc4.c
index e4b7c2d..3e24719 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc5.c
index 5b1fbb5..a4cbd24 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4-acc5.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4.c
index a2bd0f8..d66a2d9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4-acc2.c
index b6d7a32..04e39f7 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4-acc3.c
index 0d7e37a..4a0891e 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4.c
index 02c3f38..8116d38 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-3x4-acc2.c
index 9bf9d09..b70bc83 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-3x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-3x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-3x4.c
index f4342b2..84e22e9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-4x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-4x4-acc2.c
index fb05598..9aa7d5a 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-4x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-4x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-4x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-4x4.c
index e081e74..b2bc8a1 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-5x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-5x4.c
index 2c43d02..d78903d 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-arm-splat-5x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
index c2bbfa5..c45db1e 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
index 279cd2c..cbd18a4 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
index f174f8a..d50f63e 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc5.c
index 91b88c8..9a9f445 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4-acc5.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4.c
index 97fa5ee..ce7c261 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
index 4e9aede..df244b6 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4-acc3.c
index c6dc17b..ddf6f08 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4.c
index 025622b..092df6a 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-3x4-acc2.c
index 202631a..b6933f0 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-3x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-3x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-3x4.c
index 9c2fee0..bec43a7 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-4x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-4x4-acc2.c
index 8b31230..02d9253 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-4x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-4x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-4x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-4x4.c
index d4fb13f..32e2be0 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-5x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-5x4.c
index 3b2babc..ee822f1 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-loadsplat-5x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc2.c
index b029ceb..0354a79 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc3.c
index 2dfb180..eba9969 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc4.c
index 6f08890..837c498 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc5.c
index edc4a1a..37c5fc9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4-acc5.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4.c
index e56bca1..9e0d494 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4-acc2.c
index 10cf2f2..ef42f17 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4-acc3.c
index 71b324f..fdabcea 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4.c
index b791d8b..8a0d538 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-3x4-acc2.c
index d0b1abb..15ae5b1 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-3x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-3x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-3x4.c
index 861f76d..7c12203 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-4x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-4x4-acc2.c
index ddf239c..f8676e9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-4x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-4x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-4x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-4x4.c
index 26b546e..653c7cb 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-4x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-4x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-5x4.c b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-5x4.c
index 49dc531..896569d 100644
--- a/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-5x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5p2-minmax-wasmsimd-x86-splat-5x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc2.c
index 265039e..f58187e 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc3.c
index 8d43087..c949875 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc4.c
index ad4e95b..02a299c 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc5.c
index b55fa4e..dfbb9ba 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4-acc5.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4.c
index d5b374f..13f6056 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4-acc2.c
index dfc5349..2681bc5 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4-acc3.c
index 132f05b..c66bd22 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4.c
index 8620739..0cda8ad 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-3x4-acc2.c
index e737a16..958af49 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-3x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-3x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-3x4.c
index 2ebae1a..fc23e5a 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neon-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc2.c
index 2057bd9..6e203ee 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc3.c
index 6f80884..fe736b7 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc4.c
index ab67981..f95753c 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc5.c
index ce11525..c34852d 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4-acc5.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4.c
index 11b2e5f..2f2b8f3 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4-acc2.c
index 48bcb70..cf8812a 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4-acc3.c
index 68eb42f..52aa46a 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4.c
index db4175f..30f7066 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-3x4-acc2.c
index 303f99f..f228701 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-3x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-3x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-3x4.c
index 661bc68..bb521e4 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-neonfma-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc2.c
index cc37cf1..b1181ad 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc3.c
index 78473a7..b2f437d 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc4.c
index b10639f..b3aa035 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc5.c
index 5d9fb45..c86a87b 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4-acc5.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4.c
index ae21796..7e3d617 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-1x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4-acc2.c
index f0bd552..a493920 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4-acc3.c
index 1cd1340..a34ae68 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4-acc3.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4.c
index be05123..d85a7d4 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-2x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-3x4-acc2.c
index 5193cbc..661295e 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-3x4-acc2.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-3x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-3x4.c
index c0a778b..6a30fa6 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-sse-3x4.c
@@ -23,7 +23,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
index 4040911..cecd974 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
index 1696513..771a64c 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc3.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
index 3836ea9..505b3b0 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc5.c
index 7316cd0..85dc114 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4-acc5.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4.c
index fbe90b2..cf7a7ac 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-1x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
index aeb3209..8f2b696 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4-acc3.c
index ff58cbb..d7938dc 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4-acc3.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4.c
index c6fbf05..6c26136 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-2x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-3x4-acc2.c
index 8a7dbda..4fe8cbe 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-3x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-3x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-3x4.c
index 27234bc..adec8d9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-loadsplat-3x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc2.c
index f63f5f4..a8b487b 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc3.c
index dc93eba..847c947 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc4.c
index 3749c25..bc84ee5 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc5.c
index 9d8bf7a..2331509 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4-acc5.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4.c
index d473f8b..54e2e8b 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4-acc2.c
index 0cd3b09..74ac0d9 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4-acc3.c
index baa092b..c3a8bcf 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4.c
index addd8a3..7fff6318 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-3x4-acc2.c
index 66ae3fb..9b4017a 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-3x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-3x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-3x4.c
index feba314..c1f6b98 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-arm-splat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
index 23be7b1..11d4ef2 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
index c6c6368..837db8d 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc3.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
index bd8b7a3..ef9f63c 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc5.c
index 1959912..87d1f3f 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4-acc5.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4.c
index 07b8065..702b9a1 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-1x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
index 32572c4..68216fb 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4-acc3.c
index 1df5909..31e6f9f 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4-acc3.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4.c
index ca7a8d7..f9c4208 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-2x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-3x4-acc2.c
index 84dd4cd..09328f6 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-3x4-acc2.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-3x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-3x4.c
index f8f6a32..e0fef85 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-loadsplat-3x4.c
@@ -25,7 +25,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc2.c
index de44935..6e2905f 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc3.c
index 9d249af..f742902 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc4.c
index 0af63ad..3a9a3dd 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc5.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc5.c
index 0c1c879..2ed193f 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc5.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4-acc5.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4.c
index 82c91da..31f5905 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-1x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4-acc2.c
index 478cc42..f3bbd20 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4-acc3.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4-acc3.c
index f06772e..ea611db 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4-acc3.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4-acc3.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4.c
index d77388d..53e827d 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-2x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-3x4-acc2.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-3x4-acc2.c
index 73ae6c7..ea165eb 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-3x4-acc2.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-3x4-acc2.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-3x4.c b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-3x4.c
index ac4a7bf..0ffcc33 100644
--- a/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-3x4.c
+++ b/src/f32-dwconv2d-chw/gen/5x5s2p2-minmax-wasmsimd-x86-splat-3x4.c
@@ -24,7 +24,7 @@
     const float* zero,
     float* output,
     uint32_t padding_top,
-    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)])
+    const union xnn_f32_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(input_height != 0);
   assert(input_width != 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-avx-x16.c b/src/f32-f16-vcvt/gen/vcvt-avx-x16.c
index e4a3f3a..dfcdfcd 100644
--- a/src/f32-f16-vcvt/gen/vcvt-avx-x16.c
+++ b/src/f32-f16-vcvt/gen/vcvt-avx-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-avx-x24.c b/src/f32-f16-vcvt/gen/vcvt-avx-x24.c
index 6e38d36..d16a094 100644
--- a/src/f32-f16-vcvt/gen/vcvt-avx-x24.c
+++ b/src/f32-f16-vcvt/gen/vcvt-avx-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-avx-x32.c b/src/f32-f16-vcvt/gen/vcvt-avx-x32.c
index 8bc440f..e9ef8a3 100644
--- a/src/f32-f16-vcvt/gen/vcvt-avx-x32.c
+++ b/src/f32-f16-vcvt/gen/vcvt-avx-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-avx-x8.c b/src/f32-f16-vcvt/gen/vcvt-avx-x8.c
index 65e43b4..4934780 100644
--- a/src/f32-f16-vcvt/gen/vcvt-avx-x8.c
+++ b/src/f32-f16-vcvt/gen/vcvt-avx-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-neon-x16.c b/src/f32-f16-vcvt/gen/vcvt-neon-x16.c
index efd0073..9ad529c 100644
--- a/src/f32-f16-vcvt/gen/vcvt-neon-x16.c
+++ b/src/f32-f16-vcvt/gen/vcvt-neon-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-neon-x24.c b/src/f32-f16-vcvt/gen/vcvt-neon-x24.c
index 67b7008..95a0722 100644
--- a/src/f32-f16-vcvt/gen/vcvt-neon-x24.c
+++ b/src/f32-f16-vcvt/gen/vcvt-neon-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-neon-x32.c b/src/f32-f16-vcvt/gen/vcvt-neon-x32.c
index 1645dd7..f837f88 100644
--- a/src/f32-f16-vcvt/gen/vcvt-neon-x32.c
+++ b/src/f32-f16-vcvt/gen/vcvt-neon-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-neon-x8.c b/src/f32-f16-vcvt/gen/vcvt-neon-x8.c
index 016d300..c678256 100644
--- a/src/f32-f16-vcvt/gen/vcvt-neon-x8.c
+++ b/src/f32-f16-vcvt/gen/vcvt-neon-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-neonfp16-x16.c b/src/f32-f16-vcvt/gen/vcvt-neonfp16-x16.c
index cab4369..c9fd85a 100644
--- a/src/f32-f16-vcvt/gen/vcvt-neonfp16-x16.c
+++ b/src/f32-f16-vcvt/gen/vcvt-neonfp16-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-neonfp16-x8.c b/src/f32-f16-vcvt/gen/vcvt-neonfp16-x8.c
index c89bc33..b3518ce 100644
--- a/src/f32-f16-vcvt/gen/vcvt-neonfp16-x8.c
+++ b/src/f32-f16-vcvt/gen/vcvt-neonfp16-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-sse2-x16.c b/src/f32-f16-vcvt/gen/vcvt-sse2-x16.c
index 86e02d5..73835bd 100644
--- a/src/f32-f16-vcvt/gen/vcvt-sse2-x16.c
+++ b/src/f32-f16-vcvt/gen/vcvt-sse2-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-sse2-x24.c b/src/f32-f16-vcvt/gen/vcvt-sse2-x24.c
index 2f4b7cc..dce0176 100644
--- a/src/f32-f16-vcvt/gen/vcvt-sse2-x24.c
+++ b/src/f32-f16-vcvt/gen/vcvt-sse2-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-sse2-x32.c b/src/f32-f16-vcvt/gen/vcvt-sse2-x32.c
index 84013cf..83288b4 100644
--- a/src/f32-f16-vcvt/gen/vcvt-sse2-x32.c
+++ b/src/f32-f16-vcvt/gen/vcvt-sse2-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-sse2-x8.c b/src/f32-f16-vcvt/gen/vcvt-sse2-x8.c
index a600ad2..56f7a7a 100644
--- a/src/f32-f16-vcvt/gen/vcvt-sse2-x8.c
+++ b/src/f32-f16-vcvt/gen/vcvt-sse2-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-sse41-x16.c b/src/f32-f16-vcvt/gen/vcvt-sse41-x16.c
index ee39816..d3aa189 100644
--- a/src/f32-f16-vcvt/gen/vcvt-sse41-x16.c
+++ b/src/f32-f16-vcvt/gen/vcvt-sse41-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-sse41-x24.c b/src/f32-f16-vcvt/gen/vcvt-sse41-x24.c
index fe6d5df..5d8fb08 100644
--- a/src/f32-f16-vcvt/gen/vcvt-sse41-x24.c
+++ b/src/f32-f16-vcvt/gen/vcvt-sse41-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-sse41-x32.c b/src/f32-f16-vcvt/gen/vcvt-sse41-x32.c
index 0f91fe2..5ab666a 100644
--- a/src/f32-f16-vcvt/gen/vcvt-sse41-x32.c
+++ b/src/f32-f16-vcvt/gen/vcvt-sse41-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-sse41-x8.c b/src/f32-f16-vcvt/gen/vcvt-sse41-x8.c
index d204fbf..83cd2f7 100644
--- a/src/f32-f16-vcvt/gen/vcvt-sse41-x8.c
+++ b/src/f32-f16-vcvt/gen/vcvt-sse41-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x16.c b/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x16.c
index d8729c5..3e33785 100644
--- a/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x16.c
+++ b/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x24.c b/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x24.c
index 2325d6a..12a7a77 100644
--- a/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x24.c
+++ b/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x32.c b/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x32.c
index ee89d12..77fc4be 100644
--- a/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x32.c
+++ b/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x8.c b/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x8.c
index ecf647b..3bfe8c0 100644
--- a/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x8.c
+++ b/src/f32-f16-vcvt/gen/vcvt-wasmsimd-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/neon.c.in b/src/f32-f16-vcvt/neon.c.in
index b4c4844..4ce88cc 100644
--- a/src/f32-f16-vcvt/neon.c.in
+++ b/src/f32-f16-vcvt/neon.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/neonfp16.c.in b/src/f32-f16-vcvt/neonfp16.c.in
index e86a3ca..73c2c7f 100644
--- a/src/f32-f16-vcvt/neonfp16.c.in
+++ b/src/f32-f16-vcvt/neonfp16.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/sse.c.in b/src/f32-f16-vcvt/sse.c.in
index 366664f..3e9f4ef 100644
--- a/src/f32-f16-vcvt/sse.c.in
+++ b/src/f32-f16-vcvt/sse.c.in
@@ -23,7 +23,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-f16-vcvt/wasmsimd.c.in b/src/f32-f16-vcvt/wasmsimd.c.in
index 1f677c9..a5b804b 100644
--- a/src/f32-f16-vcvt/wasmsimd.c.in
+++ b/src/f32-f16-vcvt/wasmsimd.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* input,
     void* output,
-    const void* params)
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-gavgpool-cw/neon-x4.c b/src/f32-gavgpool-cw/neon-x4.c
index 3f8a38c..8d1e3da 100644
--- a/src/f32-gavgpool-cw/neon-x4.c
+++ b/src/f32-gavgpool-cw/neon-x4.c
@@ -16,7 +16,7 @@
     size_t channels,
     const float* input,
     float* output,
-    const union xnn_f32_gavgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_gavgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(elements != 0);
   assert(elements % sizeof(float) == 0);
diff --git a/src/f32-gavgpool-cw/sse-x4.c b/src/f32-gavgpool-cw/sse-x4.c
index 892a3e3..1e92ce1 100644
--- a/src/f32-gavgpool-cw/sse-x4.c
+++ b/src/f32-gavgpool-cw/sse-x4.c
@@ -16,7 +16,7 @@
     size_t channels,
     const float* input,
     float* output,
-    const union xnn_f32_gavgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_gavgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(elements != 0);
   assert(elements % sizeof(float) == 0);
diff --git a/src/f32-gavgpool-cw/wasmsimd-arm-x4.c b/src/f32-gavgpool-cw/wasmsimd-arm-x4.c
index 1497931..417c319 100644
--- a/src/f32-gavgpool-cw/wasmsimd-arm-x4.c
+++ b/src/f32-gavgpool-cw/wasmsimd-arm-x4.c
@@ -16,7 +16,7 @@
     size_t channels,
     const float* input,
     float* output,
-    const union xnn_f32_gavgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_gavgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(elements != 0);
   assert(elements % sizeof(float) == 0);
diff --git a/src/f32-gavgpool-cw/wasmsimd-x86-x4.c b/src/f32-gavgpool-cw/wasmsimd-x86-x4.c
index 8469f7d..42f7f47 100644
--- a/src/f32-gavgpool-cw/wasmsimd-x86-x4.c
+++ b/src/f32-gavgpool-cw/wasmsimd-x86-x4.c
@@ -16,7 +16,7 @@
     size_t channels,
     const float* input,
     float* output,
-    const union xnn_f32_gavgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_gavgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(elements != 0);
   assert(elements % sizeof(float) == 0);
diff --git a/src/f32-gavgpool/7p7x-minmax-neon-c4.c b/src/f32-gavgpool/7p7x-minmax-neon-c4.c
index cf98f3e..53f3060 100644
--- a/src/f32-gavgpool/7p7x-minmax-neon-c4.c
+++ b/src/f32-gavgpool/7p7x-minmax-neon-c4.c
@@ -19,7 +19,7 @@
     const float* zero,
     float* buffer,
     float* output,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/f32-gavgpool/7p7x-minmax-sse-c4.c b/src/f32-gavgpool/7p7x-minmax-sse-c4.c
index 29f395b..f4801f3 100644
--- a/src/f32-gavgpool/7p7x-minmax-sse-c4.c
+++ b/src/f32-gavgpool/7p7x-minmax-sse-c4.c
@@ -19,7 +19,7 @@
     const float* zero,
     float* buffer,
     float* output,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/f32-gavgpool/7p7x-minmax-wasmsimd-arm-c4.c b/src/f32-gavgpool/7p7x-minmax-wasmsimd-arm-c4.c
index d9c0cf6..6b1da4f 100644
--- a/src/f32-gavgpool/7p7x-minmax-wasmsimd-arm-c4.c
+++ b/src/f32-gavgpool/7p7x-minmax-wasmsimd-arm-c4.c
@@ -19,7 +19,7 @@
     const float* zero,
     float* buffer,
     float* output,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/f32-gavgpool/7p7x-minmax-wasmsimd-x86-c4.c b/src/f32-gavgpool/7p7x-minmax-wasmsimd-x86-c4.c
index c717f42..0014507 100644
--- a/src/f32-gavgpool/7p7x-minmax-wasmsimd-x86-c4.c
+++ b/src/f32-gavgpool/7p7x-minmax-wasmsimd-x86-c4.c
@@ -19,7 +19,7 @@
     const float* zero,
     float* buffer,
     float* output,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/f32-gavgpool/7x-minmax-neon-c4.c b/src/f32-gavgpool/7x-minmax-neon-c4.c
index 3cc4baa..bc482d5 100644
--- a/src/f32-gavgpool/7x-minmax-neon-c4.c
+++ b/src/f32-gavgpool/7x-minmax-neon-c4.c
@@ -17,7 +17,7 @@
     size_t input_stride,
     const float* zero,
     float* output,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/f32-gavgpool/7x-minmax-sse-c4.c b/src/f32-gavgpool/7x-minmax-sse-c4.c
index 438a809..fc76c43 100644
--- a/src/f32-gavgpool/7x-minmax-sse-c4.c
+++ b/src/f32-gavgpool/7x-minmax-sse-c4.c
@@ -17,7 +17,7 @@
     size_t input_stride,
     const float* zero,
     float* output,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/f32-gavgpool/7x-minmax-wasmsimd-arm-c4.c b/src/f32-gavgpool/7x-minmax-wasmsimd-arm-c4.c
index 2f85f97..3260f6f 100644
--- a/src/f32-gavgpool/7x-minmax-wasmsimd-arm-c4.c
+++ b/src/f32-gavgpool/7x-minmax-wasmsimd-arm-c4.c
@@ -17,7 +17,7 @@
     size_t input_stride,
     const float* zero,
     float* output,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/f32-gavgpool/7x-minmax-wasmsimd-x86-c4.c b/src/f32-gavgpool/7x-minmax-wasmsimd-x86-c4.c
index 0502f7c..9b80281 100644
--- a/src/f32-gavgpool/7x-minmax-wasmsimd-x86-c4.c
+++ b/src/f32-gavgpool/7x-minmax-wasmsimd-x86-c4.c
@@ -17,7 +17,7 @@
     size_t input_stride,
     const float* zero,
     float* output,
-    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/f32-gemm/MRx2c4-sse.c.in b/src/f32-gemm/MRx2c4-sse.c.in
index 5907ede..51690ed 100644
--- a/src/f32-gemm/MRx2c4-sse.c.in
+++ b/src/f32-gemm/MRx2c4-sse.c.in
@@ -22,7 +22,7 @@
     float* restrict c,
     size_t cm_stride,
     size_t cn_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= ${MR});
diff --git a/src/f32-gemm/MRx2c4-wasmsimd.c.in b/src/f32-gemm/MRx2c4-wasmsimd.c.in
index 9a2a295..16144f7 100644
--- a/src/f32-gemm/MRx2c4-wasmsimd.c.in
+++ b/src/f32-gemm/MRx2c4-wasmsimd.c.in
@@ -26,7 +26,7 @@
     float* restrict c,
     size_t cm_stride,
     size_t cn_stride,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= ${MR});
diff --git a/src/f32-gemm/gen/4x2c4-minmax-sse.c b/src/f32-gemm/gen/4x2c4-minmax-sse.c
index a54e32a..34c53d2 100644
--- a/src/f32-gemm/gen/4x2c4-minmax-sse.c
+++ b/src/f32-gemm/gen/4x2c4-minmax-sse.c
@@ -24,7 +24,7 @@
     float* restrict c,
     size_t cm_stride,
     size_t cn_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-gemm/gen/4x2c4-minmax-wasmsimd-arm.c b/src/f32-gemm/gen/4x2c4-minmax-wasmsimd-arm.c
index 916d0ba..3fbf8e1 100644
--- a/src/f32-gemm/gen/4x2c4-minmax-wasmsimd-arm.c
+++ b/src/f32-gemm/gen/4x2c4-minmax-wasmsimd-arm.c
@@ -24,7 +24,7 @@
     float* restrict c,
     size_t cm_stride,
     size_t cn_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-gemm/gen/4x2c4-minmax-wasmsimd-x86.c b/src/f32-gemm/gen/4x2c4-minmax-wasmsimd-x86.c
index 3564aab..78273b7 100644
--- a/src/f32-gemm/gen/4x2c4-minmax-wasmsimd-x86.c
+++ b/src/f32-gemm/gen/4x2c4-minmax-wasmsimd-x86.c
@@ -24,7 +24,7 @@
     float* restrict c,
     size_t cm_stride,
     size_t cn_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-gemm/gen/4x2c4-relu-wasmsimd.c b/src/f32-gemm/gen/4x2c4-relu-wasmsimd.c
index 1e4133a..7089ac1 100644
--- a/src/f32-gemm/gen/4x2c4-relu-wasmsimd.c
+++ b/src/f32-gemm/gen/4x2c4-relu-wasmsimd.c
@@ -24,7 +24,7 @@
     float* restrict c,
     size_t cm_stride,
     size_t cn_stride,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-gemm/gen/4x2c4-wasmsimd.c b/src/f32-gemm/gen/4x2c4-wasmsimd.c
index 5dbf1b4..86b38e3 100644
--- a/src/f32-gemm/gen/4x2c4-wasmsimd.c
+++ b/src/f32-gemm/gen/4x2c4-wasmsimd.c
@@ -24,7 +24,7 @@
     float* restrict c,
     size_t cm_stride,
     size_t cn_stride,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-ibilinear-chw/gen/neon-p4.c b/src/f32-ibilinear-chw/gen/neon-p4.c
index fc25f32..6a352dd 100644
--- a/src/f32-ibilinear-chw/gen/neon-p4.c
+++ b/src/f32-ibilinear-chw/gen/neon-p4.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/gen/neon-p8.c b/src/f32-ibilinear-chw/gen/neon-p8.c
index 7e6ffad..bb4c64f 100644
--- a/src/f32-ibilinear-chw/gen/neon-p8.c
+++ b/src/f32-ibilinear-chw/gen/neon-p8.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/gen/neonfma-p4.c b/src/f32-ibilinear-chw/gen/neonfma-p4.c
index 0675165..fff70ab 100644
--- a/src/f32-ibilinear-chw/gen/neonfma-p4.c
+++ b/src/f32-ibilinear-chw/gen/neonfma-p4.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/gen/neonfma-p8.c b/src/f32-ibilinear-chw/gen/neonfma-p8.c
index 4fb499b..12d91e2 100644
--- a/src/f32-ibilinear-chw/gen/neonfma-p8.c
+++ b/src/f32-ibilinear-chw/gen/neonfma-p8.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/gen/sse-p4.c b/src/f32-ibilinear-chw/gen/sse-p4.c
index e5da2eb..dc82167 100644
--- a/src/f32-ibilinear-chw/gen/sse-p4.c
+++ b/src/f32-ibilinear-chw/gen/sse-p4.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/gen/sse-p8.c b/src/f32-ibilinear-chw/gen/sse-p8.c
index a59da85..b182563 100644
--- a/src/f32-ibilinear-chw/gen/sse-p8.c
+++ b/src/f32-ibilinear-chw/gen/sse-p8.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/gen/wasmsimd-p4.c b/src/f32-ibilinear-chw/gen/wasmsimd-p4.c
index 080f029..7b88742 100644
--- a/src/f32-ibilinear-chw/gen/wasmsimd-p4.c
+++ b/src/f32-ibilinear-chw/gen/wasmsimd-p4.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/gen/wasmsimd-p8.c b/src/f32-ibilinear-chw/gen/wasmsimd-p8.c
index af0e918..7b83940 100644
--- a/src/f32-ibilinear-chw/gen/wasmsimd-p8.c
+++ b/src/f32-ibilinear-chw/gen/wasmsimd-p8.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/neon.c.in b/src/f32-ibilinear-chw/neon.c.in
index 8760b7d..09e9af8 100644
--- a/src/f32-ibilinear-chw/neon.c.in
+++ b/src/f32-ibilinear-chw/neon.c.in
@@ -22,7 +22,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/sse.c.in b/src/f32-ibilinear-chw/sse.c.in
index d63f001..c185303 100644
--- a/src/f32-ibilinear-chw/sse.c.in
+++ b/src/f32-ibilinear-chw/sse.c.in
@@ -20,7 +20,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear-chw/wasmsimd.c.in b/src/f32-ibilinear-chw/wasmsimd.c.in
index 1911a0b..1e3a51d 100644
--- a/src/f32-ibilinear-chw/wasmsimd.c.in
+++ b/src/f32-ibilinear-chw/wasmsimd.c.in
@@ -20,7 +20,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t input_increment) XNN_DISABLE_TSAN
+    size_t input_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/gen/neon-c4.c b/src/f32-ibilinear/gen/neon-c4.c
index becc9a0..455fa8b 100644
--- a/src/f32-ibilinear/gen/neon-c4.c
+++ b/src/f32-ibilinear/gen/neon-c4.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/gen/neon-c8.c b/src/f32-ibilinear/gen/neon-c8.c
index 000e3f3..f05e6c8 100644
--- a/src/f32-ibilinear/gen/neon-c8.c
+++ b/src/f32-ibilinear/gen/neon-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/gen/neonfma-c4.c b/src/f32-ibilinear/gen/neonfma-c4.c
index 60c4dd9..77aa072 100644
--- a/src/f32-ibilinear/gen/neonfma-c4.c
+++ b/src/f32-ibilinear/gen/neonfma-c4.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/gen/neonfma-c8.c b/src/f32-ibilinear/gen/neonfma-c8.c
index e05ef82..2ac191a 100644
--- a/src/f32-ibilinear/gen/neonfma-c8.c
+++ b/src/f32-ibilinear/gen/neonfma-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/gen/sse-c4.c b/src/f32-ibilinear/gen/sse-c4.c
index 9b2ec46..fd1aa45 100644
--- a/src/f32-ibilinear/gen/sse-c4.c
+++ b/src/f32-ibilinear/gen/sse-c4.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/gen/sse-c8.c b/src/f32-ibilinear/gen/sse-c8.c
index 04fce50..659f1e4 100644
--- a/src/f32-ibilinear/gen/sse-c8.c
+++ b/src/f32-ibilinear/gen/sse-c8.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/gen/wasmsimd-c4.c b/src/f32-ibilinear/gen/wasmsimd-c4.c
index 66e6172..3a87163 100644
--- a/src/f32-ibilinear/gen/wasmsimd-c4.c
+++ b/src/f32-ibilinear/gen/wasmsimd-c4.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/gen/wasmsimd-c8.c b/src/f32-ibilinear/gen/wasmsimd-c8.c
index 821f9cf..0c38617 100644
--- a/src/f32-ibilinear/gen/wasmsimd-c8.c
+++ b/src/f32-ibilinear/gen/wasmsimd-c8.c
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/neon.c.in b/src/f32-ibilinear/neon.c.in
index e0dea01..b74d1f4 100644
--- a/src/f32-ibilinear/neon.c.in
+++ b/src/f32-ibilinear/neon.c.in
@@ -23,7 +23,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/sse.c.in b/src/f32-ibilinear/sse.c.in
index 0c937a0..c07cd9b 100644
--- a/src/f32-ibilinear/sse.c.in
+++ b/src/f32-ibilinear/sse.c.in
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-ibilinear/wasmsimd.c.in b/src/f32-ibilinear/wasmsimd.c.in
index 7cbaa5d..ba1b2d2 100644
--- a/src/f32-ibilinear/wasmsimd.c.in
+++ b/src/f32-ibilinear/wasmsimd.c.in
@@ -21,7 +21,7 @@
     size_t input_offset,
     const float*restrict weights,
     float*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/f32-igemm/MRx2c4-sse.c.in b/src/f32-igemm/MRx2c4-sse.c.in
index 040ca7c..21c12b1 100644
--- a/src/f32-igemm/MRx2c4-sse.c.in
+++ b/src/f32-igemm/MRx2c4-sse.c.in
@@ -24,7 +24,7 @@
     size_t cn_stride,
     size_t a_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= ${MR});
diff --git a/src/f32-igemm/MRx2c4-wasmsimd.c.in b/src/f32-igemm/MRx2c4-wasmsimd.c.in
index 2633d63..cdbd460 100644
--- a/src/f32-igemm/MRx2c4-wasmsimd.c.in
+++ b/src/f32-igemm/MRx2c4-wasmsimd.c.in
@@ -28,7 +28,7 @@
     size_t cn_stride,
     size_t a_offset,
     const float* zero,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= ${MR});
diff --git a/src/f32-igemm/gen/4x2c4-minmax-sse.c b/src/f32-igemm/gen/4x2c4-minmax-sse.c
index ad8bb75..22808b9 100644
--- a/src/f32-igemm/gen/4x2c4-minmax-sse.c
+++ b/src/f32-igemm/gen/4x2c4-minmax-sse.c
@@ -26,7 +26,7 @@
     size_t cn_stride,
     size_t a_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-igemm/gen/4x2c4-minmax-wasmsimd-arm.c b/src/f32-igemm/gen/4x2c4-minmax-wasmsimd-arm.c
index ea53e92..85bd245 100644
--- a/src/f32-igemm/gen/4x2c4-minmax-wasmsimd-arm.c
+++ b/src/f32-igemm/gen/4x2c4-minmax-wasmsimd-arm.c
@@ -26,7 +26,7 @@
     size_t cn_stride,
     size_t a_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-igemm/gen/4x2c4-minmax-wasmsimd-x86.c b/src/f32-igemm/gen/4x2c4-minmax-wasmsimd-x86.c
index 424197b..a0bd7cc 100644
--- a/src/f32-igemm/gen/4x2c4-minmax-wasmsimd-x86.c
+++ b/src/f32-igemm/gen/4x2c4-minmax-wasmsimd-x86.c
@@ -26,7 +26,7 @@
     size_t cn_stride,
     size_t a_offset,
     const float* zero,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-igemm/gen/4x2c4-relu-wasmsimd.c b/src/f32-igemm/gen/4x2c4-relu-wasmsimd.c
index 7561fc7..3533b4d 100644
--- a/src/f32-igemm/gen/4x2c4-relu-wasmsimd.c
+++ b/src/f32-igemm/gen/4x2c4-relu-wasmsimd.c
@@ -26,7 +26,7 @@
     size_t cn_stride,
     size_t a_offset,
     const float* zero,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-igemm/gen/4x2c4-wasmsimd.c b/src/f32-igemm/gen/4x2c4-wasmsimd.c
index 158d114..5a19df7 100644
--- a/src/f32-igemm/gen/4x2c4-wasmsimd.c
+++ b/src/f32-igemm/gen/4x2c4-wasmsimd.c
@@ -26,7 +26,7 @@
     size_t cn_stride,
     size_t a_offset,
     const float* zero,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(mr != 0);
   assert(mr <= 4);
diff --git a/src/f32-maxpool/9p8x-minmax-neon-c4.c b/src/f32-maxpool/9p8x-minmax-neon-c4.c
index b79677b..5eb62fd 100644
--- a/src/f32-maxpool/9p8x-minmax-neon-c4.c
+++ b/src/f32-maxpool/9p8x-minmax-neon-c4.c
@@ -19,7 +19,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-maxpool/9p8x-minmax-sse-c4.c b/src/f32-maxpool/9p8x-minmax-sse-c4.c
index 978a6f4..c640d5b 100644
--- a/src/f32-maxpool/9p8x-minmax-sse-c4.c
+++ b/src/f32-maxpool/9p8x-minmax-sse-c4.c
@@ -19,7 +19,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-maxpool/9p8x-minmax-wasmsimd-arm-c4.c b/src/f32-maxpool/9p8x-minmax-wasmsimd-arm-c4.c
index 44f5e9f..76be35a 100644
--- a/src/f32-maxpool/9p8x-minmax-wasmsimd-arm-c4.c
+++ b/src/f32-maxpool/9p8x-minmax-wasmsimd-arm-c4.c
@@ -19,7 +19,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-maxpool/9p8x-minmax-wasmsimd-x86-c4.c b/src/f32-maxpool/9p8x-minmax-wasmsimd-x86-c4.c
index d6df188..5ef472c 100644
--- a/src/f32-maxpool/9p8x-minmax-wasmsimd-x86-c4.c
+++ b/src/f32-maxpool/9p8x-minmax-wasmsimd-x86-c4.c
@@ -19,7 +19,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-pavgpool/9p8x-minmax-neon-c4.c b/src/f32-pavgpool/9p8x-minmax-neon-c4.c
index 7feee32..8fc6201 100644
--- a/src/f32-pavgpool/9p8x-minmax-neon-c4.c
+++ b/src/f32-pavgpool/9p8x-minmax-neon-c4.c
@@ -22,7 +22,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/f32-pavgpool/9p8x-minmax-sse-c4.c b/src/f32-pavgpool/9p8x-minmax-sse-c4.c
index 411d7f3..f83733c 100644
--- a/src/f32-pavgpool/9p8x-minmax-sse-c4.c
+++ b/src/f32-pavgpool/9p8x-minmax-sse-c4.c
@@ -22,7 +22,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/f32-pavgpool/9p8x-minmax-wasmsimd-arm-c4.c b/src/f32-pavgpool/9p8x-minmax-wasmsimd-arm-c4.c
index e4ce182..b7c55a8 100644
--- a/src/f32-pavgpool/9p8x-minmax-wasmsimd-arm-c4.c
+++ b/src/f32-pavgpool/9p8x-minmax-wasmsimd-arm-c4.c
@@ -22,7 +22,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/f32-pavgpool/9p8x-minmax-wasmsimd-x86-c4.c b/src/f32-pavgpool/9p8x-minmax-wasmsimd-x86-c4.c
index 4f85832..576cc42 100644
--- a/src/f32-pavgpool/9p8x-minmax-wasmsimd-x86-c4.c
+++ b/src/f32-pavgpool/9p8x-minmax-wasmsimd-x86-c4.c
@@ -22,7 +22,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/f32-pavgpool/9x-minmax-neon-c4.c b/src/f32-pavgpool/9x-minmax-neon-c4.c
index d50065c..3a5d547 100644
--- a/src/f32-pavgpool/9x-minmax-neon-c4.c
+++ b/src/f32-pavgpool/9x-minmax-neon-c4.c
@@ -21,7 +21,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-pavgpool/9x-minmax-sse-c4.c b/src/f32-pavgpool/9x-minmax-sse-c4.c
index e1e9756..35be1b7 100644
--- a/src/f32-pavgpool/9x-minmax-sse-c4.c
+++ b/src/f32-pavgpool/9x-minmax-sse-c4.c
@@ -21,7 +21,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-pavgpool/9x-minmax-wasmsimd-arm-c4.c b/src/f32-pavgpool/9x-minmax-wasmsimd-arm-c4.c
index b4a27ec..ab35fbe 100644
--- a/src/f32-pavgpool/9x-minmax-wasmsimd-arm-c4.c
+++ b/src/f32-pavgpool/9x-minmax-wasmsimd-arm-c4.c
@@ -21,7 +21,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-pavgpool/9x-minmax-wasmsimd-x86-c4.c b/src/f32-pavgpool/9x-minmax-wasmsimd-x86-c4.c
index 2e36e91..6cc0818 100644
--- a/src/f32-pavgpool/9x-minmax-wasmsimd-x86-c4.c
+++ b/src/f32-pavgpool/9x-minmax-wasmsimd-x86-c4.c
@@ -21,7 +21,7 @@
     float* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/f32-prelu/gen/neon-1x16.c b/src/f32-prelu/gen/neon-1x16.c
index 1285be7..1aae13d 100644
--- a/src/f32-prelu/gen/neon-1x16.c
+++ b/src/f32-prelu/gen/neon-1x16.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/gen/neon-1x4.c b/src/f32-prelu/gen/neon-1x4.c
index 533e891..71e941c 100644
--- a/src/f32-prelu/gen/neon-1x4.c
+++ b/src/f32-prelu/gen/neon-1x4.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/gen/neon-1x8.c b/src/f32-prelu/gen/neon-1x8.c
index 91f7499..02c6c30 100644
--- a/src/f32-prelu/gen/neon-1x8.c
+++ b/src/f32-prelu/gen/neon-1x8.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/gen/neon-2x16.c b/src/f32-prelu/gen/neon-2x16.c
index 8b9ae31..608827e 100644
--- a/src/f32-prelu/gen/neon-2x16.c
+++ b/src/f32-prelu/gen/neon-2x16.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/gen/neon-2x4.c b/src/f32-prelu/gen/neon-2x4.c
index b07c396..d9eb781 100644
--- a/src/f32-prelu/gen/neon-2x4.c
+++ b/src/f32-prelu/gen/neon-2x4.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/gen/neon-2x8.c b/src/f32-prelu/gen/neon-2x8.c
index e5ac15a..3d0d1e0 100644
--- a/src/f32-prelu/gen/neon-2x8.c
+++ b/src/f32-prelu/gen/neon-2x8.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/gen/neon-4x16.c b/src/f32-prelu/gen/neon-4x16.c
index 0af769e..1b5398e 100644
--- a/src/f32-prelu/gen/neon-4x16.c
+++ b/src/f32-prelu/gen/neon-4x16.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/gen/neon-4x4.c b/src/f32-prelu/gen/neon-4x4.c
index c06f325..d00c199 100644
--- a/src/f32-prelu/gen/neon-4x4.c
+++ b/src/f32-prelu/gen/neon-4x4.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/gen/neon-4x8.c b/src/f32-prelu/gen/neon-4x8.c
index ff9ee47..94347f5 100644
--- a/src/f32-prelu/gen/neon-4x8.c
+++ b/src/f32-prelu/gen/neon-4x8.c
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-prelu/neon.c.in b/src/f32-prelu/neon.c.in
index 796cac9..c27de64 100644
--- a/src/f32-prelu/neon.c.in
+++ b/src/f32-prelu/neon.c.in
@@ -22,7 +22,7 @@
     size_t input_stride,
     const float*restrict weights,
     float*restrict output,
-    size_t output_stride) XNN_DISABLE_TSAN
+    size_t output_stride) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-neon-x16.c b/src/f32-qs8-vcvt/gen/vcvt-neon-x16.c
index f8c2782..ddb9f8c 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-neon-x16.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-neon-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-neon-x24.c b/src/f32-qs8-vcvt/gen/vcvt-neon-x24.c
index 88ab3a3..805b6ba 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-neon-x24.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-neon-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-neon-x32.c b/src/f32-qs8-vcvt/gen/vcvt-neon-x32.c
index 5c73b32..902a647 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-neon-x32.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-neon-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-neon-x8.c b/src/f32-qs8-vcvt/gen/vcvt-neon-x8.c
index 7d8b0ac..b7a43c8 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-neon-x8.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-neon-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-neonv8-x16.c b/src/f32-qs8-vcvt/gen/vcvt-neonv8-x16.c
index 68bd6e5..1de7362 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-neonv8-x16.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-neonv8-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-neonv8-x24.c b/src/f32-qs8-vcvt/gen/vcvt-neonv8-x24.c
index 9c4d3a3..7f86381 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-neonv8-x24.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-neonv8-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-neonv8-x32.c b/src/f32-qs8-vcvt/gen/vcvt-neonv8-x32.c
index 335fddd..d02f325 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-neonv8-x32.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-neonv8-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-neonv8-x8.c b/src/f32-qs8-vcvt/gen/vcvt-neonv8-x8.c
index 7a4d2fc..0d48f0a 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-neonv8-x8.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-neonv8-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-sse2-x16.c b/src/f32-qs8-vcvt/gen/vcvt-sse2-x16.c
index f8c4811..7952fcc 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-sse2-x16.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-sse2-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-sse2-x24.c b/src/f32-qs8-vcvt/gen/vcvt-sse2-x24.c
index a6482f5..0da94f3 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-sse2-x24.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-sse2-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-sse2-x32.c b/src/f32-qs8-vcvt/gen/vcvt-sse2-x32.c
index 41feb8c..39c351a 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-sse2-x32.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-sse2-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-sse2-x8.c b/src/f32-qs8-vcvt/gen/vcvt-sse2-x8.c
index 4aa85e3..3f1c9f1 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-sse2-x8.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-sse2-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-sse41-x16.c b/src/f32-qs8-vcvt/gen/vcvt-sse41-x16.c
index 3d7b47e..334d49f 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-sse41-x16.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-sse41-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-sse41-x24.c b/src/f32-qs8-vcvt/gen/vcvt-sse41-x24.c
index 467b05c..29e2ef6 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-sse41-x24.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-sse41-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-sse41-x32.c b/src/f32-qs8-vcvt/gen/vcvt-sse41-x32.c
index 22f3aeb..258ba84 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-sse41-x32.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-sse41-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-sse41-x8.c b/src/f32-qs8-vcvt/gen/vcvt-sse41-x8.c
index 35d47a4..097e082 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-sse41-x8.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-sse41-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x16.c b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x16.c
index d6411d3..4b2dd5e 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x16.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x24.c b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x24.c
index 63111ea..6f01171 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x24.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x32.c b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x32.c
index fa21575..fa6587e 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x32.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x8.c b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x8.c
index 2124004..cdcea6d 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x8.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-cvt-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x16.c b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x16.c
index 0eb2a7d..fdaf21d 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x16.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x24.c b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x24.c
index 299f0b3..3a5e0e2 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x24.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x32.c b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x32.c
index c593f4f..2cec277 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x32.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x8.c b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x8.c
index 36aa870..6abc4af 100644
--- a/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x8.c
+++ b/src/f32-qs8-vcvt/gen/vcvt-wasmsimd-magic-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     int8_t* y,
-    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qs8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/neon.c.in b/src/f32-qs8-vcvt/neon.c.in
index 300c321..abcfb13 100644
--- a/src/f32-qs8-vcvt/neon.c.in
+++ b/src/f32-qs8-vcvt/neon.c.in
@@ -37,7 +37,7 @@
     size_t n,
     const float* x,
     ${XINT8_T}* y,
-    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/neonv8.c.in b/src/f32-qs8-vcvt/neonv8.c.in
index 2b66c45..e298a7e 100644
--- a/src/f32-qs8-vcvt/neonv8.c.in
+++ b/src/f32-qs8-vcvt/neonv8.c.in
@@ -37,7 +37,7 @@
     size_t n,
     const float* x,
     ${XINT8_T}* y,
-    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/sse.c.in b/src/f32-qs8-vcvt/sse.c.in
index c3cf003..1f1f9b5 100644
--- a/src/f32-qs8-vcvt/sse.c.in
+++ b/src/f32-qs8-vcvt/sse.c.in
@@ -25,7 +25,7 @@
     size_t n,
     const float* x,
     ${XINT8_T}* y,
-    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/wasmsimd-cvt.c.in b/src/f32-qs8-vcvt/wasmsimd-cvt.c.in
index c2a6755..ed1e2b1 100644
--- a/src/f32-qs8-vcvt/wasmsimd-cvt.c.in
+++ b/src/f32-qs8-vcvt/wasmsimd-cvt.c.in
@@ -23,7 +23,7 @@
     size_t n,
     const float* x,
     ${XINT8_T}* y,
-    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qs8-vcvt/wasmsimd-magic.c.in b/src/f32-qs8-vcvt/wasmsimd-magic.c.in
index b32f108..16de7eb 100644
--- a/src/f32-qs8-vcvt/wasmsimd-magic.c.in
+++ b/src/f32-qs8-vcvt/wasmsimd-magic.c.in
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     ${XINT8_T}* y,
-    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_${DATATYPE.lower()}_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-neon-x16.c b/src/f32-qu8-vcvt/gen/vcvt-neon-x16.c
index 2954af2..d5ee94d 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-neon-x16.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-neon-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-neon-x24.c b/src/f32-qu8-vcvt/gen/vcvt-neon-x24.c
index 08157f3..a6ac04b 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-neon-x24.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-neon-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-neon-x32.c b/src/f32-qu8-vcvt/gen/vcvt-neon-x32.c
index cbd2f11..9c1800d 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-neon-x32.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-neon-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-neon-x8.c b/src/f32-qu8-vcvt/gen/vcvt-neon-x8.c
index c58c97d..878152d 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-neon-x8.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-neon-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-neonv8-x16.c b/src/f32-qu8-vcvt/gen/vcvt-neonv8-x16.c
index d532752..ef46f1f 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-neonv8-x16.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-neonv8-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-neonv8-x24.c b/src/f32-qu8-vcvt/gen/vcvt-neonv8-x24.c
index aece436..a79a942 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-neonv8-x24.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-neonv8-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-neonv8-x32.c b/src/f32-qu8-vcvt/gen/vcvt-neonv8-x32.c
index 3216260..b38cb11 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-neonv8-x32.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-neonv8-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-neonv8-x8.c b/src/f32-qu8-vcvt/gen/vcvt-neonv8-x8.c
index 8bdaeda..07af794 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-neonv8-x8.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-neonv8-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-sse2-x16.c b/src/f32-qu8-vcvt/gen/vcvt-sse2-x16.c
index 18548a7..f72c333 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-sse2-x16.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-sse2-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-sse2-x24.c b/src/f32-qu8-vcvt/gen/vcvt-sse2-x24.c
index d263ab9..4976a54 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-sse2-x24.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-sse2-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-sse2-x32.c b/src/f32-qu8-vcvt/gen/vcvt-sse2-x32.c
index 96a2b01..7d21f56 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-sse2-x32.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-sse2-x32.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-sse2-x8.c b/src/f32-qu8-vcvt/gen/vcvt-sse2-x8.c
index 9f53bc7..1ae981e 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-sse2-x8.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-sse2-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x16.c b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x16.c
index 71bdbce..2a86f30 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x16.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x24.c b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x24.c
index c1f1172..62982d9 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x24.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x32.c b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x32.c
index 3542923..a04008d 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x32.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x8.c b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x8.c
index 2b5f1c2..4f7168e 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x8.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-cvt-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x16.c b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x16.c
index a38a31c..95d4111 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x16.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x24.c b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x24.c
index b169e10..e2377d5 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x24.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x32.c b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x32.c
index 66836c0..94ad4ed 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x32.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x8.c b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x8.c
index ce82879..e4f3123 100644
--- a/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x8.c
+++ b/src/f32-qu8-vcvt/gen/vcvt-wasmsimd-magic-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     uint8_t* y,
-    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12-acc2.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12-acc2.c
index 7c47db6..58a5b16 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12-acc2.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12-acc3.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12-acc3.c
index d1158a7..794646a 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12-acc3.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12-acc3.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12.c
index 4404af8..e03ee04 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x12.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16-acc2.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16-acc2.c
index 9d5915a..afb26e2 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16-acc2.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16-acc4.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16-acc4.c
index ee7aef7..0127d6b 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16-acc4.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16-acc4.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16.c
index 3585140..015502b 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x16.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20-acc2.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20-acc2.c
index b05ba8f..1bc0622 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20-acc2.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20-acc5.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20-acc5.c
index f399db6..a8f2903 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20-acc5.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20-acc5.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20.c
index 58de4d7..be3d6cb 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x20.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x4.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x4.c
index 44a7ab0..b13670c 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x4.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x4.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x8-acc2.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x8-acc2.c
index 1f7fa3d..76e71ef 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x8-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x8-acc2.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x8.c b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x8.c
index 2f12566..fc179e0 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x8.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-lut64-p2-x8.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x12-acc2.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x12-acc2.c
index 4be8768..1c9d9d9 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x12-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x12-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x12-acc3.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x12-acc3.c
index e75d647..3acfe89 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x12-acc3.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x12-acc3.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x12.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x12.c
index 3b88886..9155f3f 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x12.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x12.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x16-acc2.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x16-acc2.c
index 81b0f6b..4fc937a 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x16-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x16-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x16-acc4.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x16-acc4.c
index 082af90..2c7f9a9 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x16-acc4.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x16-acc4.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x16.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x16.c
index 06c2007..0afad70 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x16.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x16.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x20-acc2.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x20-acc2.c
index 72f8672..d222718 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x20-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x20-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x20-acc5.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x20-acc5.c
index caaadd9..1dde551 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x20-acc5.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x20-acc5.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x20.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x20.c
index 5faeef8..22a7021 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x20.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x20.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x4.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x4.c
index 08b25bb..3a9a6ae 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x4.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x4.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x8-acc2.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x8-acc2.c
index 659db85..f87a7251 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x8-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x8-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neon-p5-x8.c b/src/f32-raddstoreexpminusmax/gen/neon-p5-x8.c
index 2868467..908b21f 100644
--- a/src/f32-raddstoreexpminusmax/gen/neon-p5-x8.c
+++ b/src/f32-raddstoreexpminusmax/gen/neon-p5-x8.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12-acc2.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12-acc2.c
index fd12c09..a61c29e 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12-acc2.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12-acc3.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12-acc3.c
index dd75ae2..4f24a00 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12-acc3.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12-acc3.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12.c
index 2651551..51094a5 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x12.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16-acc2.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16-acc2.c
index c350c2c..54bb2bb 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16-acc2.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16-acc4.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16-acc4.c
index 00eca18..83494be 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16-acc4.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16-acc4.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16.c
index f136252..b87691c 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x16.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20-acc2.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20-acc2.c
index efc9de4..ba2838a 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20-acc2.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20-acc5.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20-acc5.c
index af566eb..641a0fc 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20-acc5.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20-acc5.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20.c
index b7ee977..7f74f2f 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x20.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x4.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x4.c
index 5b7a3a1..86e18cf 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x4.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x4.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x8-acc2.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x8-acc2.c
index eea9994..4d5be4a 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x8-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x8-acc2.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x8.c b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x8.c
index 68531b8..d92b7fb 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x8.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-lut64-p2-x8.c
@@ -22,7 +22,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12-acc2.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12-acc2.c
index cf31519..d0d2baa 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12-acc3.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12-acc3.c
index 52cade8..f8d64ad 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12-acc3.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12-acc3.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12.c
index d524501..c953a1a 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x12.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16-acc2.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16-acc2.c
index ff799fc..443bcd5 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16-acc4.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16-acc4.c
index e18ea63..4c7c255 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16-acc4.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16-acc4.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16.c
index 2b40cfb..01a9a65 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x16.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20-acc2.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20-acc2.c
index bed8444..09e0bb5 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20-acc5.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20-acc5.c
index 9ebb0d9..58f581e 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20-acc5.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20-acc5.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20.c
index b047de4..c000d5d 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x20.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x4.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x4.c
index 0924a2f..a459e59 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x4.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x4.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x8-acc2.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x8-acc2.c
index d4487e6..a903a7b 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x8-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x8-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x8.c b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x8.c
index 8d3ef3d..a9a10f8 100644
--- a/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x8.c
+++ b/src/f32-raddstoreexpminusmax/gen/neonfma-p5-x8.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12-acc2.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12-acc2.c
index 08066de..2eb267b 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12-acc3.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12-acc3.c
index 1dfaf00..6619d80 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12-acc3.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12-acc3.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12.c
index 8eec41a..95b0f61 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x12.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16-acc2.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16-acc2.c
index 5b86b2f..f366e34 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16-acc4.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16-acc4.c
index 9f10615..1985639 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16-acc4.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16-acc4.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16.c
index 09b5207..cd53716 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x16.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20-acc2.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20-acc2.c
index bcee26e..42b162f 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20-acc5.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20-acc5.c
index d911402..23edc26 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20-acc5.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20-acc5.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20.c
index 1d3743e..7a35aab 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x20.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x4.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x4.c
index 84ea219..5244023 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x4.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x4.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x8-acc2.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x8-acc2.c
index c37e7f3..2f4cbc4 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x8-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x8-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x8.c b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x8.c
index d01b378..cfc94e7 100644
--- a/src/f32-raddstoreexpminusmax/gen/sse2-p5-x8.c
+++ b/src/f32-raddstoreexpminusmax/gen/sse2-p5-x8.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12-acc2.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12-acc2.c
index aea1719..2e9acb8 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12-acc3.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12-acc3.c
index db00ebc..2361694 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12-acc3.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12-acc3.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12.c
index 71d9fb4..855e33f 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x12.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16-acc2.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16-acc2.c
index 7c8071a..11fe9a9 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16-acc4.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16-acc4.c
index ac87803..85af416 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16-acc4.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16-acc4.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16.c
index c07c6a7..4d41c9c 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x16.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20-acc2.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20-acc2.c
index 0ac69d4..3a3d3d4 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20-acc5.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20-acc5.c
index 9f3d15a..f2caf12 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20-acc5.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20-acc5.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20.c
index a486828..82a7c44 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x20.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x4.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x4.c
index 7b00df1..549203e 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x4.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x4.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x8-acc2.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x8-acc2.c
index f983d67..da0e3fa 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x8-acc2.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x8-acc2.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x8.c b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x8.c
index ff357d5..8547b52 100644
--- a/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x8.c
+++ b/src/f32-raddstoreexpminusmax/gen/wasmsimd-p5-x8.c
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/neon-lut64-p2.c.in b/src/f32-raddstoreexpminusmax/neon-lut64-p2.c.in
index af27072..3f9269c 100644
--- a/src/f32-raddstoreexpminusmax/neon-lut64-p2.c.in
+++ b/src/f32-raddstoreexpminusmax/neon-lut64-p2.c.in
@@ -23,7 +23,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/neon-p5.c.in b/src/f32-raddstoreexpminusmax/neon-p5.c.in
index d2c20fe..e65581b 100644
--- a/src/f32-raddstoreexpminusmax/neon-p5.c.in
+++ b/src/f32-raddstoreexpminusmax/neon-p5.c.in
@@ -21,7 +21,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/sse2-p5.c.in b/src/f32-raddstoreexpminusmax/sse2-p5.c.in
index 2e69f40..442a813 100644
--- a/src/f32-raddstoreexpminusmax/sse2-p5.c.in
+++ b/src/f32-raddstoreexpminusmax/sse2-p5.c.in
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-raddstoreexpminusmax/wasmsimd-p5.c.in b/src/f32-raddstoreexpminusmax/wasmsimd-p5.c.in
index eee75f3..6f5a4ef 100644
--- a/src/f32-raddstoreexpminusmax/wasmsimd-p5.c.in
+++ b/src/f32-raddstoreexpminusmax/wasmsimd-p5.c.in
@@ -20,7 +20,7 @@
     const float* input,
     float* output,
     float* sum,
-    float max) XNN_DISABLE_TSAN
+    float max) XNN_OOB_READS
 {
   assert(elements % sizeof(float) == 0);
 
diff --git a/src/f32-vbinary/gen/vadd-minmax-neon-x4.c b/src/f32-vbinary/gen/vadd-minmax-neon-x4.c
index 05b1d3b..d9d5590 100644
--- a/src/f32-vbinary/gen/vadd-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vadd-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-neon-x8.c b/src/f32-vbinary/gen/vadd-minmax-neon-x8.c
index 253b937..7711bba 100644
--- a/src/f32-vbinary/gen/vadd-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vadd-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-sse-x4.c b/src/f32-vbinary/gen/vadd-minmax-sse-x4.c
index 724d423..61a3da4 100644
--- a/src/f32-vbinary/gen/vadd-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vadd-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-sse-x8.c b/src/f32-vbinary/gen/vadd-minmax-sse-x8.c
index 0fdc17a..0efaff3 100644
--- a/src/f32-vbinary/gen/vadd-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vadd-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x16.c
index 472461d..c69ecf3 100644
--- a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x4.c
index 7a1bd83..1647493 100644
--- a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x8.c
index c2508f9..9839844 100644
--- a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x16.c
index e0c6863..044c29c 100644
--- a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x4.c
index fe48771..315ccca 100644
--- a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x8.c
index 0ef2a13..d56af6a 100644
--- a/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vadd-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vadd-relu-wasmsimd-x16.c
index be374cb..5f8e117 100644
--- a/src/f32-vbinary/gen/vadd-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vadd-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vadd-relu-wasmsimd-x4.c
index 1780b4a..9920bd5 100644
--- a/src/f32-vbinary/gen/vadd-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vadd-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vadd-relu-wasmsimd-x8.c
index 6298b2a..440ccfe 100644
--- a/src/f32-vbinary/gen/vadd-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vadd-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-wasmsimd-x16.c b/src/f32-vbinary/gen/vadd-wasmsimd-x16.c
index df81054..b130a40 100644
--- a/src/f32-vbinary/gen/vadd-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vadd-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-wasmsimd-x4.c b/src/f32-vbinary/gen/vadd-wasmsimd-x4.c
index 57f24bb..d9e812b 100644
--- a/src/f32-vbinary/gen/vadd-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vadd-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vadd-wasmsimd-x8.c b/src/f32-vbinary/gen/vadd-wasmsimd-x8.c
index 35d0c10..a20df8b 100644
--- a/src/f32-vbinary/gen/vadd-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vadd-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-neon-x4.c b/src/f32-vbinary/gen/vaddc-minmax-neon-x4.c
index 318427d..39b9b95 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-neon-x8.c b/src/f32-vbinary/gen/vaddc-minmax-neon-x8.c
index 04f181b..4d8e8cf 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-sse-x4.c b/src/f32-vbinary/gen/vaddc-minmax-sse-x4.c
index 95f887c..3c7f8a6 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-sse-x8.c b/src/f32-vbinary/gen/vaddc-minmax-sse-x8.c
index c6442bf..2fd4ce4 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x16.c
index 0dadc29..c0069ce 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x4.c
index eae670f..693505c 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x8.c
index f199b23..781974d 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x16.c
index e07f245..945b592 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x4.c
index cf5c630..b2ea7c0 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x8.c
index d486a6a..6e9a9ec 100644
--- a/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vaddc-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x16.c
index 8eb7717..a93fd0a 100644
--- a/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x4.c
index dff16cd..bf31e14 100644
--- a/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x8.c
index f118daa..70295bc 100644
--- a/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vaddc-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-wasmsimd-x16.c b/src/f32-vbinary/gen/vaddc-wasmsimd-x16.c
index 566b0d7..84448a1 100644
--- a/src/f32-vbinary/gen/vaddc-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vaddc-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-wasmsimd-x4.c b/src/f32-vbinary/gen/vaddc-wasmsimd-x4.c
index 9070e07..ccef8d3 100644
--- a/src/f32-vbinary/gen/vaddc-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vaddc-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vaddc-wasmsimd-x8.c b/src/f32-vbinary/gen/vaddc-wasmsimd-x8.c
index 65eeb36..d3eade2 100644
--- a/src/f32-vbinary/gen/vaddc-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vaddc-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-neon-x4.c b/src/f32-vbinary/gen/vdiv-minmax-neon-x4.c
index 5061db7..f5c2aa5 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-neon-x8.c b/src/f32-vbinary/gen/vdiv-minmax-neon-x8.c
index fb54ad4..dd33406 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-sse-x4.c b/src/f32-vbinary/gen/vdiv-minmax-sse-x4.c
index da002d8..eca106a 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-sse-x8.c b/src/f32-vbinary/gen/vdiv-minmax-sse-x8.c
index 8aab030..6f5c005 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x16.c
index f1f6785..41964f4 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x4.c
index c60068f..185da7d 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x8.c
index a917c12..ac23b17 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x16.c
index 54a3db8..961dc6d 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x4.c
index 700676d..df7d791 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x8.c
index 85ed534..3825648 100644
--- a/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vdiv-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x16.c
index 43470a7..3b2cb6d 100644
--- a/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x4.c
index bfb370f..3680c0f 100644
--- a/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x8.c
index 8e433c8..bb388de 100644
--- a/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vdiv-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-wasmsimd-x16.c b/src/f32-vbinary/gen/vdiv-wasmsimd-x16.c
index f907b74..2f333ef 100644
--- a/src/f32-vbinary/gen/vdiv-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vdiv-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-wasmsimd-x4.c b/src/f32-vbinary/gen/vdiv-wasmsimd-x4.c
index 4d2356b..8f66447 100644
--- a/src/f32-vbinary/gen/vdiv-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vdiv-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdiv-wasmsimd-x8.c b/src/f32-vbinary/gen/vdiv-wasmsimd-x8.c
index 0e5a847..6450f51 100644
--- a/src/f32-vbinary/gen/vdiv-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vdiv-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-neon-x4.c b/src/f32-vbinary/gen/vdivc-minmax-neon-x4.c
index 5e2f89a..fec9a07 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-neon-x8.c b/src/f32-vbinary/gen/vdivc-minmax-neon-x8.c
index 1700e99..710fda1 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-sse-x4.c b/src/f32-vbinary/gen/vdivc-minmax-sse-x4.c
index cedab9e..dbfc0de 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-sse-x8.c b/src/f32-vbinary/gen/vdivc-minmax-sse-x8.c
index ad9d4fb..47349a1 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x16.c
index b451a88..440fd62 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x4.c
index 5558162..00744cf 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x8.c
index ca60a47..113d492 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x16.c
index 967a752..1ffe47a 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x4.c
index b77b31b..c3b9d27 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x8.c
index 323e277..b0ec905 100644
--- a/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vdivc-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x16.c
index c061c28..870edc2 100644
--- a/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x4.c
index 6f0e180..2568262 100644
--- a/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x8.c
index 8021798..51885ba 100644
--- a/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vdivc-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-wasmsimd-x16.c b/src/f32-vbinary/gen/vdivc-wasmsimd-x16.c
index 1c31229..ca05c51 100644
--- a/src/f32-vbinary/gen/vdivc-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vdivc-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-wasmsimd-x4.c b/src/f32-vbinary/gen/vdivc-wasmsimd-x4.c
index eac51eb..95109aa 100644
--- a/src/f32-vbinary/gen/vdivc-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vdivc-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vdivc-wasmsimd-x8.c b/src/f32-vbinary/gen/vdivc-wasmsimd-x8.c
index 08abd56..febf58e 100644
--- a/src/f32-vbinary/gen/vdivc-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vdivc-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-neon-x4.c b/src/f32-vbinary/gen/vmax-neon-x4.c
index 73a2c9e..d8385ef 100644
--- a/src/f32-vbinary/gen/vmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-neon-x8.c b/src/f32-vbinary/gen/vmax-neon-x8.c
index 416179c..0c7139d 100644
--- a/src/f32-vbinary/gen/vmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-sse-x4.c b/src/f32-vbinary/gen/vmax-sse-x4.c
index 528e9a3..01558a6 100644
--- a/src/f32-vbinary/gen/vmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-sse-x8.c b/src/f32-vbinary/gen/vmax-sse-x8.c
index 13ce65f..645a92b 100644
--- a/src/f32-vbinary/gen/vmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vmax-wasmsimd-arm-x16.c
index 3a7781b..28e873f 100644
--- a/src/f32-vbinary/gen/vmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vmax-wasmsimd-arm-x4.c
index 38f0ef1..518d0bc 100644
--- a/src/f32-vbinary/gen/vmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vmax-wasmsimd-arm-x8.c
index 1a40c8a..3777373 100644
--- a/src/f32-vbinary/gen/vmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vmax-wasmsimd-x86-x16.c
index 8d1eabd..1ebdca8 100644
--- a/src/f32-vbinary/gen/vmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vmax-wasmsimd-x86-x4.c
index 871c14a..0c7d8ac 100644
--- a/src/f32-vbinary/gen/vmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vmax-wasmsimd-x86-x8.c
index 5ea5d91..838fa86 100644
--- a/src/f32-vbinary/gen/vmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-neon-x4.c b/src/f32-vbinary/gen/vmaxc-neon-x4.c
index cb58453..0fa601c 100644
--- a/src/f32-vbinary/gen/vmaxc-neon-x4.c
+++ b/src/f32-vbinary/gen/vmaxc-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-neon-x8.c b/src/f32-vbinary/gen/vmaxc-neon-x8.c
index 04bc868..79a54d7 100644
--- a/src/f32-vbinary/gen/vmaxc-neon-x8.c
+++ b/src/f32-vbinary/gen/vmaxc-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-sse-x4.c b/src/f32-vbinary/gen/vmaxc-sse-x4.c
index 60e438d..aace044 100644
--- a/src/f32-vbinary/gen/vmaxc-sse-x4.c
+++ b/src/f32-vbinary/gen/vmaxc-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-sse-x8.c b/src/f32-vbinary/gen/vmaxc-sse-x8.c
index f593bd1..2ccc156 100644
--- a/src/f32-vbinary/gen/vmaxc-sse-x8.c
+++ b/src/f32-vbinary/gen/vmaxc-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x16.c
index a83c82b..4fb6930 100644
--- a/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x4.c
index 908949c..17fd920 100644
--- a/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x8.c
index 5c2073d..a4dd440 100644
--- a/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vmaxc-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x16.c
index e1ec720..6f89c0c 100644
--- a/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x4.c
index 23b1698..9d0e359 100644
--- a/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x8.c
index 0f118c7..3e25ee3 100644
--- a/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vmaxc-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-neon-x4.c b/src/f32-vbinary/gen/vmin-neon-x4.c
index eb1d3e1..a6de7d9 100644
--- a/src/f32-vbinary/gen/vmin-neon-x4.c
+++ b/src/f32-vbinary/gen/vmin-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-neon-x8.c b/src/f32-vbinary/gen/vmin-neon-x8.c
index 92c9142..291d4dd 100644
--- a/src/f32-vbinary/gen/vmin-neon-x8.c
+++ b/src/f32-vbinary/gen/vmin-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-sse-x4.c b/src/f32-vbinary/gen/vmin-sse-x4.c
index ae72673..7806d56 100644
--- a/src/f32-vbinary/gen/vmin-sse-x4.c
+++ b/src/f32-vbinary/gen/vmin-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-sse-x8.c b/src/f32-vbinary/gen/vmin-sse-x8.c
index 18ac48c..476499f 100644
--- a/src/f32-vbinary/gen/vmin-sse-x8.c
+++ b/src/f32-vbinary/gen/vmin-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vmin-wasmsimd-arm-x16.c
index 6a03415..01db064 100644
--- a/src/f32-vbinary/gen/vmin-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vmin-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vmin-wasmsimd-arm-x4.c
index c2d415f..3c4912f 100644
--- a/src/f32-vbinary/gen/vmin-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vmin-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vmin-wasmsimd-arm-x8.c
index 16fc3a0..81fc2ba 100644
--- a/src/f32-vbinary/gen/vmin-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vmin-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vmin-wasmsimd-x86-x16.c
index ff134d0..e7c68c1 100644
--- a/src/f32-vbinary/gen/vmin-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vmin-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vmin-wasmsimd-x86-x4.c
index c3db2f7..266477d 100644
--- a/src/f32-vbinary/gen/vmin-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vmin-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmin-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vmin-wasmsimd-x86-x8.c
index 2920c7b..42aae89 100644
--- a/src/f32-vbinary/gen/vmin-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vmin-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-neon-x4.c b/src/f32-vbinary/gen/vminc-neon-x4.c
index 13936c2..5d49e15 100644
--- a/src/f32-vbinary/gen/vminc-neon-x4.c
+++ b/src/f32-vbinary/gen/vminc-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-neon-x8.c b/src/f32-vbinary/gen/vminc-neon-x8.c
index 09e3f5a..633227a 100644
--- a/src/f32-vbinary/gen/vminc-neon-x8.c
+++ b/src/f32-vbinary/gen/vminc-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-sse-x4.c b/src/f32-vbinary/gen/vminc-sse-x4.c
index eb0d86a..4435ed6 100644
--- a/src/f32-vbinary/gen/vminc-sse-x4.c
+++ b/src/f32-vbinary/gen/vminc-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-sse-x8.c b/src/f32-vbinary/gen/vminc-sse-x8.c
index c1537a6..b82caae 100644
--- a/src/f32-vbinary/gen/vminc-sse-x8.c
+++ b/src/f32-vbinary/gen/vminc-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vminc-wasmsimd-arm-x16.c
index 658af0a..7b770b7 100644
--- a/src/f32-vbinary/gen/vminc-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vminc-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vminc-wasmsimd-arm-x4.c
index 0c37059..6522a14 100644
--- a/src/f32-vbinary/gen/vminc-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vminc-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vminc-wasmsimd-arm-x8.c
index 621b76c..f09ccbc 100644
--- a/src/f32-vbinary/gen/vminc-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vminc-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vminc-wasmsimd-x86-x16.c
index d57ae73..6a16799 100644
--- a/src/f32-vbinary/gen/vminc-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vminc-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vminc-wasmsimd-x86-x4.c
index 6943129..f5f675e 100644
--- a/src/f32-vbinary/gen/vminc-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vminc-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vminc-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vminc-wasmsimd-x86-x8.c
index 8b449a6..861c10d 100644
--- a/src/f32-vbinary/gen/vminc-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vminc-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-neon-x4.c b/src/f32-vbinary/gen/vmul-minmax-neon-x4.c
index b422031..22e5803 100644
--- a/src/f32-vbinary/gen/vmul-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vmul-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-neon-x8.c b/src/f32-vbinary/gen/vmul-minmax-neon-x8.c
index f96941d..241db1b 100644
--- a/src/f32-vbinary/gen/vmul-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vmul-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-sse-x4.c b/src/f32-vbinary/gen/vmul-minmax-sse-x4.c
index a64c71f..8048642 100644
--- a/src/f32-vbinary/gen/vmul-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vmul-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-sse-x8.c b/src/f32-vbinary/gen/vmul-minmax-sse-x8.c
index b5f58de..cd5b569 100644
--- a/src/f32-vbinary/gen/vmul-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vmul-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x16.c
index 87da18e..43e2587 100644
--- a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x4.c
index 4430f0e..8d5584e 100644
--- a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x8.c
index f138bf8..2116dac 100644
--- a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x16.c
index 7801f0e..378446c 100644
--- a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x4.c
index 5f53bb7..6c9ff76 100644
--- a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x8.c
index 4b4a53a..8588a5f 100644
--- a/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vmul-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vmul-relu-wasmsimd-x16.c
index 15783f9..2bd78c6 100644
--- a/src/f32-vbinary/gen/vmul-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vmul-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vmul-relu-wasmsimd-x4.c
index 721612e..a9b1936 100644
--- a/src/f32-vbinary/gen/vmul-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vmul-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vmul-relu-wasmsimd-x8.c
index aadc035..8602b15 100644
--- a/src/f32-vbinary/gen/vmul-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vmul-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-wasmsimd-x16.c b/src/f32-vbinary/gen/vmul-wasmsimd-x16.c
index e6daa7e..21b2412 100644
--- a/src/f32-vbinary/gen/vmul-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vmul-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-wasmsimd-x4.c b/src/f32-vbinary/gen/vmul-wasmsimd-x4.c
index 8c39c45..24de6cc 100644
--- a/src/f32-vbinary/gen/vmul-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vmul-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmul-wasmsimd-x8.c b/src/f32-vbinary/gen/vmul-wasmsimd-x8.c
index 8a271b9..aa0d0a3 100644
--- a/src/f32-vbinary/gen/vmul-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vmul-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-neon-x4.c b/src/f32-vbinary/gen/vmulc-minmax-neon-x4.c
index fc73453..418b58a 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-neon-x8.c b/src/f32-vbinary/gen/vmulc-minmax-neon-x8.c
index 46dfc89..e4ad231 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-sse-x4.c b/src/f32-vbinary/gen/vmulc-minmax-sse-x4.c
index cf6aa59..1e5321d 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-sse-x8.c b/src/f32-vbinary/gen/vmulc-minmax-sse-x8.c
index 5de510c..14923ba 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x16.c
index 9a58dc3..087085d 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x4.c
index f962e76..ebd2335 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x8.c
index db4b683..775af58 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x16.c
index cd9378e..436ff77 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x4.c
index 4d5a3b7..0f14b60 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x8.c
index 1ecb077..55314b9 100644
--- a/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vmulc-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x16.c
index cd2e493..9d68e97 100644
--- a/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x4.c
index 3483f6c..ec9e838 100644
--- a/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x8.c
index 005b7c21..9ecbc50 100644
--- a/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vmulc-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-wasmsimd-x16.c b/src/f32-vbinary/gen/vmulc-wasmsimd-x16.c
index 6f7be42..fb3f3e6 100644
--- a/src/f32-vbinary/gen/vmulc-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vmulc-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-wasmsimd-x4.c b/src/f32-vbinary/gen/vmulc-wasmsimd-x4.c
index d2fd934..b479f55 100644
--- a/src/f32-vbinary/gen/vmulc-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vmulc-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vmulc-wasmsimd-x8.c b/src/f32-vbinary/gen/vmulc-wasmsimd-x8.c
index c480b80..9a314dd 100644
--- a/src/f32-vbinary/gen/vmulc-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vmulc-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-neon-x4.c b/src/f32-vbinary/gen/vrdivc-minmax-neon-x4.c
index f7237ae..073177e 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-neon-x8.c b/src/f32-vbinary/gen/vrdivc-minmax-neon-x8.c
index 78bf9f3..503aaa8 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-sse-x4.c b/src/f32-vbinary/gen/vrdivc-minmax-sse-x4.c
index 7d439ff..877fc61 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-sse-x8.c b/src/f32-vbinary/gen/vrdivc-minmax-sse-x8.c
index 8779326..131f1ad 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x16.c
index ee8426c..aba7f7b 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x4.c
index aa1e931..5148660 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x8.c
index 449931d..1427daa 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x16.c
index e295856..8719e2b 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x4.c
index cadac6d..ece63f7 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x8.c
index 11be9db..8a79752 100644
--- a/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vrdivc-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x16.c
index 010a43e..72a5ea1 100644
--- a/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x4.c
index a09f8d2..699d675 100644
--- a/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x8.c
index 8498d20..ad23dbd 100644
--- a/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vrdivc-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-wasmsimd-x16.c b/src/f32-vbinary/gen/vrdivc-wasmsimd-x16.c
index 9493dec..5181fad 100644
--- a/src/f32-vbinary/gen/vrdivc-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vrdivc-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-wasmsimd-x4.c b/src/f32-vbinary/gen/vrdivc-wasmsimd-x4.c
index 06bbfbd..679f006 100644
--- a/src/f32-vbinary/gen/vrdivc-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vrdivc-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrdivc-wasmsimd-x8.c b/src/f32-vbinary/gen/vrdivc-wasmsimd-x8.c
index 34c9bd2..b44e06e 100644
--- a/src/f32-vbinary/gen/vrdivc-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vrdivc-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-neon-x4.c b/src/f32-vbinary/gen/vrsubc-minmax-neon-x4.c
index 0192f23..c7889e2 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-neon-x8.c b/src/f32-vbinary/gen/vrsubc-minmax-neon-x8.c
index 297a77d..cf635d1 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-sse-x4.c b/src/f32-vbinary/gen/vrsubc-minmax-sse-x4.c
index 9033d61..cd4b18c 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-sse-x8.c b/src/f32-vbinary/gen/vrsubc-minmax-sse-x8.c
index 0ca655b..75a83f5 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x16.c
index 5709442..c9b2ead 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x4.c
index e8e552d..5d76ae9 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x8.c
index ae3f2a0..70c138e 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x16.c
index aa31ce9..7cdbfda 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x4.c
index 0f07e0a..a92081a 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x8.c
index 08fb98d..42aad50 100644
--- a/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vrsubc-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x16.c
index a4b78d8..8db568f 100644
--- a/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x4.c
index 185eaae..0332c5b 100644
--- a/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x8.c
index 18f38e4..6edc8a7 100644
--- a/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vrsubc-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-wasmsimd-x16.c b/src/f32-vbinary/gen/vrsubc-wasmsimd-x16.c
index 67f657f..4f2770c 100644
--- a/src/f32-vbinary/gen/vrsubc-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vrsubc-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-wasmsimd-x4.c b/src/f32-vbinary/gen/vrsubc-wasmsimd-x4.c
index 6e2464e..61ea882 100644
--- a/src/f32-vbinary/gen/vrsubc-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vrsubc-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vrsubc-wasmsimd-x8.c b/src/f32-vbinary/gen/vrsubc-wasmsimd-x8.c
index d4f4b59..20ed53d 100644
--- a/src/f32-vbinary/gen/vrsubc-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vrsubc-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiff-neon-x4.c b/src/f32-vbinary/gen/vsqrdiff-neon-x4.c
index 6f90fd7..2192eef 100644
--- a/src/f32-vbinary/gen/vsqrdiff-neon-x4.c
+++ b/src/f32-vbinary/gen/vsqrdiff-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiff-neon-x8.c b/src/f32-vbinary/gen/vsqrdiff-neon-x8.c
index 4ccbba7..6ef8a78 100644
--- a/src/f32-vbinary/gen/vsqrdiff-neon-x8.c
+++ b/src/f32-vbinary/gen/vsqrdiff-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiff-sse-x4.c b/src/f32-vbinary/gen/vsqrdiff-sse-x4.c
index 84ec75a..7135372 100644
--- a/src/f32-vbinary/gen/vsqrdiff-sse-x4.c
+++ b/src/f32-vbinary/gen/vsqrdiff-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiff-sse-x8.c b/src/f32-vbinary/gen/vsqrdiff-sse-x8.c
index 9dca2c9..67e5d80 100644
--- a/src/f32-vbinary/gen/vsqrdiff-sse-x8.c
+++ b/src/f32-vbinary/gen/vsqrdiff-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x16.c b/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x16.c
index 298e392..78f377c 100644
--- a/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x4.c b/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x4.c
index 49cb136..2bf21df 100644
--- a/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x8.c b/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x8.c
index 97cea11..02d9ba2 100644
--- a/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vsqrdiff-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiffc-neon-x4.c b/src/f32-vbinary/gen/vsqrdiffc-neon-x4.c
index b922a97..cbbed17 100644
--- a/src/f32-vbinary/gen/vsqrdiffc-neon-x4.c
+++ b/src/f32-vbinary/gen/vsqrdiffc-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiffc-neon-x8.c b/src/f32-vbinary/gen/vsqrdiffc-neon-x8.c
index a04e8d6..4b828ed 100644
--- a/src/f32-vbinary/gen/vsqrdiffc-neon-x8.c
+++ b/src/f32-vbinary/gen/vsqrdiffc-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiffc-sse-x4.c b/src/f32-vbinary/gen/vsqrdiffc-sse-x4.c
index 6883f39..415b1c3 100644
--- a/src/f32-vbinary/gen/vsqrdiffc-sse-x4.c
+++ b/src/f32-vbinary/gen/vsqrdiffc-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiffc-sse-x8.c b/src/f32-vbinary/gen/vsqrdiffc-sse-x8.c
index 102b3b2..9f32c90 100644
--- a/src/f32-vbinary/gen/vsqrdiffc-sse-x8.c
+++ b/src/f32-vbinary/gen/vsqrdiffc-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x16.c b/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x16.c
index 2466d46..0756dfa 100644
--- a/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x4.c b/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x4.c
index ddba6b2..874ea60 100644
--- a/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x8.c b/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x8.c
index fadb351..96ab84b 100644
--- a/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vsqrdiffc-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-neon-x4.c b/src/f32-vbinary/gen/vsub-minmax-neon-x4.c
index cc0c236..ff650b6 100644
--- a/src/f32-vbinary/gen/vsub-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vsub-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-neon-x8.c b/src/f32-vbinary/gen/vsub-minmax-neon-x8.c
index fab82b3..92b3846 100644
--- a/src/f32-vbinary/gen/vsub-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vsub-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-sse-x4.c b/src/f32-vbinary/gen/vsub-minmax-sse-x4.c
index 4995bc3..8e797a8 100644
--- a/src/f32-vbinary/gen/vsub-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vsub-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-sse-x8.c b/src/f32-vbinary/gen/vsub-minmax-sse-x8.c
index 9b22986..42c28e3 100644
--- a/src/f32-vbinary/gen/vsub-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vsub-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x16.c
index 94b60ce..6df990e 100644
--- a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x4.c
index 5b2ebbd..814e8bf 100644
--- a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x8.c
index dfc56e0..491031f 100644
--- a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x16.c
index fd5856b..1c18da4 100644
--- a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x4.c
index 46b5d1d..dfd2e6a 100644
--- a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x8.c
index a31ebc7..9e142d2 100644
--- a/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vsub-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vsub-relu-wasmsimd-x16.c
index 4bebc66..804548d 100644
--- a/src/f32-vbinary/gen/vsub-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vsub-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vsub-relu-wasmsimd-x4.c
index 9f1dff7..9746d1b 100644
--- a/src/f32-vbinary/gen/vsub-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vsub-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vsub-relu-wasmsimd-x8.c
index 9f697fc..c9b61fe 100644
--- a/src/f32-vbinary/gen/vsub-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vsub-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-wasmsimd-x16.c b/src/f32-vbinary/gen/vsub-wasmsimd-x16.c
index 3d69d16..83e05d5 100644
--- a/src/f32-vbinary/gen/vsub-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vsub-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-wasmsimd-x4.c b/src/f32-vbinary/gen/vsub-wasmsimd-x4.c
index 1f5f968..62ccacf 100644
--- a/src/f32-vbinary/gen/vsub-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vsub-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsub-wasmsimd-x8.c b/src/f32-vbinary/gen/vsub-wasmsimd-x8.c
index d831196..de9d866 100644
--- a/src/f32-vbinary/gen/vsub-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vsub-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-neon-x4.c b/src/f32-vbinary/gen/vsubc-minmax-neon-x4.c
index 00c118e..7a2939a 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-neon-x4.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-neon-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-neon-x8.c b/src/f32-vbinary/gen/vsubc-minmax-neon-x8.c
index 9deb2ab..1cd0af8 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-neon-x8.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-neon-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-sse-x4.c b/src/f32-vbinary/gen/vsubc-minmax-sse-x4.c
index 14eea80..05a3036 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-sse-x4.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-sse-x4.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-sse-x8.c b/src/f32-vbinary/gen/vsubc-minmax-sse-x8.c
index 09c7929..230ebf6 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-sse-x8.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-sse-x8.c
@@ -21,7 +21,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x16.c b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x16.c
index b71eac5..98aa4d7 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x16.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x4.c b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x4.c
index 6ff4a58..cdd3d22 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x4.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x8.c b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x8.c
index 43d2006..67e5851 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x8.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-arm-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x16.c b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x16.c
index 1fdb401..cbe4f74 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x16.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x4.c b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x4.c
index 2fb74dc..06ff94b 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x4.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x8.c b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x8.c
index b0d83da..0932a89 100644
--- a/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x8.c
+++ b/src/f32-vbinary/gen/vsubc-minmax-wasmsimd-x86-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x16.c b/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x16.c
index e90a94b..2fe8826 100644
--- a/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x4.c b/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x4.c
index 3c309ef..46648ae 100644
--- a/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x8.c b/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x8.c
index b7e0dfc..3b8aeb6 100644
--- a/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vsubc-relu-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-wasmsimd-x16.c b/src/f32-vbinary/gen/vsubc-wasmsimd-x16.c
index 94d37bc..8f5f9b6 100644
--- a/src/f32-vbinary/gen/vsubc-wasmsimd-x16.c
+++ b/src/f32-vbinary/gen/vsubc-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-wasmsimd-x4.c b/src/f32-vbinary/gen/vsubc-wasmsimd-x4.c
index d604a48..a8e440a 100644
--- a/src/f32-vbinary/gen/vsubc-wasmsimd-x4.c
+++ b/src/f32-vbinary/gen/vsubc-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/gen/vsubc-wasmsimd-x8.c b/src/f32-vbinary/gen/vsubc-wasmsimd-x8.c
index 2a68905..1b34609 100644
--- a/src/f32-vbinary/gen/vsubc-wasmsimd-x8.c
+++ b/src/f32-vbinary/gen/vsubc-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_default_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/vop-neon.c.in b/src/f32-vbinary/vop-neon.c.in
index 4bc640e..22d8f23 100644
--- a/src/f32-vbinary/vop-neon.c.in
+++ b/src/f32-vbinary/vop-neon.c.in
@@ -32,7 +32,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/vop-sse.c.in b/src/f32-vbinary/vop-sse.c.in
index 7105c30..2950e4f 100644
--- a/src/f32-vbinary/vop-sse.c.in
+++ b/src/f32-vbinary/vop-sse.c.in
@@ -33,7 +33,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/vop-wasmsimd.c.in b/src/f32-vbinary/vop-wasmsimd.c.in
index 2307ed0..dc72460 100644
--- a/src/f32-vbinary/vop-wasmsimd.c.in
+++ b/src/f32-vbinary/vop-wasmsimd.c.in
@@ -33,7 +33,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/vopc-neon.c.in b/src/f32-vbinary/vopc-neon.c.in
index 987a720..a0dba29 100644
--- a/src/f32-vbinary/vopc-neon.c.in
+++ b/src/f32-vbinary/vopc-neon.c.in
@@ -34,7 +34,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/vopc-sse.c.in b/src/f32-vbinary/vopc-sse.c.in
index 8d83621..be0623a 100644
--- a/src/f32-vbinary/vopc-sse.c.in
+++ b/src/f32-vbinary/vopc-sse.c.in
@@ -35,7 +35,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vbinary/vopc-wasmsimd.c.in b/src/f32-vbinary/vopc-wasmsimd.c.in
index b4f9a5a..3aa9f27 100644
--- a/src/f32-vbinary/vopc-wasmsimd.c.in
+++ b/src/f32-vbinary/vopc-wasmsimd.c.in
@@ -36,7 +36,7 @@
     const float* a,
     const float* b,
     float* y,
-    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/gen/vclamp-neon-x4.c b/src/f32-vclamp/gen/vclamp-neon-x4.c
index fac2251..3126a75 100644
--- a/src/f32-vclamp/gen/vclamp-neon-x4.c
+++ b/src/f32-vclamp/gen/vclamp-neon-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/gen/vclamp-neon-x8.c b/src/f32-vclamp/gen/vclamp-neon-x8.c
index 5ab5757..617bfc1 100644
--- a/src/f32-vclamp/gen/vclamp-neon-x8.c
+++ b/src/f32-vclamp/gen/vclamp-neon-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/gen/vclamp-sse-x4.c b/src/f32-vclamp/gen/vclamp-sse-x4.c
index ac0d6e0..1f645df 100644
--- a/src/f32-vclamp/gen/vclamp-sse-x4.c
+++ b/src/f32-vclamp/gen/vclamp-sse-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/gen/vclamp-sse-x8.c b/src/f32-vclamp/gen/vclamp-sse-x8.c
index c241a6b..f1f8f37 100644
--- a/src/f32-vclamp/gen/vclamp-sse-x8.c
+++ b/src/f32-vclamp/gen/vclamp-sse-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/gen/vclamp-wasmsimd-arm-x4.c b/src/f32-vclamp/gen/vclamp-wasmsimd-arm-x4.c
index 075bec7..10f58c0 100644
--- a/src/f32-vclamp/gen/vclamp-wasmsimd-arm-x4.c
+++ b/src/f32-vclamp/gen/vclamp-wasmsimd-arm-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/gen/vclamp-wasmsimd-arm-x8.c b/src/f32-vclamp/gen/vclamp-wasmsimd-arm-x8.c
index 89ab577..8ec6933 100644
--- a/src/f32-vclamp/gen/vclamp-wasmsimd-arm-x8.c
+++ b/src/f32-vclamp/gen/vclamp-wasmsimd-arm-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/gen/vclamp-wasmsimd-x86-x4.c b/src/f32-vclamp/gen/vclamp-wasmsimd-x86-x4.c
index 8e3c794..00804f5 100644
--- a/src/f32-vclamp/gen/vclamp-wasmsimd-x86-x4.c
+++ b/src/f32-vclamp/gen/vclamp-wasmsimd-x86-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/gen/vclamp-wasmsimd-x86-x8.c b/src/f32-vclamp/gen/vclamp-wasmsimd-x86-x8.c
index 174a9bd..0556fa1 100644
--- a/src/f32-vclamp/gen/vclamp-wasmsimd-x86-x8.c
+++ b/src/f32-vclamp/gen/vclamp-wasmsimd-x86-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/neon.c.in b/src/f32-vclamp/neon.c.in
index 6f032f8..d49af68 100644
--- a/src/f32-vclamp/neon.c.in
+++ b/src/f32-vclamp/neon.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/sse.c.in b/src/f32-vclamp/sse.c.in
index 6d71a72..344398e 100644
--- a/src/f32-vclamp/sse.c.in
+++ b/src/f32-vclamp/sse.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vclamp/wasmsimd.c.in b/src/f32-vclamp/wasmsimd.c.in
index eef3e7f..c009fcd 100644
--- a/src/f32-vclamp/wasmsimd.c.in
+++ b/src/f32-vclamp/wasmsimd.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x12.c b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x12.c
index 470da06..8d237ee 100644
--- a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x12.c
+++ b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x16.c b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x16.c
index f3748ce..3f85f41 100644
--- a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x16.c
+++ b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x20.c b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x20.c
index 8d9192a..07c4e95 100644
--- a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x20.c
+++ b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x24.c b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x24.c
index a2d05e1..b835568 100644
--- a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x24.c
+++ b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x4.c b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x4.c
index a523733..3f25412 100644
--- a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x4.c
+++ b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x8.c b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x8.c
index cb76a8b..6c2d86b 100644
--- a/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x8.c
+++ b/src/f32-velu/gen/velu-neon-rr2-lut16-p3-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-p6-x12.c b/src/f32-velu/gen/velu-neon-rr2-p6-x12.c
index 7ea7015..1892b11 100644
--- a/src/f32-velu/gen/velu-neon-rr2-p6-x12.c
+++ b/src/f32-velu/gen/velu-neon-rr2-p6-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-p6-x16.c b/src/f32-velu/gen/velu-neon-rr2-p6-x16.c
index a0eac35..0ee3bd4 100644
--- a/src/f32-velu/gen/velu-neon-rr2-p6-x16.c
+++ b/src/f32-velu/gen/velu-neon-rr2-p6-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-p6-x20.c b/src/f32-velu/gen/velu-neon-rr2-p6-x20.c
index aa9bc26..3911d51 100644
--- a/src/f32-velu/gen/velu-neon-rr2-p6-x20.c
+++ b/src/f32-velu/gen/velu-neon-rr2-p6-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-p6-x24.c b/src/f32-velu/gen/velu-neon-rr2-p6-x24.c
index fda5fbc..3ba23c0 100644
--- a/src/f32-velu/gen/velu-neon-rr2-p6-x24.c
+++ b/src/f32-velu/gen/velu-neon-rr2-p6-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-p6-x4.c b/src/f32-velu/gen/velu-neon-rr2-p6-x4.c
index bd19860..e1b5569 100644
--- a/src/f32-velu/gen/velu-neon-rr2-p6-x4.c
+++ b/src/f32-velu/gen/velu-neon-rr2-p6-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neon-rr2-p6-x8.c b/src/f32-velu/gen/velu-neon-rr2-p6-x8.c
index b10b8de..dfe8c9e 100644
--- a/src/f32-velu/gen/velu-neon-rr2-p6-x8.c
+++ b/src/f32-velu/gen/velu-neon-rr2-p6-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x12.c b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x12.c
index f454a3d..3710baa 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x12.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x16.c b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x16.c
index 9e1acc8..3fbc1ba 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x16.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x20.c b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x20.c
index 1ea2340..2b5c685 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x20.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x24.c b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x24.c
index 7f794bf..3195109 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x24.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x4.c b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x4.c
index 8e74215..234d591 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x4.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x8.c b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x8.c
index 1cce576..5ac0f91 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x8.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-lut16-p3-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-p6-x12.c b/src/f32-velu/gen/velu-neonfma-rr1-p6-x12.c
index 7dbbfac..170f1f3 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-p6-x12.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-p6-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-p6-x16.c b/src/f32-velu/gen/velu-neonfma-rr1-p6-x16.c
index e019b9f..e1b82e6 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-p6-x16.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-p6-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-p6-x20.c b/src/f32-velu/gen/velu-neonfma-rr1-p6-x20.c
index 65d11dc..69d1254 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-p6-x20.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-p6-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-p6-x24.c b/src/f32-velu/gen/velu-neonfma-rr1-p6-x24.c
index c6bb0fa..5732464 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-p6-x24.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-p6-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-p6-x4.c b/src/f32-velu/gen/velu-neonfma-rr1-p6-x4.c
index d9c028f..3828c55 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-p6-x4.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-p6-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-neonfma-rr1-p6-x8.c b/src/f32-velu/gen/velu-neonfma-rr1-p6-x8.c
index 825c461..f1edfa4 100644
--- a/src/f32-velu/gen/velu-neonfma-rr1-p6-x8.c
+++ b/src/f32-velu/gen/velu-neonfma-rr1-p6-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x12.c b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x12.c
index 57fa9c3..a0b3819 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x12.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x16.c b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x16.c
index 7f27543..3207a1a 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x16.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x20.c b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x20.c
index 7f83f2d..95feb3d 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x20.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x24.c b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x24.c
index cc3b426..c1be319 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x24.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x4.c b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x4.c
index a57f2a8..1910512 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x4.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x8.c b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x8.c
index 765ba8f..e51869a 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x8.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-lut16-p3-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-p6-x12.c b/src/f32-velu/gen/velu-sse2-rr2-p6-x12.c
index a456a2a..23f9e12 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-p6-x12.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-p6-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-p6-x16.c b/src/f32-velu/gen/velu-sse2-rr2-p6-x16.c
index b1997c9..60e6015 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-p6-x16.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-p6-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-p6-x20.c b/src/f32-velu/gen/velu-sse2-rr2-p6-x20.c
index db77625..40c04d1 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-p6-x20.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-p6-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-p6-x24.c b/src/f32-velu/gen/velu-sse2-rr2-p6-x24.c
index 0436c39..434276a 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-p6-x24.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-p6-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-p6-x4.c b/src/f32-velu/gen/velu-sse2-rr2-p6-x4.c
index fceaa23..287dfd8 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-p6-x4.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-p6-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse2-rr2-p6-x8.c b/src/f32-velu/gen/velu-sse2-rr2-p6-x8.c
index 2aea300..72c0ff4 100644
--- a/src/f32-velu/gen/velu-sse2-rr2-p6-x8.c
+++ b/src/f32-velu/gen/velu-sse2-rr2-p6-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x12.c b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x12.c
index 1ca7833..e83717e 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x12.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x16.c b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x16.c
index a45009e..12b1fdc 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x16.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x20.c b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x20.c
index 9ff7ef9..b0cca34 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x20.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x24.c b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x24.c
index 518c397..e9e3b5e 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x24.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x4.c b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x4.c
index 6234e17..01a3c66 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x4.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x8.c b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x8.c
index 7c4aa67..00c3f02 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x8.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-lut16-p3-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-p6-x12.c b/src/f32-velu/gen/velu-sse41-rr2-p6-x12.c
index be76447..d714640 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-p6-x12.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-p6-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-p6-x16.c b/src/f32-velu/gen/velu-sse41-rr2-p6-x16.c
index bb64be9..7b89fd5 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-p6-x16.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-p6-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-p6-x20.c b/src/f32-velu/gen/velu-sse41-rr2-p6-x20.c
index 9d60679..4e01b58 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-p6-x20.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-p6-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-p6-x24.c b/src/f32-velu/gen/velu-sse41-rr2-p6-x24.c
index 365e795..bd676ec 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-p6-x24.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-p6-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-p6-x4.c b/src/f32-velu/gen/velu-sse41-rr2-p6-x4.c
index 68c92e3..a4cb086 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-p6-x4.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-p6-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-sse41-rr2-p6-x8.c b/src/f32-velu/gen/velu-sse41-rr2-p6-x8.c
index 71ac764..0a75838 100644
--- a/src/f32-velu/gen/velu-sse41-rr2-p6-x8.c
+++ b/src/f32-velu/gen/velu-sse41-rr2-p6-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x12.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x12.c
index f5c1061..a3335fc 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x12.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x16.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x16.c
index f802a80..d32a979 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x16.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x20.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x20.c
index 1350826..c9006ad 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x20.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x24.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x24.c
index dedca0a..7159886 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x24.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x4.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x4.c
index f5851b3..4650457 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x4.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x8.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x8.c
index 39f3164..07038d9 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x8.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-lut16-p3-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x12.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x12.c
index 83d87ab..88510f2 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x12.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x16.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x16.c
index c312b34..c970b91 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x16.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x20.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x20.c
index 6661c7b..57a2adf 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x20.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x24.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x24.c
index 4692180..a5bf455 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x24.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x4.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x4.c
index b1dec2f..cc308d8 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x4.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x8.c b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x8.c
index 2e69746..8da6eba 100644
--- a/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x8.c
+++ b/src/f32-velu/gen/velu-wasmsimd-arm-rr2-p6-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x12.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x12.c
index 7372905..ad453d7 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x12.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x16.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x16.c
index 1d29ff5..e24d856 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x16.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x20.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x20.c
index 6a48623..af0d220 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x20.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x24.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x24.c
index 4cf0fd0..80c9989 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x24.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x4.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x4.c
index f8a45a8..107b4c1 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x4.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x8.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x8.c
index 035ca87..e773ed5 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x8.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-lut16-p3-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x12.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x12.c
index ee79f15..9b56975 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x12.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x16.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x16.c
index ff3e97e..ba0ee70 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x16.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x20.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x20.c
index 8dd7e32..123944f 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x20.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x24.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x24.c
index ad77394..20f671f 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x24.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x4.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x4.c
index dcf5446..c128a35 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x4.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x8.c b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x8.c
index c0559e4..1889229 100644
--- a/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x8.c
+++ b/src/f32-velu/gen/velu-wasmsimd-x86-rr2-p6-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/neon-lut16-p3.c.in b/src/f32-velu/neon-lut16-p3.c.in
index 97118c3..a65d182 100644
--- a/src/f32-velu/neon-lut16-p3.c.in
+++ b/src/f32-velu/neon-lut16-p3.c.in
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/neon-p6.c.in b/src/f32-velu/neon-p6.c.in
index 4bb5325..a1ae629 100644
--- a/src/f32-velu/neon-p6.c.in
+++ b/src/f32-velu/neon-p6.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/sse-rr2-lut16-p3.c.in b/src/f32-velu/sse-rr2-lut16-p3.c.in
index 996f4cc..6a7946f 100644
--- a/src/f32-velu/sse-rr2-lut16-p3.c.in
+++ b/src/f32-velu/sse-rr2-lut16-p3.c.in
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/sse-rr2-p6.c.in b/src/f32-velu/sse-rr2-p6.c.in
index 9562a16..7db475d 100644
--- a/src/f32-velu/sse-rr2-p6.c.in
+++ b/src/f32-velu/sse-rr2-p6.c.in
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/wasmsimd-rr2-lut16-p3.c.in b/src/f32-velu/wasmsimd-rr2-lut16-p3.c.in
index cf1844d..48ae603 100644
--- a/src/f32-velu/wasmsimd-rr2-lut16-p3.c.in
+++ b/src/f32-velu/wasmsimd-rr2-lut16-p3.c.in
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-velu/wasmsimd-rr2-p6.c.in b/src/f32-velu/wasmsimd-rr2-p6.c.in
index 663bcb3..ab3ee6f 100644
--- a/src/f32-velu/wasmsimd-rr2-p6.c.in
+++ b/src/f32-velu/wasmsimd-rr2-p6.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/gen/vhswish-neon-x16.c b/src/f32-vhswish/gen/vhswish-neon-x16.c
index a48b650..f398f34 100644
--- a/src/f32-vhswish/gen/vhswish-neon-x16.c
+++ b/src/f32-vhswish/gen/vhswish-neon-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/gen/vhswish-neon-x4.c b/src/f32-vhswish/gen/vhswish-neon-x4.c
index 7bd478b..240c6c6 100644
--- a/src/f32-vhswish/gen/vhswish-neon-x4.c
+++ b/src/f32-vhswish/gen/vhswish-neon-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/gen/vhswish-neon-x8.c b/src/f32-vhswish/gen/vhswish-neon-x8.c
index c537112..6f6413d 100644
--- a/src/f32-vhswish/gen/vhswish-neon-x8.c
+++ b/src/f32-vhswish/gen/vhswish-neon-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/gen/vhswish-sse-x4.c b/src/f32-vhswish/gen/vhswish-sse-x4.c
index 0de49a7..6977378 100644
--- a/src/f32-vhswish/gen/vhswish-sse-x4.c
+++ b/src/f32-vhswish/gen/vhswish-sse-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/gen/vhswish-sse-x8.c b/src/f32-vhswish/gen/vhswish-sse-x8.c
index ba73246..aea2112 100644
--- a/src/f32-vhswish/gen/vhswish-sse-x8.c
+++ b/src/f32-vhswish/gen/vhswish-sse-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/gen/vhswish-wasmsimd-x16.c b/src/f32-vhswish/gen/vhswish-wasmsimd-x16.c
index 0bfa438..3f261ad 100644
--- a/src/f32-vhswish/gen/vhswish-wasmsimd-x16.c
+++ b/src/f32-vhswish/gen/vhswish-wasmsimd-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/gen/vhswish-wasmsimd-x4.c b/src/f32-vhswish/gen/vhswish-wasmsimd-x4.c
index 556cf33..c5f2c10 100644
--- a/src/f32-vhswish/gen/vhswish-wasmsimd-x4.c
+++ b/src/f32-vhswish/gen/vhswish-wasmsimd-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/gen/vhswish-wasmsimd-x8.c b/src/f32-vhswish/gen/vhswish-wasmsimd-x8.c
index 259a997..2acfbb3 100644
--- a/src/f32-vhswish/gen/vhswish-wasmsimd-x8.c
+++ b/src/f32-vhswish/gen/vhswish-wasmsimd-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/neon.c.in b/src/f32-vhswish/neon.c.in
index 563481b..c25c072 100644
--- a/src/f32-vhswish/neon.c.in
+++ b/src/f32-vhswish/neon.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/sse.c.in b/src/f32-vhswish/sse.c.in
index d6d7ff4..68133f7 100644
--- a/src/f32-vhswish/sse.c.in
+++ b/src/f32-vhswish/sse.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vhswish/wasmsimd.c.in b/src/f32-vhswish/wasmsimd.c.in
index 5fab5cb..391026f 100644
--- a/src/f32-vhswish/wasmsimd.c.in
+++ b/src/f32-vhswish/wasmsimd.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-neon-x4.c b/src/f32-vlrelu/gen/vlrelu-neon-x4.c
index 60920b4..2c0e75d 100644
--- a/src/f32-vlrelu/gen/vlrelu-neon-x4.c
+++ b/src/f32-vlrelu/gen/vlrelu-neon-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-neon-x8.c b/src/f32-vlrelu/gen/vlrelu-neon-x8.c
index 41ad03f..e90d7a4 100644
--- a/src/f32-vlrelu/gen/vlrelu-neon-x8.c
+++ b/src/f32-vlrelu/gen/vlrelu-neon-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-sse-x4.c b/src/f32-vlrelu/gen/vlrelu-sse-x4.c
index 651c82e..8884df9 100644
--- a/src/f32-vlrelu/gen/vlrelu-sse-x4.c
+++ b/src/f32-vlrelu/gen/vlrelu-sse-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-sse-x8.c b/src/f32-vlrelu/gen/vlrelu-sse-x8.c
index 44bbba5..6e39685 100644
--- a/src/f32-vlrelu/gen/vlrelu-sse-x8.c
+++ b/src/f32-vlrelu/gen/vlrelu-sse-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-sse2-x4.c b/src/f32-vlrelu/gen/vlrelu-sse2-x4.c
index 6147220..f7a3dc8 100644
--- a/src/f32-vlrelu/gen/vlrelu-sse2-x4.c
+++ b/src/f32-vlrelu/gen/vlrelu-sse2-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-sse2-x8.c b/src/f32-vlrelu/gen/vlrelu-sse2-x8.c
index 31ddaec..11302fc 100644
--- a/src/f32-vlrelu/gen/vlrelu-sse2-x8.c
+++ b/src/f32-vlrelu/gen/vlrelu-sse2-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-sse41-x4.c b/src/f32-vlrelu/gen/vlrelu-sse41-x4.c
index 7637953..a74d9bb 100644
--- a/src/f32-vlrelu/gen/vlrelu-sse41-x4.c
+++ b/src/f32-vlrelu/gen/vlrelu-sse41-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-sse41-x8.c b/src/f32-vlrelu/gen/vlrelu-sse41-x8.c
index ffd9885..bed306f 100644
--- a/src/f32-vlrelu/gen/vlrelu-sse41-x8.c
+++ b/src/f32-vlrelu/gen/vlrelu-sse41-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-wasmsimd-bitselect-x4.c b/src/f32-vlrelu/gen/vlrelu-wasmsimd-bitselect-x4.c
index 06ca97b..e16323c 100644
--- a/src/f32-vlrelu/gen/vlrelu-wasmsimd-bitselect-x4.c
+++ b/src/f32-vlrelu/gen/vlrelu-wasmsimd-bitselect-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-wasmsimd-bitselect-x8.c b/src/f32-vlrelu/gen/vlrelu-wasmsimd-bitselect-x8.c
index 410f6c3..4166a50 100644
--- a/src/f32-vlrelu/gen/vlrelu-wasmsimd-bitselect-x8.c
+++ b/src/f32-vlrelu/gen/vlrelu-wasmsimd-bitselect-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-wasmsimd-minmax-x4.c b/src/f32-vlrelu/gen/vlrelu-wasmsimd-minmax-x4.c
index 883420a..bfd6305 100644
--- a/src/f32-vlrelu/gen/vlrelu-wasmsimd-minmax-x4.c
+++ b/src/f32-vlrelu/gen/vlrelu-wasmsimd-minmax-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/gen/vlrelu-wasmsimd-minmax-x8.c b/src/f32-vlrelu/gen/vlrelu-wasmsimd-minmax-x8.c
index cc0e175..97836d8 100644
--- a/src/f32-vlrelu/gen/vlrelu-wasmsimd-minmax-x8.c
+++ b/src/f32-vlrelu/gen/vlrelu-wasmsimd-minmax-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/neon.c.in b/src/f32-vlrelu/neon.c.in
index 217bfe4..7b7127c 100644
--- a/src/f32-vlrelu/neon.c.in
+++ b/src/f32-vlrelu/neon.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/sse.c.in b/src/f32-vlrelu/sse.c.in
index 79d3c46..706c408 100644
--- a/src/f32-vlrelu/sse.c.in
+++ b/src/f32-vlrelu/sse.c.in
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/wasmsimd-bitselect.c.in b/src/f32-vlrelu/wasmsimd-bitselect.c.in
index 0c94260..674ca0e 100644
--- a/src/f32-vlrelu/wasmsimd-bitselect.c.in
+++ b/src/f32-vlrelu/wasmsimd-bitselect.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vlrelu/wasmsimd-minmax.c.in b/src/f32-vlrelu/wasmsimd-minmax.c.in
index f10950b..e7611be 100644
--- a/src/f32-vlrelu/wasmsimd-minmax.c.in
+++ b/src/f32-vlrelu/wasmsimd-minmax.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_lrelu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vmulcaddc/gen/c4-minmax-neon-2x.c b/src/f32-vmulcaddc/gen/c4-minmax-neon-2x.c
index 22f8dee..ef8444b 100644
--- a/src/f32-vmulcaddc/gen/c4-minmax-neon-2x.c
+++ b/src/f32-vmulcaddc/gen/c4-minmax-neon-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c4-minmax-neonfma-2x.c b/src/f32-vmulcaddc/gen/c4-minmax-neonfma-2x.c
index 06952c8..2ddd191 100644
--- a/src/f32-vmulcaddc/gen/c4-minmax-neonfma-2x.c
+++ b/src/f32-vmulcaddc/gen/c4-minmax-neonfma-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c4-minmax-sse-2x.c b/src/f32-vmulcaddc/gen/c4-minmax-sse-2x.c
index 1a76c27..4cc1101 100644
--- a/src/f32-vmulcaddc/gen/c4-minmax-sse-2x.c
+++ b/src/f32-vmulcaddc/gen/c4-minmax-sse-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c4-minmax-wasmsimd-arm-2x.c b/src/f32-vmulcaddc/gen/c4-minmax-wasmsimd-arm-2x.c
index 24a4ea1..08bb512 100644
--- a/src/f32-vmulcaddc/gen/c4-minmax-wasmsimd-arm-2x.c
+++ b/src/f32-vmulcaddc/gen/c4-minmax-wasmsimd-arm-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c4-minmax-wasmsimd-x86-2x.c b/src/f32-vmulcaddc/gen/c4-minmax-wasmsimd-x86-2x.c
index 4d7f2af..b7bbf0a 100644
--- a/src/f32-vmulcaddc/gen/c4-minmax-wasmsimd-x86-2x.c
+++ b/src/f32-vmulcaddc/gen/c4-minmax-wasmsimd-x86-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c8-minmax-neon-2x.c b/src/f32-vmulcaddc/gen/c8-minmax-neon-2x.c
index 16f9508..e063d99 100644
--- a/src/f32-vmulcaddc/gen/c8-minmax-neon-2x.c
+++ b/src/f32-vmulcaddc/gen/c8-minmax-neon-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c8-minmax-neonfma-2x.c b/src/f32-vmulcaddc/gen/c8-minmax-neonfma-2x.c
index 17bd2dc..0c3582a 100644
--- a/src/f32-vmulcaddc/gen/c8-minmax-neonfma-2x.c
+++ b/src/f32-vmulcaddc/gen/c8-minmax-neonfma-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c8-minmax-sse-2x.c b/src/f32-vmulcaddc/gen/c8-minmax-sse-2x.c
index 0a987dc..449bbe5 100644
--- a/src/f32-vmulcaddc/gen/c8-minmax-sse-2x.c
+++ b/src/f32-vmulcaddc/gen/c8-minmax-sse-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c8-minmax-wasmsimd-arm-2x.c b/src/f32-vmulcaddc/gen/c8-minmax-wasmsimd-arm-2x.c
index 56532cc..380cfce 100644
--- a/src/f32-vmulcaddc/gen/c8-minmax-wasmsimd-arm-2x.c
+++ b/src/f32-vmulcaddc/gen/c8-minmax-wasmsimd-arm-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/gen/c8-minmax-wasmsimd-x86-2x.c b/src/f32-vmulcaddc/gen/c8-minmax-wasmsimd-x86-2x.c
index 89ff6d7..5877739 100644
--- a/src/f32-vmulcaddc/gen/c8-minmax-wasmsimd-x86-2x.c
+++ b/src/f32-vmulcaddc/gen/c8-minmax-wasmsimd-x86-2x.c
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/neon.c.in b/src/f32-vmulcaddc/neon.c.in
index ce3cb94..cd08862 100644
--- a/src/f32-vmulcaddc/neon.c.in
+++ b/src/f32-vmulcaddc/neon.c.in
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/sse.c.in b/src/f32-vmulcaddc/sse.c.in
index 7860998..fa014a3 100644
--- a/src/f32-vmulcaddc/sse.c.in
+++ b/src/f32-vmulcaddc/sse.c.in
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vmulcaddc/wasmsimd.c.in b/src/f32-vmulcaddc/wasmsimd.c.in
index 8b71202..56f57ca 100644
--- a/src/f32-vmulcaddc/wasmsimd.c.in
+++ b/src/f32-vmulcaddc/wasmsimd.c.in
@@ -23,7 +23,7 @@
     const float*restrict weights,
     float*restrict output,
     size_t output_stride,
-    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(channels != 0);
diff --git a/src/f32-vrelu/gen/vrelu-neon-x4.c b/src/f32-vrelu/gen/vrelu-neon-x4.c
index 422c63f..a304a08 100644
--- a/src/f32-vrelu/gen/vrelu-neon-x4.c
+++ b/src/f32-vrelu/gen/vrelu-neon-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/gen/vrelu-neon-x8.c b/src/f32-vrelu/gen/vrelu-neon-x8.c
index ee06af6..d488e89 100644
--- a/src/f32-vrelu/gen/vrelu-neon-x8.c
+++ b/src/f32-vrelu/gen/vrelu-neon-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/gen/vrelu-sse-x4.c b/src/f32-vrelu/gen/vrelu-sse-x4.c
index ff9ae29..e5b5c71 100644
--- a/src/f32-vrelu/gen/vrelu-sse-x4.c
+++ b/src/f32-vrelu/gen/vrelu-sse-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/gen/vrelu-sse-x8.c b/src/f32-vrelu/gen/vrelu-sse-x8.c
index eec46a4..e9d594d 100644
--- a/src/f32-vrelu/gen/vrelu-sse-x8.c
+++ b/src/f32-vrelu/gen/vrelu-sse-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/gen/vrelu-wasmsimd-x16.c b/src/f32-vrelu/gen/vrelu-wasmsimd-x16.c
index cd60260..32cd552 100644
--- a/src/f32-vrelu/gen/vrelu-wasmsimd-x16.c
+++ b/src/f32-vrelu/gen/vrelu-wasmsimd-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/gen/vrelu-wasmsimd-x4.c b/src/f32-vrelu/gen/vrelu-wasmsimd-x4.c
index 418d614..63d75b3 100644
--- a/src/f32-vrelu/gen/vrelu-wasmsimd-x4.c
+++ b/src/f32-vrelu/gen/vrelu-wasmsimd-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/gen/vrelu-wasmsimd-x8.c b/src/f32-vrelu/gen/vrelu-wasmsimd-x8.c
index 3e3b4be..b3cfa00 100644
--- a/src/f32-vrelu/gen/vrelu-wasmsimd-x8.c
+++ b/src/f32-vrelu/gen/vrelu-wasmsimd-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/neon.c.in b/src/f32-vrelu/neon.c.in
index 4fe3812..e0d7b8e 100644
--- a/src/f32-vrelu/neon.c.in
+++ b/src/f32-vrelu/neon.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/sse.c.in b/src/f32-vrelu/sse.c.in
index 6d616f1..aaacdd7 100644
--- a/src/f32-vrelu/sse.c.in
+++ b/src/f32-vrelu/sse.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrelu/wasmsimd.c.in b/src/f32-vrelu/wasmsimd.c.in
index f5fbe4b..2064ecd 100644
--- a/src/f32-vrelu/wasmsimd.c.in
+++ b/src/f32-vrelu/wasmsimd.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_relu_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/avx.c.in b/src/f32-vrnd/avx.c.in
index e2c7201..b9fc2aa 100644
--- a/src/f32-vrnd/avx.c.in
+++ b/src/f32-vrnd/avx.c.in
@@ -28,7 +28,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/avx512f.c.in b/src/f32-vrnd/avx512f.c.in
index b88dd27..5eaab5e 100644
--- a/src/f32-vrnd/avx512f.c.in
+++ b/src/f32-vrnd/avx512f.c.in
@@ -27,7 +27,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-avx-x16.c b/src/f32-vrnd/gen/vrndd-avx-x16.c
index 4731e35..5dba0df 100644
--- a/src/f32-vrnd/gen/vrndd-avx-x16.c
+++ b/src/f32-vrnd/gen/vrndd-avx-x16.c
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-avx-x8.c b/src/f32-vrnd/gen/vrndd-avx-x8.c
index 8c3bf69..b110865 100644
--- a/src/f32-vrnd/gen/vrndd-avx-x8.c
+++ b/src/f32-vrnd/gen/vrndd-avx-x8.c
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-avx512f-x16.c b/src/f32-vrnd/gen/vrndd-avx512f-x16.c
index e6e6488..cc6882b 100644
--- a/src/f32-vrnd/gen/vrndd-avx512f-x16.c
+++ b/src/f32-vrnd/gen/vrndd-avx512f-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-avx512f-x32.c b/src/f32-vrnd/gen/vrndd-avx512f-x32.c
index 19f647a..42b0378 100644
--- a/src/f32-vrnd/gen/vrndd-avx512f-x32.c
+++ b/src/f32-vrnd/gen/vrndd-avx512f-x32.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-neon-x4.c b/src/f32-vrnd/gen/vrndd-neon-x4.c
index 2721c74..c687ddb 100644
--- a/src/f32-vrnd/gen/vrndd-neon-x4.c
+++ b/src/f32-vrnd/gen/vrndd-neon-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-neon-x8.c b/src/f32-vrnd/gen/vrndd-neon-x8.c
index 7511ce7..2f6461f 100644
--- a/src/f32-vrnd/gen/vrndd-neon-x8.c
+++ b/src/f32-vrnd/gen/vrndd-neon-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-neonv8-x4.c b/src/f32-vrnd/gen/vrndd-neonv8-x4.c
index 8e5174a..60d44da 100644
--- a/src/f32-vrnd/gen/vrndd-neonv8-x4.c
+++ b/src/f32-vrnd/gen/vrndd-neonv8-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-neonv8-x8.c b/src/f32-vrnd/gen/vrndd-neonv8-x8.c
index de50429..66922e9 100644
--- a/src/f32-vrnd/gen/vrndd-neonv8-x8.c
+++ b/src/f32-vrnd/gen/vrndd-neonv8-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-sse2-x4.c b/src/f32-vrnd/gen/vrndd-sse2-x4.c
index e6ddad1..e1cacb4 100644
--- a/src/f32-vrnd/gen/vrndd-sse2-x4.c
+++ b/src/f32-vrnd/gen/vrndd-sse2-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-sse2-x8.c b/src/f32-vrnd/gen/vrndd-sse2-x8.c
index ad70092..f982c0f 100644
--- a/src/f32-vrnd/gen/vrndd-sse2-x8.c
+++ b/src/f32-vrnd/gen/vrndd-sse2-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-sse41-x4.c b/src/f32-vrnd/gen/vrndd-sse41-x4.c
index 1841b99..58c2de3 100644
--- a/src/f32-vrnd/gen/vrndd-sse41-x4.c
+++ b/src/f32-vrnd/gen/vrndd-sse41-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-sse41-x8.c b/src/f32-vrnd/gen/vrndd-sse41-x8.c
index f33f8a1..8052563 100644
--- a/src/f32-vrnd/gen/vrndd-sse41-x8.c
+++ b/src/f32-vrnd/gen/vrndd-sse41-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-wasmsimd-addsub-x4.c b/src/f32-vrnd/gen/vrndd-wasmsimd-addsub-x4.c
index 9de64e9..6c4ad52 100644
--- a/src/f32-vrnd/gen/vrndd-wasmsimd-addsub-x4.c
+++ b/src/f32-vrnd/gen/vrndd-wasmsimd-addsub-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-wasmsimd-addsub-x8.c b/src/f32-vrnd/gen/vrndd-wasmsimd-addsub-x8.c
index 7e190bf..de63427 100644
--- a/src/f32-vrnd/gen/vrndd-wasmsimd-addsub-x8.c
+++ b/src/f32-vrnd/gen/vrndd-wasmsimd-addsub-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-wasmsimd-cvt-x4.c b/src/f32-vrnd/gen/vrndd-wasmsimd-cvt-x4.c
index 1ded0d5..f786d4e 100644
--- a/src/f32-vrnd/gen/vrndd-wasmsimd-cvt-x4.c
+++ b/src/f32-vrnd/gen/vrndd-wasmsimd-cvt-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-wasmsimd-cvt-x8.c b/src/f32-vrnd/gen/vrndd-wasmsimd-cvt-x8.c
index 8899951..0f30e22 100644
--- a/src/f32-vrnd/gen/vrndd-wasmsimd-cvt-x8.c
+++ b/src/f32-vrnd/gen/vrndd-wasmsimd-cvt-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-wasmsimd-native-x4.c b/src/f32-vrnd/gen/vrndd-wasmsimd-native-x4.c
index 56561f4..f05e019 100644
--- a/src/f32-vrnd/gen/vrndd-wasmsimd-native-x4.c
+++ b/src/f32-vrnd/gen/vrndd-wasmsimd-native-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndd-wasmsimd-native-x8.c b/src/f32-vrnd/gen/vrndd-wasmsimd-native-x8.c
index b216c6c..6f1e1d7 100644
--- a/src/f32-vrnd/gen/vrndd-wasmsimd-native-x8.c
+++ b/src/f32-vrnd/gen/vrndd-wasmsimd-native-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-avx-x16.c b/src/f32-vrnd/gen/vrndne-avx-x16.c
index b2bbc37..8df748b 100644
--- a/src/f32-vrnd/gen/vrndne-avx-x16.c
+++ b/src/f32-vrnd/gen/vrndne-avx-x16.c
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-avx-x8.c b/src/f32-vrnd/gen/vrndne-avx-x8.c
index ed5dbf9..3e843ad 100644
--- a/src/f32-vrnd/gen/vrndne-avx-x8.c
+++ b/src/f32-vrnd/gen/vrndne-avx-x8.c
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-avx512f-x16.c b/src/f32-vrnd/gen/vrndne-avx512f-x16.c
index 7a9f828..23afe4d 100644
--- a/src/f32-vrnd/gen/vrndne-avx512f-x16.c
+++ b/src/f32-vrnd/gen/vrndne-avx512f-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-avx512f-x32.c b/src/f32-vrnd/gen/vrndne-avx512f-x32.c
index 7596be1..e8f2ba9 100644
--- a/src/f32-vrnd/gen/vrndne-avx512f-x32.c
+++ b/src/f32-vrnd/gen/vrndne-avx512f-x32.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-neon-x4.c b/src/f32-vrnd/gen/vrndne-neon-x4.c
index 045f0c1..2ff70d1 100644
--- a/src/f32-vrnd/gen/vrndne-neon-x4.c
+++ b/src/f32-vrnd/gen/vrndne-neon-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-neon-x8.c b/src/f32-vrnd/gen/vrndne-neon-x8.c
index 3d36d61..77d9caa 100644
--- a/src/f32-vrnd/gen/vrndne-neon-x8.c
+++ b/src/f32-vrnd/gen/vrndne-neon-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-neonv8-x4.c b/src/f32-vrnd/gen/vrndne-neonv8-x4.c
index b37ab41..4ef395e 100644
--- a/src/f32-vrnd/gen/vrndne-neonv8-x4.c
+++ b/src/f32-vrnd/gen/vrndne-neonv8-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-neonv8-x8.c b/src/f32-vrnd/gen/vrndne-neonv8-x8.c
index a091b3a..58db4e1 100644
--- a/src/f32-vrnd/gen/vrndne-neonv8-x8.c
+++ b/src/f32-vrnd/gen/vrndne-neonv8-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-sse2-x4.c b/src/f32-vrnd/gen/vrndne-sse2-x4.c
index eb5f5f1..126ba1f 100644
--- a/src/f32-vrnd/gen/vrndne-sse2-x4.c
+++ b/src/f32-vrnd/gen/vrndne-sse2-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-sse2-x8.c b/src/f32-vrnd/gen/vrndne-sse2-x8.c
index 15a9692..919e80b 100644
--- a/src/f32-vrnd/gen/vrndne-sse2-x8.c
+++ b/src/f32-vrnd/gen/vrndne-sse2-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-sse41-x4.c b/src/f32-vrnd/gen/vrndne-sse41-x4.c
index ed68e3e..f6ca2b6 100644
--- a/src/f32-vrnd/gen/vrndne-sse41-x4.c
+++ b/src/f32-vrnd/gen/vrndne-sse41-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-sse41-x8.c b/src/f32-vrnd/gen/vrndne-sse41-x8.c
index ae8b5a8..21a4f47 100644
--- a/src/f32-vrnd/gen/vrndne-sse41-x8.c
+++ b/src/f32-vrnd/gen/vrndne-sse41-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-wasmsimd-addsub-x4.c b/src/f32-vrnd/gen/vrndne-wasmsimd-addsub-x4.c
index 246c858..c8163a5 100644
--- a/src/f32-vrnd/gen/vrndne-wasmsimd-addsub-x4.c
+++ b/src/f32-vrnd/gen/vrndne-wasmsimd-addsub-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-wasmsimd-addsub-x8.c b/src/f32-vrnd/gen/vrndne-wasmsimd-addsub-x8.c
index 94951fe..da97437 100644
--- a/src/f32-vrnd/gen/vrndne-wasmsimd-addsub-x8.c
+++ b/src/f32-vrnd/gen/vrndne-wasmsimd-addsub-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-wasmsimd-native-x4.c b/src/f32-vrnd/gen/vrndne-wasmsimd-native-x4.c
index 9a924c9..0f0cd1d 100644
--- a/src/f32-vrnd/gen/vrndne-wasmsimd-native-x4.c
+++ b/src/f32-vrnd/gen/vrndne-wasmsimd-native-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndne-wasmsimd-native-x8.c b/src/f32-vrnd/gen/vrndne-wasmsimd-native-x8.c
index 5c8f877..88ab064 100644
--- a/src/f32-vrnd/gen/vrndne-wasmsimd-native-x8.c
+++ b/src/f32-vrnd/gen/vrndne-wasmsimd-native-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-avx-x16.c b/src/f32-vrnd/gen/vrndu-avx-x16.c
index 2547764..1ef4549 100644
--- a/src/f32-vrnd/gen/vrndu-avx-x16.c
+++ b/src/f32-vrnd/gen/vrndu-avx-x16.c
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-avx-x8.c b/src/f32-vrnd/gen/vrndu-avx-x8.c
index bfc169b..e341f6e 100644
--- a/src/f32-vrnd/gen/vrndu-avx-x8.c
+++ b/src/f32-vrnd/gen/vrndu-avx-x8.c
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-avx512f-x16.c b/src/f32-vrnd/gen/vrndu-avx512f-x16.c
index 60119e0..dec9aa3 100644
--- a/src/f32-vrnd/gen/vrndu-avx512f-x16.c
+++ b/src/f32-vrnd/gen/vrndu-avx512f-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-avx512f-x32.c b/src/f32-vrnd/gen/vrndu-avx512f-x32.c
index 78ab47e..db692b4 100644
--- a/src/f32-vrnd/gen/vrndu-avx512f-x32.c
+++ b/src/f32-vrnd/gen/vrndu-avx512f-x32.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-neon-x4.c b/src/f32-vrnd/gen/vrndu-neon-x4.c
index 61e3a44..27c1278 100644
--- a/src/f32-vrnd/gen/vrndu-neon-x4.c
+++ b/src/f32-vrnd/gen/vrndu-neon-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-neon-x8.c b/src/f32-vrnd/gen/vrndu-neon-x8.c
index d82fe79..401fb40 100644
--- a/src/f32-vrnd/gen/vrndu-neon-x8.c
+++ b/src/f32-vrnd/gen/vrndu-neon-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-neonv8-x4.c b/src/f32-vrnd/gen/vrndu-neonv8-x4.c
index f9c292d..fc3b04a 100644
--- a/src/f32-vrnd/gen/vrndu-neonv8-x4.c
+++ b/src/f32-vrnd/gen/vrndu-neonv8-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-neonv8-x8.c b/src/f32-vrnd/gen/vrndu-neonv8-x8.c
index 4caed98..5f37f3f 100644
--- a/src/f32-vrnd/gen/vrndu-neonv8-x8.c
+++ b/src/f32-vrnd/gen/vrndu-neonv8-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-sse2-x4.c b/src/f32-vrnd/gen/vrndu-sse2-x4.c
index dc7d0e2..8d56c24 100644
--- a/src/f32-vrnd/gen/vrndu-sse2-x4.c
+++ b/src/f32-vrnd/gen/vrndu-sse2-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-sse2-x8.c b/src/f32-vrnd/gen/vrndu-sse2-x8.c
index a4187e5..9f701ff 100644
--- a/src/f32-vrnd/gen/vrndu-sse2-x8.c
+++ b/src/f32-vrnd/gen/vrndu-sse2-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-sse41-x4.c b/src/f32-vrnd/gen/vrndu-sse41-x4.c
index 7f1dff8..6603086 100644
--- a/src/f32-vrnd/gen/vrndu-sse41-x4.c
+++ b/src/f32-vrnd/gen/vrndu-sse41-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-sse41-x8.c b/src/f32-vrnd/gen/vrndu-sse41-x8.c
index 57db330..57a7996 100644
--- a/src/f32-vrnd/gen/vrndu-sse41-x8.c
+++ b/src/f32-vrnd/gen/vrndu-sse41-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-wasmsimd-addsub-x4.c b/src/f32-vrnd/gen/vrndu-wasmsimd-addsub-x4.c
index ef18a2d..c7769b9 100644
--- a/src/f32-vrnd/gen/vrndu-wasmsimd-addsub-x4.c
+++ b/src/f32-vrnd/gen/vrndu-wasmsimd-addsub-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-wasmsimd-addsub-x8.c b/src/f32-vrnd/gen/vrndu-wasmsimd-addsub-x8.c
index 777e953..702b089 100644
--- a/src/f32-vrnd/gen/vrndu-wasmsimd-addsub-x8.c
+++ b/src/f32-vrnd/gen/vrndu-wasmsimd-addsub-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-wasmsimd-cvt-x4.c b/src/f32-vrnd/gen/vrndu-wasmsimd-cvt-x4.c
index 5519203..ed93237 100644
--- a/src/f32-vrnd/gen/vrndu-wasmsimd-cvt-x4.c
+++ b/src/f32-vrnd/gen/vrndu-wasmsimd-cvt-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-wasmsimd-cvt-x8.c b/src/f32-vrnd/gen/vrndu-wasmsimd-cvt-x8.c
index 4aecab4..36f5cd9 100644
--- a/src/f32-vrnd/gen/vrndu-wasmsimd-cvt-x8.c
+++ b/src/f32-vrnd/gen/vrndu-wasmsimd-cvt-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-wasmsimd-native-x4.c b/src/f32-vrnd/gen/vrndu-wasmsimd-native-x4.c
index 27e8cda..b738c87 100644
--- a/src/f32-vrnd/gen/vrndu-wasmsimd-native-x4.c
+++ b/src/f32-vrnd/gen/vrndu-wasmsimd-native-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndu-wasmsimd-native-x8.c b/src/f32-vrnd/gen/vrndu-wasmsimd-native-x8.c
index 004c514..d999d46 100644
--- a/src/f32-vrnd/gen/vrndu-wasmsimd-native-x8.c
+++ b/src/f32-vrnd/gen/vrndu-wasmsimd-native-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-avx-x16.c b/src/f32-vrnd/gen/vrndz-avx-x16.c
index dca1414..996572b 100644
--- a/src/f32-vrnd/gen/vrndz-avx-x16.c
+++ b/src/f32-vrnd/gen/vrndz-avx-x16.c
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-avx-x8.c b/src/f32-vrnd/gen/vrndz-avx-x8.c
index 7372ec2..15ebf3a 100644
--- a/src/f32-vrnd/gen/vrndz-avx-x8.c
+++ b/src/f32-vrnd/gen/vrndz-avx-x8.c
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-avx512f-x16.c b/src/f32-vrnd/gen/vrndz-avx512f-x16.c
index ff2b161..73fcd55 100644
--- a/src/f32-vrnd/gen/vrndz-avx512f-x16.c
+++ b/src/f32-vrnd/gen/vrndz-avx512f-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-avx512f-x32.c b/src/f32-vrnd/gen/vrndz-avx512f-x32.c
index 1122415..ca31115 100644
--- a/src/f32-vrnd/gen/vrndz-avx512f-x32.c
+++ b/src/f32-vrnd/gen/vrndz-avx512f-x32.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-neon-x4.c b/src/f32-vrnd/gen/vrndz-neon-x4.c
index 1ba2421..c65a4f2 100644
--- a/src/f32-vrnd/gen/vrndz-neon-x4.c
+++ b/src/f32-vrnd/gen/vrndz-neon-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-neon-x8.c b/src/f32-vrnd/gen/vrndz-neon-x8.c
index 0346b50..c6ba21a 100644
--- a/src/f32-vrnd/gen/vrndz-neon-x8.c
+++ b/src/f32-vrnd/gen/vrndz-neon-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-neonv8-x4.c b/src/f32-vrnd/gen/vrndz-neonv8-x4.c
index 73dff45..ed4f3f4 100644
--- a/src/f32-vrnd/gen/vrndz-neonv8-x4.c
+++ b/src/f32-vrnd/gen/vrndz-neonv8-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-neonv8-x8.c b/src/f32-vrnd/gen/vrndz-neonv8-x8.c
index aa27ba5..1196fac 100644
--- a/src/f32-vrnd/gen/vrndz-neonv8-x8.c
+++ b/src/f32-vrnd/gen/vrndz-neonv8-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-sse2-x4.c b/src/f32-vrnd/gen/vrndz-sse2-x4.c
index f48a9d6..4b8267c 100644
--- a/src/f32-vrnd/gen/vrndz-sse2-x4.c
+++ b/src/f32-vrnd/gen/vrndz-sse2-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-sse2-x8.c b/src/f32-vrnd/gen/vrndz-sse2-x8.c
index 3ed2231..830229d 100644
--- a/src/f32-vrnd/gen/vrndz-sse2-x8.c
+++ b/src/f32-vrnd/gen/vrndz-sse2-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-sse41-x4.c b/src/f32-vrnd/gen/vrndz-sse41-x4.c
index a65b9e7..d2c762a 100644
--- a/src/f32-vrnd/gen/vrndz-sse41-x4.c
+++ b/src/f32-vrnd/gen/vrndz-sse41-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-sse41-x8.c b/src/f32-vrnd/gen/vrndz-sse41-x8.c
index 5e1ebf9..404e045 100644
--- a/src/f32-vrnd/gen/vrndz-sse41-x8.c
+++ b/src/f32-vrnd/gen/vrndz-sse41-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-wasmsimd-addsub-x4.c b/src/f32-vrnd/gen/vrndz-wasmsimd-addsub-x4.c
index cf5284b..82d4a28 100644
--- a/src/f32-vrnd/gen/vrndz-wasmsimd-addsub-x4.c
+++ b/src/f32-vrnd/gen/vrndz-wasmsimd-addsub-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-wasmsimd-addsub-x8.c b/src/f32-vrnd/gen/vrndz-wasmsimd-addsub-x8.c
index c029884..4f6f093 100644
--- a/src/f32-vrnd/gen/vrndz-wasmsimd-addsub-x8.c
+++ b/src/f32-vrnd/gen/vrndz-wasmsimd-addsub-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-wasmsimd-cvt-x4.c b/src/f32-vrnd/gen/vrndz-wasmsimd-cvt-x4.c
index 3d8e276..43c3939 100644
--- a/src/f32-vrnd/gen/vrndz-wasmsimd-cvt-x4.c
+++ b/src/f32-vrnd/gen/vrndz-wasmsimd-cvt-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-wasmsimd-cvt-x8.c b/src/f32-vrnd/gen/vrndz-wasmsimd-cvt-x8.c
index 186ab2e..5bba5d7 100644
--- a/src/f32-vrnd/gen/vrndz-wasmsimd-cvt-x8.c
+++ b/src/f32-vrnd/gen/vrndz-wasmsimd-cvt-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-wasmsimd-native-x4.c b/src/f32-vrnd/gen/vrndz-wasmsimd-native-x4.c
index fcf42fb..61488d1 100644
--- a/src/f32-vrnd/gen/vrndz-wasmsimd-native-x4.c
+++ b/src/f32-vrnd/gen/vrndz-wasmsimd-native-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/gen/vrndz-wasmsimd-native-x8.c b/src/f32-vrnd/gen/vrndz-wasmsimd-native-x8.c
index 79d7410..ccad93d 100644
--- a/src/f32-vrnd/gen/vrndz-wasmsimd-native-x8.c
+++ b/src/f32-vrnd/gen/vrndz-wasmsimd-native-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/neonv8.c.in b/src/f32-vrnd/neonv8.c.in
index bd7471a..8d9b042 100644
--- a/src/f32-vrnd/neonv8.c.in
+++ b/src/f32-vrnd/neonv8.c.in
@@ -26,7 +26,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/sse41.c.in b/src/f32-vrnd/sse41.c.in
index 4c3787c..d075357 100644
--- a/src/f32-vrnd/sse41.c.in
+++ b/src/f32-vrnd/sse41.c.in
@@ -26,7 +26,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndd-neon.c.in b/src/f32-vrnd/vrndd-neon.c.in
index 6fd92e2..61d368c 100644
--- a/src/f32-vrnd/vrndd-neon.c.in
+++ b/src/f32-vrnd/vrndd-neon.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndd-sse2.c.in b/src/f32-vrnd/vrndd-sse2.c.in
index c198ab1..7906467 100644
--- a/src/f32-vrnd/vrndd-sse2.c.in
+++ b/src/f32-vrnd/vrndd-sse2.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndd-wasmsimd-addsub.c.in b/src/f32-vrnd/vrndd-wasmsimd-addsub.c.in
index f5c5eb5..59965aa 100644
--- a/src/f32-vrnd/vrndd-wasmsimd-addsub.c.in
+++ b/src/f32-vrnd/vrndd-wasmsimd-addsub.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndd-wasmsimd-cvt.c.in b/src/f32-vrnd/vrndd-wasmsimd-cvt.c.in
index ea9070b..c82e5ee 100644
--- a/src/f32-vrnd/vrndd-wasmsimd-cvt.c.in
+++ b/src/f32-vrnd/vrndd-wasmsimd-cvt.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndne-neon.c.in b/src/f32-vrnd/vrndne-neon.c.in
index 79a44e3..6421ad0 100644
--- a/src/f32-vrnd/vrndne-neon.c.in
+++ b/src/f32-vrnd/vrndne-neon.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndne-sse2.c.in b/src/f32-vrnd/vrndne-sse2.c.in
index 452e12a..54bcebd 100644
--- a/src/f32-vrnd/vrndne-sse2.c.in
+++ b/src/f32-vrnd/vrndne-sse2.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndne-wasmsimd-addsub.c.in b/src/f32-vrnd/vrndne-wasmsimd-addsub.c.in
index 7fd3edf..238eec1 100644
--- a/src/f32-vrnd/vrndne-wasmsimd-addsub.c.in
+++ b/src/f32-vrnd/vrndne-wasmsimd-addsub.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndu-neon.c.in b/src/f32-vrnd/vrndu-neon.c.in
index 3a377db..90780b2 100644
--- a/src/f32-vrnd/vrndu-neon.c.in
+++ b/src/f32-vrnd/vrndu-neon.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndu-sse2.c.in b/src/f32-vrnd/vrndu-sse2.c.in
index 1ac3d31..09e6627 100644
--- a/src/f32-vrnd/vrndu-sse2.c.in
+++ b/src/f32-vrnd/vrndu-sse2.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndu-wasmsimd-addsub.c.in b/src/f32-vrnd/vrndu-wasmsimd-addsub.c.in
index f947c34..1ee68ee 100644
--- a/src/f32-vrnd/vrndu-wasmsimd-addsub.c.in
+++ b/src/f32-vrnd/vrndu-wasmsimd-addsub.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndu-wasmsimd-cvt.c.in b/src/f32-vrnd/vrndu-wasmsimd-cvt.c.in
index b1cfd96..24e5527 100644
--- a/src/f32-vrnd/vrndu-wasmsimd-cvt.c.in
+++ b/src/f32-vrnd/vrndu-wasmsimd-cvt.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndz-neon.c.in b/src/f32-vrnd/vrndz-neon.c.in
index 774b7d0..de82dfb 100644
--- a/src/f32-vrnd/vrndz-neon.c.in
+++ b/src/f32-vrnd/vrndz-neon.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndz-sse2.c.in b/src/f32-vrnd/vrndz-sse2.c.in
index 8f0b746..491a903 100644
--- a/src/f32-vrnd/vrndz-sse2.c.in
+++ b/src/f32-vrnd/vrndz-sse2.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndz-wasmsimd-addsub.c.in b/src/f32-vrnd/vrndz-wasmsimd-addsub.c.in
index 09f06f7..ec4adad 100644
--- a/src/f32-vrnd/vrndz-wasmsimd-addsub.c.in
+++ b/src/f32-vrnd/vrndz-wasmsimd-addsub.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/vrndz-wasmsimd-cvt.c.in b/src/f32-vrnd/vrndz-wasmsimd-cvt.c.in
index b7af857..72fb72e 100644
--- a/src/f32-vrnd/vrndz-wasmsimd-cvt.c.in
+++ b/src/f32-vrnd/vrndz-wasmsimd-cvt.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vrnd/wasmsimd-native.c.in b/src/f32-vrnd/wasmsimd-native.c.in
index 4049057..ac109d8 100644
--- a/src/f32-vrnd/wasmsimd-native.c.in
+++ b/src/f32-vrnd/wasmsimd-native.c.in
@@ -26,7 +26,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x12.c
index 07cd8d1..be98286 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x16.c
index c7b03ce..5e1e583 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x20.c
index 91851dd..98af5e0 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x24.c
index e3c865c..5b8a240 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x4.c
index e7e58dc..68f18ca 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x8.c
index c1b6baa..9445a34 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut2048-p1-nr2recps-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x12.c
index 9138938..15b0062 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x16.c
index a5bd7c4..b137950 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x20.c
index 356d494..1d8abcf 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x24.c
index a396b79..b8dcd87 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x4.c
index 35e62c3..a79cf8b 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x8.c
index ac79aa8..c864082 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-lut64-p2-nr2recps-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x12.c
index bf2a506..592a487 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x16.c
index d7fbf76..86cbc48 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x20.c
index 1ac696d..9f70d26 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x24.c
index 1fc82e2..1f90f19 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x4.c
index 5083dc1..2c96c2b 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x8.c
index f464888..76ea583 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neon-rr2-p5-nr2recps-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x12.c
index 2cc5083..8190e08 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x16.c
index 89d0155..8da3903 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x20.c
index ca1a5b2..a3dd248 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x24.c
index 42b3efd..205d645 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x4.c
index 41fcb77..6f34218 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x8.c
index 3c53640..228e470 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-div-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x12.c
index a6c4b80..bb55c2b 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x16.c
index 1d3f05d..3e0574e 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x20.c
index e8a4bea..206c70d 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x24.c
index 56795f2..a03ed83 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x4.c
index 10005c0..8cacb67 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x8.c
index e134e02..73aecc3 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr1recps1fma-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x12.c
index aaf5840..57297c2 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x16.c
index a709352..a8457ac 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x20.c
index 8dbaef0..8f05fb4 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x24.c
index d8d32b0..b010a41 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x4.c
index 0f554ca..797381b 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x8.c
index e5e74e1..2046967 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2fma-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x12.c
index 86eed58..2231000 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x16.c
index ed047c0..919860b 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x20.c
index b3c63c1..284f4fa 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x24.c
index 33c3636..2039b16 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x4.c
index c5b4b34..c6cac94 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x8.c
index feab875..58ec4db 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut2048-p1-nr2recps-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x12.c
index b4299d3..d5216d9 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x16.c
index c922aee..12b43fc 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x20.c
index 00f4605..bd38ca6 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x24.c
index 15912ca..82a6d65 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x4.c
index 3716a24..2fd2b75 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x8.c
index c1ecd06..6820fde 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-div-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x12.c
index 6e24147..2176251 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x16.c
index 64757c6..bf1c7e4 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x20.c
index d6b8119..cc3a1b0 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x24.c
index 16d4de8..e925edc 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x4.c
index 7cba965..a752ee8 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x8.c
index 0add020..805c7f9 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr1recps1fma-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x12.c
index af40419..d04a5ae 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x16.c
index 4df0ffb..1d20245 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x20.c
index fcf9362..8113a5c 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x24.c
index d6f96c3..3b47386 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x4.c
index f4308b8..1ca2731 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x8.c
index 54b2f68..f24f8eb 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2fma-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x12.c
index 58ba076..fea2bce 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x16.c
index 635fac1..39f8d9b 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x20.c
index 20f966c..2bcafa6 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x24.c
index 09a8fff..b3e08e2 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x4.c
index 8720e17..7470c97 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x8.c
index ca1fda5..3320fa6 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-lut64-p2-nr2recps-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x12.c
index 453d663..87cb95f 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x16.c
index 8d32e45..3b253e0 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x20.c
index b972c83..1164e50 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x24.c
index 95c04c6..fb968bf 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x4.c
index 9ca641c..ac588bc 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x8.c
index 51b7cb7..c8255c9 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-div-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x12.c
index 3563bb7..234f395 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x16.c
index 140e855..eae5fbf 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x20.c
index a201263..32bc3aa 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x24.c
index 1001fbc..d555e88 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x4.c
index e09c5d7..1830687 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x8.c
index 2dc9e44..2418cb0 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr1recps1fma-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x12.c
index 2eb7804..637a7be 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x16.c
index 30aa3da..957477f 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x20.c
index 0ab75d9..a9b18ed 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x24.c
index 438e9f3..183d553 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x4.c
index f9c6741..8a9dec7 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x8.c
index 8ffee74..5a45eec 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2fma-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x12.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x12.c
index 345e5d0..e003dbd 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x16.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x16.c
index 33ee118..8bdf089 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x20.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x20.c
index 4a240d6..7c8aff5 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x24.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x24.c
index 6a36dc9..f51cc3b 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x4.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x4.c
index a2c308c..eab4591 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x8.c b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x8.c
index ec9204e..820f432 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-neonfma-rr1-p5-nr2recps-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x12.c
index c26d899..189da8d 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x16.c
index 6c757ee..c23a411 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x20.c
index 5f4878c..f0407fb 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x24.c
index 374a9ef..402d2b5 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x4.c
index acda587..c40620a 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x8.c
index c3f6663..1c971d0 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-lut64-p2-div-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x12.c
index 24d428f..8f7b557 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x16.c
index f5867fa..61049f8 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x20.c
index a6be804..4e1d896 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x24.c
index 77ccf27..04edcdc 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x4.c
index 5f8bf06..2e7c621 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x8.c
index 47e8f78..1b53c35 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse2-p5-div-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x12.c
index 9cf7419..cfa09bb 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x16.c
index c5c41d4..9cbea0b 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x20.c
index e87b49e..b0f90f9 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x24.c
index a302fa4..9fa31dc 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x4.c
index 3fee506..08eee57 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x8.c
index 75fafed..89d1c49 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-lut64-p2-div-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x12.c
index af492f7..0d69577 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x16.c
index 081e2ca..b8a1058 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x20.c
index 99ec379..448aae5 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x24.c
index fa95451..f506231 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x4.c
index 8f032d8..1ff7e13 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x8.c
index 3348a48..0dcbdfb 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-sse41-p5-div-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x12.c
index ba85c12..6e61f6a 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x12.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x16.c
index 51dfe70..cdc6779 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x16.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x20.c
index e00b9e8..99ab0c5 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x20.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x24.c
index 1ebcd45..55303f1 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x24.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x4.c
index d979c0f..5c8c025 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x4.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x8.c
index f2e7d81..5227269 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-lut64-p2-div-x8.c
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x12.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x12.c
index b1d8b4a..afabbfd 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x12.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x12.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x16.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x16.c
index 042ff8f..4473b64 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x16.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x16.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x20.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x20.c
index 9e5392e..16ac7b9 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x20.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x20.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x24.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x24.c
index 4c6daca..bf1015a 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x24.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x24.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x4.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x4.c
index 0905c1a..e594ba1 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x4.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x8.c b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x8.c
index 2412b2d..d42616a 100644
--- a/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x8.c
+++ b/src/f32-vsigmoid/gen/vsigmoid-wasmsimd-p5-div-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/neon-lut2048-p1.c.in b/src/f32-vsigmoid/neon-lut2048-p1.c.in
index 8e69dea..283af5d 100644
--- a/src/f32-vsigmoid/neon-lut2048-p1.c.in
+++ b/src/f32-vsigmoid/neon-lut2048-p1.c.in
@@ -23,7 +23,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/neon-lut64-p2.c.in b/src/f32-vsigmoid/neon-lut64-p2.c.in
index 1bd2736..d71676c 100644
--- a/src/f32-vsigmoid/neon-lut64-p2.c.in
+++ b/src/f32-vsigmoid/neon-lut64-p2.c.in
@@ -24,7 +24,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/neon-p5.c.in b/src/f32-vsigmoid/neon-p5.c.in
index c267d73..f2095b7 100644
--- a/src/f32-vsigmoid/neon-p5.c.in
+++ b/src/f32-vsigmoid/neon-p5.c.in
@@ -21,7 +21,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/sse-lut64-p2-div.c.in b/src/f32-vsigmoid/sse-lut64-p2-div.c.in
index 6454428..21ebf2a 100644
--- a/src/f32-vsigmoid/sse-lut64-p2-div.c.in
+++ b/src/f32-vsigmoid/sse-lut64-p2-div.c.in
@@ -22,7 +22,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/sse-p5-div.c.in b/src/f32-vsigmoid/sse-p5-div.c.in
index 22881fd..bfed539 100644
--- a/src/f32-vsigmoid/sse-p5-div.c.in
+++ b/src/f32-vsigmoid/sse-p5-div.c.in
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/wasmsimd-lut64-p2-div.c.in b/src/f32-vsigmoid/wasmsimd-lut64-p2-div.c.in
index 5cc415c..f99f013 100644
--- a/src/f32-vsigmoid/wasmsimd-lut64-p2-div.c.in
+++ b/src/f32-vsigmoid/wasmsimd-lut64-p2-div.c.in
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsigmoid/wasmsimd-p5-div.c.in b/src/f32-vsigmoid/wasmsimd-p5-div.c.in
index afcd907..545f833 100644
--- a/src/f32-vsigmoid/wasmsimd-p5-div.c.in
+++ b/src/f32-vsigmoid/wasmsimd-p5-div.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n % sizeof(float) == 0);
 
diff --git a/src/f32-vsqrt/gen/neon-sqrt-x4.c b/src/f32-vsqrt/gen/neon-sqrt-x4.c
index e878b80..bee446b 100644
--- a/src/f32-vsqrt/gen/neon-sqrt-x4.c
+++ b/src/f32-vsqrt/gen/neon-sqrt-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neon-sqrt-x8.c b/src/f32-vsqrt/gen/neon-sqrt-x8.c
index 847cddf..07702ec 100644
--- a/src/f32-vsqrt/gen/neon-sqrt-x8.c
+++ b/src/f32-vsqrt/gen/neon-sqrt-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x12.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x12.c
index 81144cb..18ffc4e 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x12.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x12.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x16.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x16.c
index c065e26..195e7d7 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x16.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x20.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x20.c
index aa1c714..db7df37 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x20.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x20.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x24.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x24.c
index b8639b4..734444c 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x24.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x28.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x28.c
index 3660c98..9f70d3e 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x28.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x28.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x32.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x32.c
index e1e107a..af42766 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x32.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x36.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x36.c
index 1133d80..f0240f0 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x36.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x36.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x4.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x4.c
index 77d41f6..4ad0d3d 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x4.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x40.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x40.c
index e526cca..175ab17 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x40.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x40.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x8.c b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x8.c
index 6763ea3..7125f1b 100644
--- a/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x8.c
+++ b/src/f32-vsqrt/gen/neonfma-nr1rsqrts1fma1adj-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x12.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x12.c
index dab5924..9ccbdba 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x12.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x12.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x16.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x16.c
index 0928190..4ae9ddc 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x16.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x20.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x20.c
index 4534a25..9582999 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x20.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x20.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x24.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x24.c
index ff41591..938aab1 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x24.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x28.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x28.c
index 3d4147e..1702cba 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x28.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x28.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x32.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x32.c
index 501ac4c..a04cc6c 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x32.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x36.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x36.c
index 6069621..e36c989 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x36.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x36.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x4.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x4.c
index c5bd293..d9aa581 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x4.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x40.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x40.c
index e1b80c8..121c27f 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x40.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x40.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x8.c b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x8.c
index cb5c7cb..667bcc8 100644
--- a/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x8.c
+++ b/src/f32-vsqrt/gen/neonfma-nr2fma1adj-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/sse-sqrt-x4.c b/src/f32-vsqrt/gen/sse-sqrt-x4.c
index 3305baf..5a20259 100644
--- a/src/f32-vsqrt/gen/sse-sqrt-x4.c
+++ b/src/f32-vsqrt/gen/sse-sqrt-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/sse-sqrt-x8.c b/src/f32-vsqrt/gen/sse-sqrt-x8.c
index 233c25c..8d33b3e 100644
--- a/src/f32-vsqrt/gen/sse-sqrt-x8.c
+++ b/src/f32-vsqrt/gen/sse-sqrt-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/wasmsimd-sqrt-x4.c b/src/f32-vsqrt/gen/wasmsimd-sqrt-x4.c
index c975361..9c66aa7 100644
--- a/src/f32-vsqrt/gen/wasmsimd-sqrt-x4.c
+++ b/src/f32-vsqrt/gen/wasmsimd-sqrt-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/gen/wasmsimd-sqrt-x8.c b/src/f32-vsqrt/gen/wasmsimd-sqrt-x8.c
index 0ca3e86..3cdb025 100644
--- a/src/f32-vsqrt/gen/wasmsimd-sqrt-x8.c
+++ b/src/f32-vsqrt/gen/wasmsimd-sqrt-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/neon-sqrt.c.in b/src/f32-vsqrt/neon-sqrt.c.in
index 4a7511c..ab772e2 100644
--- a/src/f32-vsqrt/neon-sqrt.c.in
+++ b/src/f32-vsqrt/neon-sqrt.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/neonfma-nr1rsqrts1fma1adj.c.in b/src/f32-vsqrt/neonfma-nr1rsqrts1fma1adj.c.in
index 2daa5f1..1c621b2 100644
--- a/src/f32-vsqrt/neonfma-nr1rsqrts1fma1adj.c.in
+++ b/src/f32-vsqrt/neonfma-nr1rsqrts1fma1adj.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/neonfma-nr2fma1adj.c.in b/src/f32-vsqrt/neonfma-nr2fma1adj.c.in
index 5af4f68..e7d62f1 100644
--- a/src/f32-vsqrt/neonfma-nr2fma1adj.c.in
+++ b/src/f32-vsqrt/neonfma-nr2fma1adj.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/sse-sqrt.c.in b/src/f32-vsqrt/sse-sqrt.c.in
index 31717d8..6d05a24 100644
--- a/src/f32-vsqrt/sse-sqrt.c.in
+++ b/src/f32-vsqrt/sse-sqrt.c.in
@@ -18,7 +18,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vsqrt/wasmsimd-sqrt.c.in b/src/f32-vsqrt/wasmsimd-sqrt.c.in
index 0932c13..5d9fd9d 100644
--- a/src/f32-vsqrt/wasmsimd-sqrt.c.in
+++ b/src/f32-vsqrt/wasmsimd-sqrt.c.in
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_sqrt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vabs-neon-x4.c b/src/f32-vunary/gen/vabs-neon-x4.c
index 248ca7d..53fa57d 100644
--- a/src/f32-vunary/gen/vabs-neon-x4.c
+++ b/src/f32-vunary/gen/vabs-neon-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vabs-neon-x8.c b/src/f32-vunary/gen/vabs-neon-x8.c
index 702d9eb..2615804 100644
--- a/src/f32-vunary/gen/vabs-neon-x8.c
+++ b/src/f32-vunary/gen/vabs-neon-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vabs-sse-x4.c b/src/f32-vunary/gen/vabs-sse-x4.c
index bbd8fa9..f6b210f 100644
--- a/src/f32-vunary/gen/vabs-sse-x4.c
+++ b/src/f32-vunary/gen/vabs-sse-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vabs-sse-x8.c b/src/f32-vunary/gen/vabs-sse-x8.c
index 7b2a32c..f01df71 100644
--- a/src/f32-vunary/gen/vabs-sse-x8.c
+++ b/src/f32-vunary/gen/vabs-sse-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vabs-wasmsimd-x4.c b/src/f32-vunary/gen/vabs-wasmsimd-x4.c
index 5e970af..bb34aa4 100644
--- a/src/f32-vunary/gen/vabs-wasmsimd-x4.c
+++ b/src/f32-vunary/gen/vabs-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vabs-wasmsimd-x8.c b/src/f32-vunary/gen/vabs-wasmsimd-x8.c
index 0b74c41..e9a6d72 100644
--- a/src/f32-vunary/gen/vabs-wasmsimd-x8.c
+++ b/src/f32-vunary/gen/vabs-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vneg-neon-x4.c b/src/f32-vunary/gen/vneg-neon-x4.c
index 9623792..8d833d9 100644
--- a/src/f32-vunary/gen/vneg-neon-x4.c
+++ b/src/f32-vunary/gen/vneg-neon-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vneg-neon-x8.c b/src/f32-vunary/gen/vneg-neon-x8.c
index 87caed2..b115a1f 100644
--- a/src/f32-vunary/gen/vneg-neon-x8.c
+++ b/src/f32-vunary/gen/vneg-neon-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vneg-sse-x4.c b/src/f32-vunary/gen/vneg-sse-x4.c
index 1099a43..ae24404 100644
--- a/src/f32-vunary/gen/vneg-sse-x4.c
+++ b/src/f32-vunary/gen/vneg-sse-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vneg-sse-x8.c b/src/f32-vunary/gen/vneg-sse-x8.c
index e4a1f95..9703ce2 100644
--- a/src/f32-vunary/gen/vneg-sse-x8.c
+++ b/src/f32-vunary/gen/vneg-sse-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vneg-wasmsimd-x4.c b/src/f32-vunary/gen/vneg-wasmsimd-x4.c
index facdec0..47d7c45 100644
--- a/src/f32-vunary/gen/vneg-wasmsimd-x4.c
+++ b/src/f32-vunary/gen/vneg-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vneg-wasmsimd-x8.c b/src/f32-vunary/gen/vneg-wasmsimd-x8.c
index 6039a8c..c0779eb 100644
--- a/src/f32-vunary/gen/vneg-wasmsimd-x8.c
+++ b/src/f32-vunary/gen/vneg-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vsqr-neon-x4.c b/src/f32-vunary/gen/vsqr-neon-x4.c
index beb578c..8b7012d 100644
--- a/src/f32-vunary/gen/vsqr-neon-x4.c
+++ b/src/f32-vunary/gen/vsqr-neon-x4.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vsqr-neon-x8.c b/src/f32-vunary/gen/vsqr-neon-x8.c
index aaf9962..541fdb0 100644
--- a/src/f32-vunary/gen/vsqr-neon-x8.c
+++ b/src/f32-vunary/gen/vsqr-neon-x8.c
@@ -19,7 +19,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vsqr-sse-x4.c b/src/f32-vunary/gen/vsqr-sse-x4.c
index ae97d43..b99bdc2 100644
--- a/src/f32-vunary/gen/vsqr-sse-x4.c
+++ b/src/f32-vunary/gen/vsqr-sse-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vsqr-sse-x8.c b/src/f32-vunary/gen/vsqr-sse-x8.c
index cd68fb9..2d190f1 100644
--- a/src/f32-vunary/gen/vsqr-sse-x8.c
+++ b/src/f32-vunary/gen/vsqr-sse-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vsqr-wasmsimd-x4.c b/src/f32-vunary/gen/vsqr-wasmsimd-x4.c
index bdfd1f1..8e614f6 100644
--- a/src/f32-vunary/gen/vsqr-wasmsimd-x4.c
+++ b/src/f32-vunary/gen/vsqr-wasmsimd-x4.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/gen/vsqr-wasmsimd-x8.c b/src/f32-vunary/gen/vsqr-wasmsimd-x8.c
index 9d81aab..676239f 100644
--- a/src/f32-vunary/gen/vsqr-wasmsimd-x8.c
+++ b/src/f32-vunary/gen/vsqr-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const float* x,
     float* y,
-    const void* params) XNN_DISABLE_TSAN
+    const void* params) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/neon.c.in b/src/f32-vunary/neon.c.in
index 10eaa8b..330ba02 100644
--- a/src/f32-vunary/neon.c.in
+++ b/src/f32-vunary/neon.c.in
@@ -29,7 +29,7 @@
     size_t n,
     const float* x,
     float* y,
-    ${PARAMS}) XNN_DISABLE_TSAN
+    ${PARAMS}) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/sse.c.in b/src/f32-vunary/sse.c.in
index 0f4e1f2..784bbed 100644
--- a/src/f32-vunary/sse.c.in
+++ b/src/f32-vunary/sse.c.in
@@ -30,7 +30,7 @@
     size_t n,
     const float* x,
     float* y,
-    ${PARAMS}) XNN_DISABLE_TSAN
+    ${PARAMS}) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/f32-vunary/wasmsimd.c.in b/src/f32-vunary/wasmsimd.c.in
index 9d35558..7e20c4f 100644
--- a/src/f32-vunary/wasmsimd.c.in
+++ b/src/f32-vunary/wasmsimd.c.in
@@ -30,7 +30,7 @@
     size_t n,
     const float* x,
     float* y,
-    ${PARAMS}) XNN_DISABLE_TSAN
+    ${PARAMS}) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(float) == 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul16-add16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul16-add16.c
index 98fb43c..e74a5d4 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
index 589db91..dae01f1 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
index f46cd8c..8475ff3 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-add16-vpunpck.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
index 6f1ab15..559ac40 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpmovsx.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpmovsx.c
index 293a9dd..72053e8 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpmovsx.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpmovsx.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpunpck.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpunpck.c
index acb5465..f483085 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpunpck.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
index c56f0c8..5379fe9 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
index 6281f14..cc35ba9 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mla8-ld128.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mla8-ld128.c
index b76b599..bc9aca5 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mla8-ld128.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mla8-ld128.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mla8-ld64.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mla8-ld64.c
index 9a12ac1..af48044 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mla8-ld64.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mla8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
index 6618bd9..2532042 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul8-ld128.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul8-ld128.c
index aba803c..5861012 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul8-ld128.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul8-ld128.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul8-ld64.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul8-ld64.c
index 1bc69e6..245ad3a 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul8-ld64.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neon-mul8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mla8-ld128.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mla8-ld128.c
index 8079ebf..800659a 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mla8-ld128.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mla8-ld128.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mla8-ld64.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mla8-ld64.c
index 23c7892..1d1a9a3 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mla8-ld64.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mla8-ld64.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
index 4a580c7..16e2181 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul8-ld128.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul8-ld128.c
index eb90cbc..d4f186d 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul8-ld128.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul8-ld128.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul8-ld64.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul8-ld64.c
index dc2ed8c..08d604d 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul8-ld64.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul8-ld64.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16-add16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16-add16.c
index 4294265..241c38a 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
index 2933c18..042f2d0 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16-add16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16-add16.c
index 495ebb5..5bd1254 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
index 5fe9d23..dff11fc 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
index 2e6d6b6..8a38174 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16-add16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16-add16.c
index b1b6ccb..74ee938 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
index 74969e3..3edd68d 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-xop-mul16-add16.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-xop-mul16-add16.c
index 4a22055..0337e5e 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-xop-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-xop-mul16-add16.c
@@ -29,7 +29,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c b/src/qc8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
index 64d4b37..8f8ff1e 100644
--- a/src/qc8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
+++ b/src/qc8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul16-add16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul16-add16.c
index 1a04a6d..b8b2934 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
index 6af67ec..fd89fe6 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
index b5686ca..4da3851 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-add16-vpunpck.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
index 9ef9d61..2b76b4c 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpmovsx.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpmovsx.c
index 00fc07e..0cab006 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpmovsx.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpmovsx.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpunpck.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpunpck.c
index 1cf047c..f47e6d2 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpunpck.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
index 669a727..da2f3ae 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
index f9943e3..740148c 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mla8-ld128.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mla8-ld128.c
index c39120f..ebb04fa 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mla8-ld128.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mla8-ld128.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mla8-ld64.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mla8-ld64.c
index 2eb87d0..e2fd530 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mla8-ld64.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mla8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
index 1d6bfd8..24f473e 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul8-ld128.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul8-ld128.c
index 1dd07f3..dda038a 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul8-ld128.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul8-ld128.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul8-ld64.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul8-ld64.c
index c303668..1555cb2 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul8-ld64.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neon-mul8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mla8-ld128.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mla8-ld128.c
index 956431b..d05333e 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mla8-ld128.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mla8-ld128.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mla8-ld64.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mla8-ld64.c
index 2ea982d..b5393b3 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mla8-ld64.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mla8-ld64.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
index 9cabec4..eed46d4 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul8-ld128.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul8-ld128.c
index cd3468d..dbd6932 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul8-ld128.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul8-ld128.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul8-ld64.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul8-ld64.c
index d1f3791..6133274 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul8-ld64.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul8-ld64.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16-add16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16-add16.c
index 5a563c4..d964d1c 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
index 3286c38..91f7980 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16-add16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16-add16.c
index 12db2c0..1786f51 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
index cd6ea87..f2a944f 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
index 0a50e86..95646f6 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16-add16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16-add16.c
index 289e361..0f8757d 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
index bdf45e9..478a6f3 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-xop-mul16-add16.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-xop-mul16-add16.c
index 54f942c..4b7c5de 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-xop-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-xop-mul16-add16.c
@@ -29,7 +29,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c b/src/qc8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
index 2c795ad..01a2153 100644
--- a/src/qc8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
+++ b/src/qc8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx-mul16.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx-mul16.c
index b73e6b3..abab65a 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx-mul16.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx-mul32.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx-mul32.c
index 726db04..b1db463 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx-mul32.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c
index 5801d99..baf32ef 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
index eec922a..7f9a9cc 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
index a7e0689..12dee88 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse2-mul16.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse2-mul16.c
index b900401..0375337 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse2-mul16.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse41-mul16.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse41-mul16.c
index c4eb742..b1ef4f5 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse41-mul16.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse41-mul32.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse41-mul32.c
index 598cc37..c81eeba 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse41-mul32.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16-add16.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16-add16.c
index a892871..e19051a 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
index 95bb3bf..fc80a2d 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x25-minmax-fp32-xop-mul32.c b/src/qc8-dwconv/gen/up24x25-minmax-fp32-xop-mul32.c
index 9b7ee0e..a980e87 100644
--- a/src/qc8-dwconv/gen/up24x25-minmax-fp32-xop-mul32.c
+++ b/src/qc8-dwconv/gen/up24x25-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx-mul16.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx-mul16.c
index 1ec8585..d089057 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx-mul16.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx-mul32.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx-mul32.c
index ab91155..555a6d1 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx-mul32.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c
index b228857..0617be3 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
index 0d8f325..6058c29 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
index 78ad8c4..e668512 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse2-mul16.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse2-mul16.c
index 21eb082..ab2af7d 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse2-mul16.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse41-mul16.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse41-mul16.c
index 03ebab9..2a51f99 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse41-mul16.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse41-mul32.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse41-mul32.c
index 1c0e836..5fa4109 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse41-mul32.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16-add16.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16-add16.c
index c59f57a..cd6dd7a 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
index f021969..a7fb167 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up24x9-minmax-fp32-xop-mul32.c b/src/qc8-dwconv/gen/up24x9-minmax-fp32-xop-mul32.c
index e0257ea..7ecd4c3 100644
--- a/src/qc8-dwconv/gen/up24x9-minmax-fp32-xop-mul32.c
+++ b/src/qc8-dwconv/gen/up24x9-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-add16-vpunpck.c b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
index 6fa94c0..b9b16cd 100644
--- a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
+++ b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpmovsx.c b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpmovsx.c
index 069588e..015fab5 100644
--- a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpmovsx.c
+++ b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpmovsx.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpunpck.c b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpunpck.c
index 240901d..9d4d46e 100644
--- a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpunpck.c
+++ b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
index 9a3d63f..42af574 100644
--- a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
+++ b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
index 9414702..d69c710 100644
--- a/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
+++ b/src/qc8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c b/src/qc8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
index c1c0627..9aec8e1 100644
--- a/src/qc8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
+++ b/src/qc8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c b/src/qc8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
index c8f16f2..2ab682e 100644
--- a/src/qc8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qc8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-add16-vpunpck.c b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
index aaa0a61..db0feba 100644
--- a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
+++ b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpmovsx.c b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpmovsx.c
index 6c91f1a..09782d7 100644
--- a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpmovsx.c
+++ b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpmovsx.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpunpck.c b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpunpck.c
index ff23a9b..cbdda41 100644
--- a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpunpck.c
+++ b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
index 1c18f2c..4bb720d 100644
--- a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
+++ b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
index a768332..73c4425 100644
--- a/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
+++ b/src/qc8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c b/src/qc8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
index 51e51c9..471755a 100644
--- a/src/qc8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
+++ b/src/qc8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c b/src/qc8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
index 6aae77f..860daca 100644
--- a/src/qc8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qc8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul16-add16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul16-add16.c
index e23b0d6..56fb101 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
index 8bf0ad4..9a0915f 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
index 77d73a8..4a4a6c2 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
index f233d02..dcd61a9 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mla8-ld64.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mla8-ld64.c
index 8a7d323..2cb7806 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mla8-ld64.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mla8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
index 47504fb..627a85c 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mul8-ld64.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mul8-ld64.c
index a906038..16aef3d 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mul8-ld64.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neon-mul8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mla8-ld64.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mla8-ld64.c
index 1eb99bf..38a5f92 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mla8-ld64.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mla8-ld64.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
index 6bdfa49..509812c 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul8-ld64.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul8-ld64.c
index 9cc78d2..03aeca3 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul8-ld64.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul8-ld64.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16-add16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16-add16.c
index 9501c79..ed81550 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
index 7b8001b..bfcf459 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16-add16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16-add16.c
index fc90261..04237bb 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
index 899a4dd..f00084c 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
index ae32bdc..c21e992 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16-add16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16-add16.c
index b154ac9..260a2ea 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
index b449ef3..fe51758 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-xop-mul16-add16.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-xop-mul16-add16.c
index a01bc76..1852442 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-xop-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-xop-mul16-add16.c
@@ -29,7 +29,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c b/src/qc8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
index 558b9fd..195601e 100644
--- a/src/qc8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
+++ b/src/qc8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul16-add16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul16-add16.c
index b230dc0..04f77d2 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
index 91c29be..3a70cfe 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
index e20f778..dc10ff5 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
index 2c0d4ee..f2a96ee 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mla8-ld64.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mla8-ld64.c
index 06e5c89..976449d 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mla8-ld64.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mla8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
index ae5b4a5..c578906 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mul8-ld64.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mul8-ld64.c
index f728266..f78d000 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mul8-ld64.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neon-mul8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mla8-ld64.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mla8-ld64.c
index a2c5d5c..d696c62 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mla8-ld64.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mla8-ld64.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
index be348c4..d33c98c 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul8-ld64.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul8-ld64.c
index 2cf5561..57dd242 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul8-ld64.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul8-ld64.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16-add16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16-add16.c
index 81a5c38..5405739 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
index 67aec0a..abed161 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16-add16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16-add16.c
index f578222..4e76c98 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
index 36aebce..7f69342 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
index c52aec3..138a662 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16-add16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16-add16.c
index 654273a..5df0deb 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
index 83cf361..06df19b 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-xop-mul16-add16.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-xop-mul16-add16.c
index 6e921fa..d14671e 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-xop-mul16-add16.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-xop-mul16-add16.c
@@ -29,7 +29,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qc8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c b/src/qc8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
index be200f1..45faa72 100644
--- a/src/qc8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
+++ b/src/qc8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul16-add16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul16-add16.c
index dff90cb..b6e688b 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
index 3e9576b..fb8b059 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
index 813769d..654b953 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-add16-vpunpck.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
index e488527..52e69a8 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpmovsx.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpmovsx.c
index 0d7c87e..1dc70a4 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpmovsx.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpmovsx.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpunpck.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpunpck.c
index 8065231..f53b81b 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpunpck.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
index bf68de4..5f90f92 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
index 0cffdd6..dc8c7d6 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
index 4460354..ff1cd51 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
index 4d75c3c..7de58e4 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16-add16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16-add16.c
index 0a6f621..a825645 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
index a02d3d0..039dfbc 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16-add16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16-add16.c
index d9751a6..a988073 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
index 0a442ed..2b3ce94 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
index a61756d..41e3992 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16-add16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16-add16.c
index 677204e..4ee264c 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
index 373cb91..691cbbd 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-xop-mul16-add16.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-xop-mul16-add16.c
index 51bec13..39057d9 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-xop-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-xop-mul16-add16.c
@@ -29,7 +29,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c b/src/qs8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
index 2d8eef5..4f40389 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mla8-ld128.c b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mla8-ld128.c
index 226278b..b4c7cd1 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mla8-ld128.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mla8-ld128.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mla8-ld64.c b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mla8-ld64.c
index dedc50e..bad9bb5 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mla8-ld64.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mla8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul16.c b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul16.c
index 7b68a8b..b9115f0 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8-ld128.c b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8-ld128.c
index afb0d48..d0183fc 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8-ld128.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8-ld128.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8-ld64.c b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8-ld64.c
index 0cd0c86..7b03a8d 100644
--- a/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8-ld64.c
+++ b/src/qs8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul16-add16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul16-add16.c
index 5c7d717..211427b 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
index 8accf27..6828c5b 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
index 3ad6341..5c19834 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-add16-vpunpck.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
index c8ce490..03013f9 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpmovsx.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpmovsx.c
index e215aef..0a6725b 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpmovsx.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpmovsx.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpunpck.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpunpck.c
index 6cb4522..544c536 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpunpck.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
index 1b5110a..9f574a0 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
index f032d90..9e24118 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
index 5115ce8..5f06e6a 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
index 9ac27d3..623db37 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16-add16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16-add16.c
index 12cb403..ef9f169 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
index 66c5246..dbb117f 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16-add16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16-add16.c
index 79a8133..2d5bbbe 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
index 94e7752..8af201e 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
index e7a103d..2c7cb97 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16-add16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16-add16.c
index 8d01eba..f6df925 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
index 438e124..226b4d9 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-xop-mul16-add16.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-xop-mul16-add16.c
index 5e3f8f9..fb98f2d 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-xop-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-xop-mul16-add16.c
@@ -29,7 +29,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c b/src/qs8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
index 287ea39..cc7142a 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mla8-ld128.c b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mla8-ld128.c
index b4de6dd..d1f4838 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mla8-ld128.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mla8-ld128.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mla8-ld64.c b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mla8-ld64.c
index 1093a3a..d6584be 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mla8-ld64.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mla8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul16.c b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul16.c
index 5a50ab2..95bd5d8 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8-ld128.c b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8-ld128.c
index 9266454..77bb19a 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8-ld128.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8-ld128.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8-ld64.c b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8-ld64.c
index 5767951..79e5517 100644
--- a/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8-ld64.c
+++ b/src/qs8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx-mul16.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx-mul16.c
index d36ce31..1d2342d 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx-mul16.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx-mul32.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx-mul32.c
index f690d3b..77e8d6d 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx-mul32.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c
index 0f7da0f..4e1912d 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
index 10df4ac..a521a89 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
index aa330fd..03b59e2 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse2-mul16.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse2-mul16.c
index c10fffe..6bc8e2b 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse2-mul16.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse41-mul16.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse41-mul16.c
index 0fcf208..db5aa2b 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse41-mul16.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse41-mul32.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse41-mul32.c
index 108e42d..c47eee2 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse41-mul32.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16-add16.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16-add16.c
index 110b2fd..e8464e3 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
index d12f4e1..e1dea13 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-fp32-xop-mul32.c b/src/qs8-dwconv/gen/up24x25-minmax-fp32-xop-mul32.c
index 9a5b151..778b6af 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-fp32-xop-mul32.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x25-minmax-rndnu-neon-mul16.c b/src/qs8-dwconv/gen/up24x25-minmax-rndnu-neon-mul16.c
index 4a69ce6..f497c5b 100644
--- a/src/qs8-dwconv/gen/up24x25-minmax-rndnu-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up24x25-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx-mul16.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx-mul16.c
index b207540..adff4dc 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx-mul16.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx-mul32.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx-mul32.c
index 5a705dc..9652bd4 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx-mul32.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c
index e263d45..613facb 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
index cd58a04..88ed964 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
index 3467f20..239764b 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse2-mul16.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse2-mul16.c
index 3ae11ea..4e8eb02 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse2-mul16.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse41-mul16.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse41-mul16.c
index b4762cb..5228725 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse41-mul16.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse41-mul32.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse41-mul32.c
index d09372a..3e7eaba 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse41-mul32.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16-add16.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16-add16.c
index f478eeb..28466f4 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
index 9a7d20a..e282fbd 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-fp32-xop-mul32.c b/src/qs8-dwconv/gen/up24x9-minmax-fp32-xop-mul32.c
index ec45052..d3fd7c6 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-fp32-xop-mul32.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up24x9-minmax-rndnu-neon-mul16.c b/src/qs8-dwconv/gen/up24x9-minmax-rndnu-neon-mul16.c
index 1a9ac34..130be27 100644
--- a/src/qs8-dwconv/gen/up24x9-minmax-rndnu-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up24x9-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-add16-vpunpck.c b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
index 9a13f47..f08263e 100644
--- a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
+++ b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-add16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpmovsx.c b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpmovsx.c
index f07556b..7c78f1e 100644
--- a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpmovsx.c
+++ b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpmovsx.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpunpck.c b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpunpck.c
index 2d550e4..a01e246 100644
--- a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpunpck.c
+++ b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
index 004d1e0..8352fb4 100644
--- a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
+++ b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
index e0e895a..cfb2973 100644
--- a/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
+++ b/src/qs8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c b/src/qs8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
index 287c59a..7f7d5d5 100644
--- a/src/qs8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c b/src/qs8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
index 0e39320..c54f420 100644
--- a/src/qs8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qs8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x25-minmax-rndnu-neon-mul16.c b/src/qs8-dwconv/gen/up32x25-minmax-rndnu-neon-mul16.c
index ab0dfe1..f8bdf75 100644
--- a/src/qs8-dwconv/gen/up32x25-minmax-rndnu-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up32x25-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-add16-vpunpck.c b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
index f3f65ed..613311a 100644
--- a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
+++ b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-add16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpmovsx.c b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpmovsx.c
index ba0edfe..120209b 100644
--- a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpmovsx.c
+++ b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpmovsx.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpunpck.c b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpunpck.c
index e781dc4..3b374be 100644
--- a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpunpck.c
+++ b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16-vpunpck.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
index 5abdb11..7fa2844 100644
--- a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
+++ b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
index 02f80c0..d21dff0 100644
--- a/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
+++ b/src/qs8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c b/src/qs8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
index 88a4c6a..af3eb0a 100644
--- a/src/qs8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c b/src/qs8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
index c091709..2df40e7 100644
--- a/src/qs8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qs8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up32x9-minmax-rndnu-neon-mul16.c b/src/qs8-dwconv/gen/up32x9-minmax-rndnu-neon-mul16.c
index a76e209..3cd625a 100644
--- a/src/qs8-dwconv/gen/up32x9-minmax-rndnu-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up32x9-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul16-add16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul16-add16.c
index 653492a..31cee3c 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
index 80102a4..ca0797f 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
index d478d8f..9a770eb 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
index efc2789..000a505 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
index de79adf..fcae824 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
index 792ec52..a884f76 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16-add16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16-add16.c
index 5d0690b..d9cc34d 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
index c8d5960..d057206 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16-add16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16-add16.c
index a8a06ba..ffaf240 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
index 34ba21a..c9bc1d8 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
index c612b7b..39ec5cc 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16-add16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16-add16.c
index 1d7a188..374d67b 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
index 93f33e6..09d1648 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-xop-mul16-add16.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-xop-mul16-add16.c
index 7105e1f..623a3ca 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-xop-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-xop-mul16-add16.c
@@ -29,7 +29,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c b/src/qs8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
index a201842..f9de4d0 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mla8-ld64.c b/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mla8-ld64.c
index 5ebe4dd..cd2042c 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mla8-ld64.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mla8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mul16.c b/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mul16.c
index f9d5657..449affb 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mul8-ld64.c b/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mul8-ld64.c
index 85df8fd..b6b8d7b 100644
--- a/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mul8-ld64.c
+++ b/src/qs8-dwconv/gen/up8x25-minmax-rndnu-neon-mul8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul16-add16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul16-add16.c
index fee436b..9af1c9e 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
index b2cc462..4f04651 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
index 747c246..1a7156d 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
index 4d7f22f..2dc3da7 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
index 4734600..0f57d6c 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
index 74b5a65..30a5b26 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16-add16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16-add16.c
index 5cd652a..d5eea90 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
index 5777662..2ae9faf 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16-add16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16-add16.c
index b61bfb8..f9fe472 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
index 4cca944..11affec 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
index 6187de2..eef5ca1 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16-add16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16-add16.c
index 28e3585..a35a337 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16-add16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
index 2b9a887..1f3f5f8 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-xop-mul16-add16.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-xop-mul16-add16.c
index 401f30a..07b9471 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-xop-mul16-add16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-xop-mul16-add16.c
@@ -29,7 +29,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c b/src/qs8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
index bfb55f7..0ef8fd9 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mla8-ld64.c b/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mla8-ld64.c
index 833aa0b..b07d787 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mla8-ld64.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mla8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mul16.c b/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mul16.c
index b808d68..9509e82 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mul16.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mul8-ld64.c b/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mul8-ld64.c
index 6429170..b30e25f 100644
--- a/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mul8-ld64.c
+++ b/src/qs8-dwconv/gen/up8x9-minmax-rndnu-neon-mul8-ld64.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-avx2-mul16-vpmovsx.c.in b/src/qs8-dwconv/unipass-avx2-mul16-vpmovsx.c.in
index f3c604d..f4cd11b 100644
--- a/src/qs8-dwconv/unipass-avx2-mul16-vpmovsx.c.in
+++ b/src/qs8-dwconv/unipass-avx2-mul16-vpmovsx.c.in
@@ -28,7 +28,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-avx2-mul16-vpunpck.c.in b/src/qs8-dwconv/unipass-avx2-mul16-vpunpck.c.in
index a9e0afd..3e129c0 100644
--- a/src/qs8-dwconv/unipass-avx2-mul16-vpunpck.c.in
+++ b/src/qs8-dwconv/unipass-avx2-mul16-vpunpck.c.in
@@ -28,7 +28,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-avx2-mul32.c.in b/src/qs8-dwconv/unipass-avx2-mul32.c.in
index 326abfa..1a2f99b 100644
--- a/src/qs8-dwconv/unipass-avx2-mul32.c.in
+++ b/src/qs8-dwconv/unipass-avx2-mul32.c.in
@@ -33,7 +33,7 @@
     size_t output_increment,
     size_t input_offset,
     const ${XINT8_T}* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-avx512skx-mul32.c.in b/src/qs8-dwconv/unipass-avx512skx-mul32.c.in
index 00b7a02..2b0f0bb 100644
--- a/src/qs8-dwconv/unipass-avx512skx-mul32.c.in
+++ b/src/qs8-dwconv/unipass-avx512skx-mul32.c.in
@@ -37,7 +37,7 @@
     size_t output_increment,
     size_t input_offset,
     const ${XINT8_T}* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-neon-mul16.c.in b/src/qs8-dwconv/unipass-neon-mul16.c.in
index 83e294e..768b5e0 100644
--- a/src/qs8-dwconv/unipass-neon-mul16.c.in
+++ b/src/qs8-dwconv/unipass-neon-mul16.c.in
@@ -53,7 +53,7 @@
     size_t output_increment,
     size_t input_offset,
     const ${XINT8_T}* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-neon-mul8.c.in b/src/qs8-dwconv/unipass-neon-mul8.c.in
index 6571c5c..5c16195 100644
--- a/src/qs8-dwconv/unipass-neon-mul8.c.in
+++ b/src/qs8-dwconv/unipass-neon-mul8.c.in
@@ -33,7 +33,7 @@
     size_t output_increment,
     size_t input_offset,
     const int8_t* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-sse-mul16.c.in b/src/qs8-dwconv/unipass-sse-mul16.c.in
index adada35..c7670d5 100644
--- a/src/qs8-dwconv/unipass-sse-mul16.c.in
+++ b/src/qs8-dwconv/unipass-sse-mul16.c.in
@@ -42,7 +42,7 @@
     size_t output_increment,
     size_t input_offset,
     const ${XINT8_T}* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-sse-mul32.c.in b/src/qs8-dwconv/unipass-sse-mul32.c.in
index 89b9337..ecccb79 100644
--- a/src/qs8-dwconv/unipass-sse-mul32.c.in
+++ b/src/qs8-dwconv/unipass-sse-mul32.c.in
@@ -42,7 +42,7 @@
     size_t output_increment,
     size_t input_offset,
     const ${XINT8_T}* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-dwconv/unipass-wasmsimd-mul16.c.in b/src/qs8-dwconv/unipass-wasmsimd-mul16.c.in
index 96dc514..fbcb59f 100644
--- a/src/qs8-dwconv/unipass-wasmsimd-mul16.c.in
+++ b/src/qs8-dwconv/unipass-wasmsimd-mul16.c.in
@@ -35,7 +35,7 @@
     size_t output_increment,
     size_t input_offset,
     const ${XINT8_T}* zero,
-    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-neon-x16.c b/src/qs8-f32-vcvt/gen/vcvt-neon-x16.c
index d387910..8cd9ddd 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-neon-x16.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-neon-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-neon-x24.c b/src/qs8-f32-vcvt/gen/vcvt-neon-x24.c
index 893ba11..59a13b8 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-neon-x24.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-neon-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-neon-x32.c b/src/qs8-f32-vcvt/gen/vcvt-neon-x32.c
index 0eb918a..ca67f1b 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-neon-x32.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-neon-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-neon-x8.c b/src/qs8-f32-vcvt/gen/vcvt-neon-x8.c
index 484c29e..57693c6 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-neon-x8.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-neon-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-sse2-x16.c b/src/qs8-f32-vcvt/gen/vcvt-sse2-x16.c
index 163507e..4c791b1 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-sse2-x16.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-sse2-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-sse2-x24.c b/src/qs8-f32-vcvt/gen/vcvt-sse2-x24.c
index 307ec5b..a299676 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-sse2-x24.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-sse2-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-sse2-x32.c b/src/qs8-f32-vcvt/gen/vcvt-sse2-x32.c
index 96942c6..5aa5971 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-sse2-x32.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-sse2-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-sse2-x8.c b/src/qs8-f32-vcvt/gen/vcvt-sse2-x8.c
index f036b2d..71c106e 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-sse2-x8.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-sse2-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-sse41-x16.c b/src/qs8-f32-vcvt/gen/vcvt-sse41-x16.c
index 0f23096..e2b2b1f 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-sse41-x16.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-sse41-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-sse41-x24.c b/src/qs8-f32-vcvt/gen/vcvt-sse41-x24.c
index ebe4b8b..3068a5e 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-sse41-x24.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-sse41-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-sse41-x32.c b/src/qs8-f32-vcvt/gen/vcvt-sse41-x32.c
index 12cd3eb..6c8e100 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-sse41-x32.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-sse41-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-sse41-x8.c b/src/qs8-f32-vcvt/gen/vcvt-sse41-x8.c
index 52dc655..771d64d 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-sse41-x8.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-sse41-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x16.c b/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x16.c
index e77e130..8097bf7 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x16.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x24.c b/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x24.c
index 8de9548..a1309c3 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x24.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x32.c b/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x32.c
index 0f25a46..000f2d3 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x32.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x8.c b/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x8.c
index 6cb328c..3274aad 100644
--- a/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x8.c
+++ b/src/qs8-f32-vcvt/gen/vcvt-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const int8_t* x,
     float* y,
-    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(int8_t) == 0);
diff --git a/src/qs8-f32-vcvt/neon.c.in b/src/qs8-f32-vcvt/neon.c.in
index 3fef187..23017cf 100644
--- a/src/qs8-f32-vcvt/neon.c.in
+++ b/src/qs8-f32-vcvt/neon.c.in
@@ -23,7 +23,7 @@
     size_t n,
     const ${XINT8_T}* x,
     float* y,
-    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(${XINT8_T}) == 0);
diff --git a/src/qs8-f32-vcvt/sse2.c.in b/src/qs8-f32-vcvt/sse2.c.in
index 3e6ef52..e7bbef5 100644
--- a/src/qs8-f32-vcvt/sse2.c.in
+++ b/src/qs8-f32-vcvt/sse2.c.in
@@ -21,7 +21,7 @@
     size_t n,
     const ${XINT8_T}* x,
     float* y,
-    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(${XINT8_T}) == 0);
diff --git a/src/qs8-f32-vcvt/sse4.c.in b/src/qs8-f32-vcvt/sse4.c.in
index 8ba932f..54a9491 100644
--- a/src/qs8-f32-vcvt/sse4.c.in
+++ b/src/qs8-f32-vcvt/sse4.c.in
@@ -21,7 +21,7 @@
     size_t n,
     const ${XINT8_T}* x,
     float* y,
-    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(${XINT8_T}) == 0);
diff --git a/src/qs8-f32-vcvt/wasmsimd.c.in b/src/qs8-f32-vcvt/wasmsimd.c.in
index 62a2991..66fb5de 100644
--- a/src/qs8-f32-vcvt/wasmsimd.c.in
+++ b/src/qs8-f32-vcvt/wasmsimd.c.in
@@ -21,7 +21,7 @@
     size_t n,
     const ${XINT8_T}* x,
     float* y,
-    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(${XINT8_T}) == 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-neon-c16-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-neon-c16-acc2.c
index 74e8784..17a6573 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-neon-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-neon-c16-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-neon-c24-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-neon-c24-acc2.c
index 7768e32..ab51f14 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-neon-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-neon-c24-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-neon-c32-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-neon-c32-acc2.c
index b756a23..47b0002 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-neon-c32-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-neon-c32-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-neon-c8-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-neon-c8-acc2.c
index 9e3cd9a..6a85fd8 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-neon-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-neon-c8-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c1.c b/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c1.c
index 9340883..b3d5b29 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c1.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c1.c
@@ -21,7 +21,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c2.c b/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c2.c
index 19dea3f..1cb9c06 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c2.c
@@ -21,7 +21,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c4.c b/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c4.c
index 302f706..946847b 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c4.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-scalar-c4.c
@@ -21,7 +21,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c16-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c16-acc2.c
index 63cc17c..62bd71c 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c16-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c24-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c24-acc2.c
index 567482a..515f628 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c24-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c8-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c8-acc2.c
index c6c2713..6ca1a52 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-sse2-c8-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c16-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c16-acc2.c
index 55bcfb2..5ab806a 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c16-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c24-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c24-acc2.c
index 44d7b45..75cc2bc 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c24-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c8-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c8-acc2.c
index fd235ab..942cdc8 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-sse41-c8-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c16-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c16-acc2.c
index f50d901..4685ff8 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c16-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c24-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c24-acc2.c
index 54e82d0..04551b1 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c24-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c8-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c8-acc2.c
index 375500e..7cd06d1 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-ssse3-c8-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c16-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c16-acc2.c
index f9d837b..58781a8 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c16-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c24-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c24-acc2.c
index ee4cc38..5739d4b 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c24-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c8-acc2.c b/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c8-acc2.c
index ae1d282..0397139 100644
--- a/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7p7x-minmax-wasmsimd-c8-acc2.c
@@ -23,7 +23,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-neon-c16-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-neon-c16-acc2.c
index a99b6e8..737dc66 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-neon-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-neon-c16-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-neon-c24-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-neon-c24-acc2.c
index 2acc36a..4e027c8 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-neon-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-neon-c24-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-neon-c32-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-neon-c32-acc2.c
index 51543d7..47d620b 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-neon-c32-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-neon-c32-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-neon-c8-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-neon-c8-acc2.c
index 62a375d..623d29a 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-neon-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-neon-c8-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-scalar-c1.c b/src/qs8-gavgpool/gen/7x-minmax-scalar-c1.c
index 6244737..7ef84a1 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-scalar-c1.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-scalar-c1.c
@@ -20,7 +20,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-scalar-c2.c b/src/qs8-gavgpool/gen/7x-minmax-scalar-c2.c
index 53ebf2e..1f34992 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-scalar-c2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-scalar-c2.c
@@ -20,7 +20,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-scalar-c4.c b/src/qs8-gavgpool/gen/7x-minmax-scalar-c4.c
index 6dde40e..5334f1a 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-scalar-c4.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-scalar-c4.c
@@ -20,7 +20,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-sse2-c16-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-sse2-c16-acc2.c
index 503394e..5096c7f 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-sse2-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-sse2-c16-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-sse2-c24-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-sse2-c24-acc2.c
index 1bee82c..364afe5 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-sse2-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-sse2-c24-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-sse2-c8-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-sse2-c8-acc2.c
index 1a4ef88..ece8409 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-sse2-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-sse2-c8-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-sse41-c16-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-sse41-c16-acc2.c
index dc58f40..945e7d3 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-sse41-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-sse41-c16-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-sse41-c24-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-sse41-c24-acc2.c
index 08b1d36..977440f 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-sse41-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-sse41-c24-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-sse41-c8-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-sse41-c8-acc2.c
index 5a05adb..d33a362 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-sse41-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-sse41-c8-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-ssse3-c16-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-ssse3-c16-acc2.c
index 5c9081a..e9527c8 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-ssse3-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-ssse3-c16-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-ssse3-c24-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-ssse3-c24-acc2.c
index 4ed0042..caf950f 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-ssse3-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-ssse3-c24-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-ssse3-c8-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-ssse3-c8-acc2.c
index 6feb257..ff0d7c6 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-ssse3-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-ssse3-c8-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c16-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c16-acc2.c
index 2819cd1..344bc62 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c16-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c16-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c24-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c24-acc2.c
index 77e3ca8..32a6243 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c24-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c24-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c8-acc2.c b/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c8-acc2.c
index 2c69078..f8627e8 100644
--- a/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c8-acc2.c
+++ b/src/qs8-gavgpool/gen/7x-minmax-wasmsimd-c8-acc2.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qs8-gavgpool/multipass-neon.c.in b/src/qs8-gavgpool/multipass-neon.c.in
index c4f9a44..9fcf576 100644
--- a/src/qs8-gavgpool/multipass-neon.c.in
+++ b/src/qs8-gavgpool/multipass-neon.c.in
@@ -28,7 +28,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > ${ROW_TILE});
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/multipass-scalar.c.in b/src/qs8-gavgpool/multipass-scalar.c.in
index e088f82..a58223b 100644
--- a/src/qs8-gavgpool/multipass-scalar.c.in
+++ b/src/qs8-gavgpool/multipass-scalar.c.in
@@ -25,7 +25,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(rows > ${ROW_TILE});
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/multipass-sse.c.in b/src/qs8-gavgpool/multipass-sse.c.in
index 9d637d2..ebd833c 100644
--- a/src/qs8-gavgpool/multipass-sse.c.in
+++ b/src/qs8-gavgpool/multipass-sse.c.in
@@ -30,7 +30,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > ${ROW_TILE});
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/multipass-wasmsimd.c.in b/src/qs8-gavgpool/multipass-wasmsimd.c.in
index 8c0e5e1..4a7e9f8 100644
--- a/src/qs8-gavgpool/multipass-wasmsimd.c.in
+++ b/src/qs8-gavgpool/multipass-wasmsimd.c.in
@@ -28,7 +28,7 @@
     const int8_t* zero,
     int32_t* buffer,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > ${ROW_TILE});
   assert(channels != 0);
diff --git a/src/qs8-gavgpool/unipass-neon.c.in b/src/qs8-gavgpool/unipass-neon.c.in
index f573997..c44179f 100644
--- a/src/qs8-gavgpool/unipass-neon.c.in
+++ b/src/qs8-gavgpool/unipass-neon.c.in
@@ -23,7 +23,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= ${ROW_TILE});
diff --git a/src/qs8-gavgpool/unipass-scalar.c.in b/src/qs8-gavgpool/unipass-scalar.c.in
index 2b86d57..77cbaf3 100644
--- a/src/qs8-gavgpool/unipass-scalar.c.in
+++ b/src/qs8-gavgpool/unipass-scalar.c.in
@@ -20,7 +20,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(rows != 0);
   assert(rows <= ${ROW_TILE});
diff --git a/src/qs8-gavgpool/unipass-sse.c.in b/src/qs8-gavgpool/unipass-sse.c.in
index dd245a9..2189dda 100644
--- a/src/qs8-gavgpool/unipass-sse.c.in
+++ b/src/qs8-gavgpool/unipass-sse.c.in
@@ -25,7 +25,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= ${ROW_TILE});
diff --git a/src/qs8-gavgpool/unipass-wasmsimd.c.in b/src/qs8-gavgpool/unipass-wasmsimd.c.in
index b80cc45..b14e82c 100644
--- a/src/qs8-gavgpool/unipass-wasmsimd.c.in
+++ b/src/qs8-gavgpool/unipass-wasmsimd.c.in
@@ -23,7 +23,7 @@
     size_t input_stride,
     const int8_t* zero,
     int8_t* output,
-    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= ${ROW_TILE});
diff --git a/src/qs8-vadd/avx2-mul32-ld64.c.in b/src/qs8-vadd/avx2-mul32-ld64.c.in
index 8e8b4e0..5967260 100644
--- a/src/qs8-vadd/avx2-mul32-ld64.c.in
+++ b/src/qs8-vadd/avx2-mul32-ld64.c.in
@@ -25,7 +25,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i vbias = _mm256_load_si256((const __m256i*) params->avx2.bias);
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
diff --git a/src/qs8-vadd/avx512skx-mul32-ld128.c.in b/src/qs8-vadd/avx512skx-mul32-ld128.c.in
index 5053e7d..251f9bb 100644
--- a/src/qs8-vadd/avx512skx-mul32-ld128.c.in
+++ b/src/qs8-vadd/avx512skx-mul32-ld128.c.in
@@ -28,7 +28,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i vbias = _mm512_load_si512(params->avx512.bias);
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x16.c b/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x16.c
index deb836d..2bd88b6 100644
--- a/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x16.c
+++ b/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul16.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse4_mul16.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x24.c b/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x24.c
index 1051c5c..8de3126 100644
--- a/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x24.c
+++ b/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul16.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse4_mul16.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x32.c b/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x32.c
index 9e99933..6e76642 100644
--- a/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x32.c
+++ b/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul16.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse4_mul16.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x8.c b/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x8.c
index 2391419..8a2a229 100644
--- a/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x8.c
+++ b/src/qs8-vadd/gen/minmax-avx-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul16.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse4_mul16.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x16.c b/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x16.c
index 69f0a24..0c99a73 100644
--- a/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x16.c
+++ b/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x24.c b/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x24.c
index ddacd87..6b75e73 100644
--- a/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x24.c
+++ b/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x24.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x32.c b/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x32.c
index f9658bf..ca69882 100644
--- a/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x32.c
+++ b/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x32.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x8.c b/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x8.c
index d5dd4ec..29a71e9 100644
--- a/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x8.c
+++ b/src/qs8-vadd/gen/minmax-avx-mul32-ld32-x8.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x16.c b/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x16.c
index 680a1ff..5432dbb 100644
--- a/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x16.c
+++ b/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i vbias = _mm256_load_si256((const __m256i*) params->avx2.bias);
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x24.c b/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x24.c
index 4964720..e32a376 100644
--- a/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x24.c
+++ b/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x24.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i vbias = _mm256_load_si256((const __m256i*) params->avx2.bias);
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x32.c b/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x32.c
index 39178d9..b36ed8a 100644
--- a/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x32.c
+++ b/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x32.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i vbias = _mm256_load_si256((const __m256i*) params->avx2.bias);
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x8.c b/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x8.c
index e4f113e..14d08b0 100644
--- a/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x8.c
+++ b/src/qs8-vadd/gen/minmax-avx2-mul32-ld64-x8.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i vbias = _mm256_load_si256((const __m256i*) params->avx2.bias);
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx512skx-mul32-ld128-x16.c b/src/qs8-vadd/gen/minmax-avx512skx-mul32-ld128-x16.c
index e276402..59e8988 100644
--- a/src/qs8-vadd/gen/minmax-avx512skx-mul32-ld128-x16.c
+++ b/src/qs8-vadd/gen/minmax-avx512skx-mul32-ld128-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i vbias = _mm512_load_si512(params->avx512.bias);
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-avx512skx-mul32-ld128-x32.c b/src/qs8-vadd/gen/minmax-avx512skx-mul32-ld128-x32.c
index e194eee..5afcf59 100644
--- a/src/qs8-vadd/gen/minmax-avx512skx-mul32-ld128-x32.c
+++ b/src/qs8-vadd/gen/minmax-avx512skx-mul32-ld128-x32.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i vbias = _mm512_load_si512(params->avx512.bias);
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-neon-ld128-x16.c b/src/qs8-vadd/gen/minmax-neon-ld128-x16.c
index d6d4fdf..e1f4fac 100644
--- a/src/qs8-vadd/gen/minmax-neon-ld128-x16.c
+++ b/src/qs8-vadd/gen/minmax-neon-ld128-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const int8x16_t va_zero_point = vld1q_dup_s8(&params->neon.a_zero_point);
diff --git a/src/qs8-vadd/gen/minmax-neon-ld128-x32.c b/src/qs8-vadd/gen/minmax-neon-ld128-x32.c
index 3031505..4a6ee98 100644
--- a/src/qs8-vadd/gen/minmax-neon-ld128-x32.c
+++ b/src/qs8-vadd/gen/minmax-neon-ld128-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const int8x16_t va_zero_point = vld1q_dup_s8(&params->neon.a_zero_point);
diff --git a/src/qs8-vadd/gen/minmax-neon-ld64-x16.c b/src/qs8-vadd/gen/minmax-neon-ld64-x16.c
index 53c1922..1e68b69 100644
--- a/src/qs8-vadd/gen/minmax-neon-ld64-x16.c
+++ b/src/qs8-vadd/gen/minmax-neon-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(&params->neon.a_zero_point);
   const int8x8_t vb_zero_point = vld1_dup_s8(&params->neon.b_zero_point);
diff --git a/src/qs8-vadd/gen/minmax-neon-ld64-x24.c b/src/qs8-vadd/gen/minmax-neon-ld64-x24.c
index 6c74745..ca05a73 100644
--- a/src/qs8-vadd/gen/minmax-neon-ld64-x24.c
+++ b/src/qs8-vadd/gen/minmax-neon-ld64-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(&params->neon.a_zero_point);
   const int8x8_t vb_zero_point = vld1_dup_s8(&params->neon.b_zero_point);
diff --git a/src/qs8-vadd/gen/minmax-neon-ld64-x32.c b/src/qs8-vadd/gen/minmax-neon-ld64-x32.c
index 984d964..45c52c1 100644
--- a/src/qs8-vadd/gen/minmax-neon-ld64-x32.c
+++ b/src/qs8-vadd/gen/minmax-neon-ld64-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(&params->neon.a_zero_point);
   const int8x8_t vb_zero_point = vld1_dup_s8(&params->neon.b_zero_point);
diff --git a/src/qs8-vadd/gen/minmax-neon-ld64-x8.c b/src/qs8-vadd/gen/minmax-neon-ld64-x8.c
index 80368aa..1110bfb 100644
--- a/src/qs8-vadd/gen/minmax-neon-ld64-x8.c
+++ b/src/qs8-vadd/gen/minmax-neon-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(&params->neon.a_zero_point);
   const int8x8_t vb_zero_point = vld1_dup_s8(&params->neon.b_zero_point);
diff --git a/src/qs8-vadd/gen/minmax-scalar-x1.c b/src/qs8-vadd/gen/minmax-scalar-x1.c
index 6368e02..e390b7a 100644
--- a/src/qs8-vadd/gen/minmax-scalar-x1.c
+++ b/src/qs8-vadd/gen/minmax-scalar-x1.c
@@ -18,7 +18,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qs8-vadd/gen/minmax-scalar-x2.c b/src/qs8-vadd/gen/minmax-scalar-x2.c
index 4ee062d..bb55d42 100644
--- a/src/qs8-vadd/gen/minmax-scalar-x2.c
+++ b/src/qs8-vadd/gen/minmax-scalar-x2.c
@@ -18,7 +18,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qs8-vadd/gen/minmax-scalar-x4.c b/src/qs8-vadd/gen/minmax-scalar-x4.c
index f45a809..cb3e695 100644
--- a/src/qs8-vadd/gen/minmax-scalar-x4.c
+++ b/src/qs8-vadd/gen/minmax-scalar-x4.c
@@ -18,7 +18,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x16.c b/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x16.c
index c72e4a9..0ab4fbf 100644
--- a/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x16.c
+++ b/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x24.c b/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x24.c
index 678bb17..a6f4a0e 100644
--- a/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x24.c
+++ b/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x32.c b/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x32.c
index 8cf5229..7787ded 100644
--- a/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x32.c
+++ b/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x8.c b/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x8.c
index 807647c..3a53d66 100644
--- a/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x8.c
+++ b/src/qs8-vadd/gen/minmax-sse2-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x16.c b/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x16.c
index 381d7c9..5ecd7ab 100644
--- a/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x16.c
+++ b/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul16.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse4_mul16.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x24.c b/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x24.c
index 3dc173f..cf4c091 100644
--- a/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x24.c
+++ b/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul16.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse4_mul16.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x32.c b/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x32.c
index 72e58ac..48bbc92 100644
--- a/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x32.c
+++ b/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul16.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse4_mul16.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x8.c b/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x8.c
index e3d3a34..cb6a568 100644
--- a/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x8.c
+++ b/src/qs8-vadd/gen/minmax-sse41-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul16.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse4_mul16.a_multiplier_lo);
diff --git a/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x16.c b/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x16.c
index c9959f3..d65b0c7 100644
--- a/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x16.c
+++ b/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x24.c b/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x24.c
index 5977e28..c15f963 100644
--- a/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x24.c
+++ b/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x24.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x32.c b/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x32.c
index 7aa3855..37ae55b 100644
--- a/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x32.c
+++ b/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x32.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x8.c b/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x8.c
index cd6c4f7..6fb2142 100644
--- a/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x8.c
+++ b/src/qs8-vadd/gen/minmax-sse41-mul32-ld32-x8.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-wasmsimd-x16.c b/src/qs8-vadd/gen/minmax-wasmsimd-x16.c
index 05660d7..729e71e 100644
--- a/src/qs8-vadd/gen/minmax-wasmsimd-x16.c
+++ b/src/qs8-vadd/gen/minmax-wasmsimd-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t vbias = wasm_v128_load(params->wasmsimd.bias);
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-wasmsimd-x24.c b/src/qs8-vadd/gen/minmax-wasmsimd-x24.c
index 1c86b41..f77f8cf 100644
--- a/src/qs8-vadd/gen/minmax-wasmsimd-x24.c
+++ b/src/qs8-vadd/gen/minmax-wasmsimd-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t vbias = wasm_v128_load(params->wasmsimd.bias);
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-wasmsimd-x32.c b/src/qs8-vadd/gen/minmax-wasmsimd-x32.c
index 51b4906..8adbdc1 100644
--- a/src/qs8-vadd/gen/minmax-wasmsimd-x32.c
+++ b/src/qs8-vadd/gen/minmax-wasmsimd-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t vbias = wasm_v128_load(params->wasmsimd.bias);
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-wasmsimd-x8.c b/src/qs8-vadd/gen/minmax-wasmsimd-x8.c
index 2fd29e2..bd9ac7c 100644
--- a/src/qs8-vadd/gen/minmax-wasmsimd-x8.c
+++ b/src/qs8-vadd/gen/minmax-wasmsimd-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t vbias = wasm_v128_load(params->wasmsimd.bias);
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x16.c b/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x16.c
index 3fd41d6..b9b7ece 100644
--- a/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x16.c
+++ b/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x16.c
@@ -25,7 +25,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x24.c b/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x24.c
index 9f45091..7b344d6 100644
--- a/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x24.c
+++ b/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x24.c
@@ -25,7 +25,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x32.c b/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x32.c
index 89b8cc5..9eb1beb 100644
--- a/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x32.c
+++ b/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x32.c
@@ -25,7 +25,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x8.c b/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x8.c
index 15babf7..c954096 100644
--- a/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x8.c
+++ b/src/qs8-vadd/gen/minmax-xop-mul32-ld32-x8.c
@@ -25,7 +25,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4_mul32.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
diff --git a/src/qs8-vadd/neon.c.in b/src/qs8-vadd/neon.c.in
index 8fffaca..d8e1116 100644
--- a/src/qs8-vadd/neon.c.in
+++ b/src/qs8-vadd/neon.c.in
@@ -39,7 +39,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   $if LD128:
     #if XNN_ARCH_ARM64
diff --git a/src/qs8-vadd/scalar.c.in b/src/qs8-vadd/scalar.c.in
index 59326ec..65ff4aa 100644
--- a/src/qs8-vadd/scalar.c.in
+++ b/src/qs8-vadd/scalar.c.in
@@ -17,7 +17,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qs8-vadd/sse-mul16-ld64.c.in b/src/qs8-vadd/sse-mul16-ld64.c.in
index fce1ec2..eeffa61 100644
--- a/src/qs8-vadd/sse-mul16-ld64.c.in
+++ b/src/qs8-vadd/sse-mul16-ld64.c.in
@@ -29,7 +29,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.a_multiplier_lo);
diff --git a/src/qs8-vadd/sse-mul32-ld32.c.in b/src/qs8-vadd/sse-mul32-ld32.c.in
index f801ea5..70c546f 100644
--- a/src/qs8-vadd/sse-mul32-ld32.c.in
+++ b/src/qs8-vadd/sse-mul32-ld32.c.in
@@ -37,7 +37,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.a_multiplier);
diff --git a/src/qs8-vadd/wasmsimd.c.in b/src/qs8-vadd/wasmsimd.c.in
index 27ec5a1..37ca351 100644
--- a/src/qs8-vadd/wasmsimd.c.in
+++ b/src/qs8-vadd/wasmsimd.c.in
@@ -26,7 +26,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t vbias = wasm_v128_load(params->wasmsimd.bias);
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
diff --git a/src/qs8-vaddc/avx2-mul32-ld64.c.in b/src/qs8-vaddc/avx2-mul32-ld64.c.in
index 2ee7012..e137065 100644
--- a/src/qs8-vaddc/avx2-mul32-ld64.c.in
+++ b/src/qs8-vaddc/avx2-mul32-ld64.c.in
@@ -25,7 +25,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx2.shift);
diff --git a/src/qs8-vaddc/avx512skx-mul32-ld128.c.in b/src/qs8-vaddc/avx512skx-mul32-ld128.c.in
index 0726468..e9b51d6 100644
--- a/src/qs8-vaddc/avx512skx-mul32-ld128.c.in
+++ b/src/qs8-vaddc/avx512skx-mul32-ld128.c.in
@@ -28,7 +28,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx512.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x16.c b/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x16.c
index c27da55..14ee0d8 100644
--- a/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x16.c
+++ b/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse4_mul16.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x24.c b/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x24.c
index 9301793..28001bb 100644
--- a/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x24.c
+++ b/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse4_mul16.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x32.c b/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x32.c
index 2b57a0e..d957306 100644
--- a/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x32.c
+++ b/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse4_mul16.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x8.c b/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x8.c
index ae42ecb..07c74a7 100644
--- a/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x8.c
+++ b/src/qs8-vaddc/gen/minmax-avx-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse4_mul16.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x16.c b/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x16.c
index db288cc..33d4631 100644
--- a/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x16.c
+++ b/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x24.c b/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x24.c
index ddbcb75..9c4a612 100644
--- a/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x24.c
+++ b/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x24.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x32.c b/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x32.c
index 8dfbea8..3335f58 100644
--- a/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x32.c
+++ b/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x32.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x8.c b/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x8.c
index 9b37d0a..133beff 100644
--- a/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x8.c
+++ b/src/qs8-vaddc/gen/minmax-avx-mul32-ld32-x8.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x16.c b/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x16.c
index 2b84d52..8b4a802 100644
--- a/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x16.c
+++ b/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx2.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x24.c b/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x24.c
index 5184996..693fd90 100644
--- a/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x24.c
+++ b/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x24.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx2.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x32.c b/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x32.c
index ccdb822..310cc5a 100644
--- a/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x32.c
+++ b/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x32.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx2.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x8.c b/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x8.c
index e61ab23..6850202 100644
--- a/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x8.c
+++ b/src/qs8-vaddc/gen/minmax-avx2-mul32-ld64-x8.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx2.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx512skx-mul32-ld128-x16.c b/src/qs8-vaddc/gen/minmax-avx512skx-mul32-ld128-x16.c
index 09130f7..6dcf4c8 100644
--- a/src/qs8-vaddc/gen/minmax-avx512skx-mul32-ld128-x16.c
+++ b/src/qs8-vaddc/gen/minmax-avx512skx-mul32-ld128-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx512.shift);
diff --git a/src/qs8-vaddc/gen/minmax-avx512skx-mul32-ld128-x32.c b/src/qs8-vaddc/gen/minmax-avx512skx-mul32-ld128-x32.c
index bf02f38..446e7e1 100644
--- a/src/qs8-vaddc/gen/minmax-avx512skx-mul32-ld128-x32.c
+++ b/src/qs8-vaddc/gen/minmax-avx512skx-mul32-ld128-x32.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx512.shift);
diff --git a/src/qs8-vaddc/gen/minmax-neon-ld128-x16.c b/src/qs8-vaddc/gen/minmax-neon-ld128-x16.c
index b630519..5fabba7 100644
--- a/src/qs8-vaddc/gen/minmax-neon-ld128-x16.c
+++ b/src/qs8-vaddc/gen/minmax-neon-ld128-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const int8x16_t va_zero_point = vld1q_dup_s8(&params->neon.a_zero_point);
diff --git a/src/qs8-vaddc/gen/minmax-neon-ld128-x32.c b/src/qs8-vaddc/gen/minmax-neon-ld128-x32.c
index 1ab7806..a79667a 100644
--- a/src/qs8-vaddc/gen/minmax-neon-ld128-x32.c
+++ b/src/qs8-vaddc/gen/minmax-neon-ld128-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const int8x16_t va_zero_point = vld1q_dup_s8(&params->neon.a_zero_point);
diff --git a/src/qs8-vaddc/gen/minmax-neon-ld64-x16.c b/src/qs8-vaddc/gen/minmax-neon-ld64-x16.c
index 104c3b6..621129f 100644
--- a/src/qs8-vaddc/gen/minmax-neon-ld64-x16.c
+++ b/src/qs8-vaddc/gen/minmax-neon-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(&params->neon.a_zero_point);
   const int32x4_t va_multiplier = vld1q_dup_s32(&params->neon.a_multiplier);
diff --git a/src/qs8-vaddc/gen/minmax-neon-ld64-x24.c b/src/qs8-vaddc/gen/minmax-neon-ld64-x24.c
index 071a428..81569b0 100644
--- a/src/qs8-vaddc/gen/minmax-neon-ld64-x24.c
+++ b/src/qs8-vaddc/gen/minmax-neon-ld64-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(&params->neon.a_zero_point);
   const int32x4_t va_multiplier = vld1q_dup_s32(&params->neon.a_multiplier);
diff --git a/src/qs8-vaddc/gen/minmax-neon-ld64-x32.c b/src/qs8-vaddc/gen/minmax-neon-ld64-x32.c
index 257b33d..9d3b647 100644
--- a/src/qs8-vaddc/gen/minmax-neon-ld64-x32.c
+++ b/src/qs8-vaddc/gen/minmax-neon-ld64-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(&params->neon.a_zero_point);
   const int32x4_t va_multiplier = vld1q_dup_s32(&params->neon.a_multiplier);
diff --git a/src/qs8-vaddc/gen/minmax-neon-ld64-x8.c b/src/qs8-vaddc/gen/minmax-neon-ld64-x8.c
index e5076b5..142357d 100644
--- a/src/qs8-vaddc/gen/minmax-neon-ld64-x8.c
+++ b/src/qs8-vaddc/gen/minmax-neon-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(&params->neon.a_zero_point);
   const int32x4_t va_multiplier = vld1q_dup_s32(&params->neon.a_multiplier);
diff --git a/src/qs8-vaddc/gen/minmax-scalar-x1.c b/src/qs8-vaddc/gen/minmax-scalar-x1.c
index cacd01e..f7dc69b 100644
--- a/src/qs8-vaddc/gen/minmax-scalar-x1.c
+++ b/src/qs8-vaddc/gen/minmax-scalar-x1.c
@@ -18,7 +18,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias + (int32_t) *input_b * params->scalar.b_multiplier;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qs8-vaddc/gen/minmax-scalar-x2.c b/src/qs8-vaddc/gen/minmax-scalar-x2.c
index dc04b44..75b733a 100644
--- a/src/qs8-vaddc/gen/minmax-scalar-x2.c
+++ b/src/qs8-vaddc/gen/minmax-scalar-x2.c
@@ -18,7 +18,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias + (int32_t) *input_b * params->scalar.b_multiplier;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qs8-vaddc/gen/minmax-scalar-x4.c b/src/qs8-vaddc/gen/minmax-scalar-x4.c
index be7a847..ee15c3d 100644
--- a/src/qs8-vaddc/gen/minmax-scalar-x4.c
+++ b/src/qs8-vaddc/gen/minmax-scalar-x4.c
@@ -18,7 +18,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias + (int32_t) *input_b * params->scalar.b_multiplier;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x16.c b/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x16.c
index 89f2659..b9217da 100644
--- a/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x16.c
+++ b/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x24.c b/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x24.c
index 8a4f558..bf9bf5c 100644
--- a/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x24.c
+++ b/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x32.c b/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x32.c
index 37f733f..f903679 100644
--- a/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x32.c
+++ b/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x8.c b/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x8.c
index f9e84ab..1c1f6d9 100644
--- a/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x8.c
+++ b/src/qs8-vaddc/gen/minmax-sse2-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x16.c b/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x16.c
index ec36387..2c8b81f 100644
--- a/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x16.c
+++ b/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse4_mul16.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x24.c b/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x24.c
index ad5c8e1..4839b0b 100644
--- a/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x24.c
+++ b/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse4_mul16.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x32.c b/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x32.c
index 248fc6c..8b40830 100644
--- a/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x32.c
+++ b/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse4_mul16.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x8.c b/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x8.c
index c13c63a..58694df 100644
--- a/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x8.c
+++ b/src/qs8-vaddc/gen/minmax-sse41-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse4_mul16.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x16.c b/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x16.c
index 53836e9..1f0a2e5 100644
--- a/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x16.c
+++ b/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x24.c b/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x24.c
index b43b386..4439d55 100644
--- a/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x24.c
+++ b/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x24.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x32.c b/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x32.c
index d4e05d1..31a39bf 100644
--- a/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x32.c
+++ b/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x32.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x8.c b/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x8.c
index 88230d0..f17f0cc 100644
--- a/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x8.c
+++ b/src/qs8-vaddc/gen/minmax-sse41-mul32-ld32-x8.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-wasmsimd-x16.c b/src/qs8-vaddc/gen/minmax-wasmsimd-x16.c
index b722efc..cff5eed 100644
--- a/src/qs8-vaddc/gen/minmax-wasmsimd-x16.c
+++ b/src/qs8-vaddc/gen/minmax-wasmsimd-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
   const int32_t vshift = params->wasmsimd.shift;
diff --git a/src/qs8-vaddc/gen/minmax-wasmsimd-x24.c b/src/qs8-vaddc/gen/minmax-wasmsimd-x24.c
index 51633b5..24cf9d8 100644
--- a/src/qs8-vaddc/gen/minmax-wasmsimd-x24.c
+++ b/src/qs8-vaddc/gen/minmax-wasmsimd-x24.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
   const int32_t vshift = params->wasmsimd.shift;
diff --git a/src/qs8-vaddc/gen/minmax-wasmsimd-x32.c b/src/qs8-vaddc/gen/minmax-wasmsimd-x32.c
index 5a9b4b6..33724ed 100644
--- a/src/qs8-vaddc/gen/minmax-wasmsimd-x32.c
+++ b/src/qs8-vaddc/gen/minmax-wasmsimd-x32.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
   const int32_t vshift = params->wasmsimd.shift;
diff --git a/src/qs8-vaddc/gen/minmax-wasmsimd-x8.c b/src/qs8-vaddc/gen/minmax-wasmsimd-x8.c
index 6bd8a53..fc9d6d7 100644
--- a/src/qs8-vaddc/gen/minmax-wasmsimd-x8.c
+++ b/src/qs8-vaddc/gen/minmax-wasmsimd-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
   const int32_t vshift = params->wasmsimd.shift;
diff --git a/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x16.c b/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x16.c
index a894fc7..06fd4c3 100644
--- a/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x16.c
+++ b/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x16.c
@@ -25,7 +25,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x24.c b/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x24.c
index 5bdf4c4..740d03e 100644
--- a/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x24.c
+++ b/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x24.c
@@ -25,7 +25,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x32.c b/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x32.c
index 5924c7c..81d6659 100644
--- a/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x32.c
+++ b/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x32.c
@@ -25,7 +25,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x8.c b/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x8.c
index 34ca82d..2680112 100644
--- a/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x8.c
+++ b/src/qs8-vaddc/gen/minmax-xop-mul32-ld32-x8.c
@@ -25,7 +25,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4_mul32.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4_mul32.shift);
diff --git a/src/qs8-vaddc/neon.c.in b/src/qs8-vaddc/neon.c.in
index e70f3c5..b154865 100644
--- a/src/qs8-vaddc/neon.c.in
+++ b/src/qs8-vaddc/neon.c.in
@@ -39,7 +39,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   $if LD128:
     #if XNN_ARCH_ARM64
diff --git a/src/qs8-vaddc/scalar.c.in b/src/qs8-vaddc/scalar.c.in
index 0f85ac8..61109b5 100644
--- a/src/qs8-vaddc/scalar.c.in
+++ b/src/qs8-vaddc/scalar.c.in
@@ -17,7 +17,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias + (int32_t) *input_b * params->scalar.b_multiplier;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qs8-vaddc/sse-mul16-ld64.c.in b/src/qs8-vaddc/sse-mul16-ld64.c.in
index 621f3ce..151285d 100644
--- a/src/qs8-vaddc/sse-mul16-ld64.c.in
+++ b/src/qs8-vaddc/sse-mul16-ld64.c.in
@@ -29,7 +29,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->${PARAMS_STRUCT}.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qs8-vaddc/sse-mul32-ld32.c.in b/src/qs8-vaddc/sse-mul32-ld32.c.in
index 700680c..2587f70 100644
--- a/src/qs8-vaddc/sse-mul32-ld32.c.in
+++ b/src/qs8-vaddc/sse-mul32-ld32.c.in
@@ -37,7 +37,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->${PARAMS_STRUCT}.shift);
diff --git a/src/qs8-vaddc/wasmsimd.c.in b/src/qs8-vaddc/wasmsimd.c.in
index 697f27f..1345ff9 100644
--- a/src/qs8-vaddc/wasmsimd.c.in
+++ b/src/qs8-vaddc/wasmsimd.c.in
@@ -26,7 +26,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
   const int32_t vshift = params->wasmsimd.shift;
diff --git a/src/qs8-vmul/gen/minmax-fp32-avx-mul16-ld64-x16.c b/src/qs8-vmul/gen/minmax-fp32-avx-mul16-ld64-x16.c
index ad2271f..b71574a 100644
--- a/src/qs8-vmul/gen/minmax-fp32-avx-mul16-ld64-x16.c
+++ b/src/qs8-vmul/gen/minmax-fp32-avx-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse4.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-avx-mul16-ld64-x8.c b/src/qs8-vmul/gen/minmax-fp32-avx-mul16-ld64-x8.c
index 08b8a17..6f8c91f 100644
--- a/src/qs8-vmul/gen/minmax-fp32-avx-mul16-ld64-x8.c
+++ b/src/qs8-vmul/gen/minmax-fp32-avx-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse4.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-neon-ld128-x16.c b/src/qs8-vmul/gen/minmax-fp32-neon-ld128-x16.c
index 89651fa..9b147aa 100644
--- a/src/qs8-vmul/gen/minmax-fp32-neon-ld128-x16.c
+++ b/src/qs8-vmul/gen/minmax-fp32-neon-ld128-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const int8x16_t va_zero_point = vld1q_dup_s8(params->fp32_neon.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-neon-ld64-x16.c b/src/qs8-vmul/gen/minmax-fp32-neon-ld64-x16.c
index 98f7103..2a9a2e2 100644
--- a/src/qs8-vmul/gen/minmax-fp32-neon-ld64-x16.c
+++ b/src/qs8-vmul/gen/minmax-fp32-neon-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(params->fp32_neon.a_zero_point);
   const int8x8_t vb_zero_point = vld1_dup_s8(params->fp32_neon.b_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-neon-ld64-x8.c b/src/qs8-vmul/gen/minmax-fp32-neon-ld64-x8.c
index c0700d6..5dda1a2 100644
--- a/src/qs8-vmul/gen/minmax-fp32-neon-ld64-x8.c
+++ b/src/qs8-vmul/gen/minmax-fp32-neon-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(params->fp32_neon.a_zero_point);
   const int8x8_t vb_zero_point = vld1_dup_s8(params->fp32_neon.b_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-neonv8-ld128-x16.c b/src/qs8-vmul/gen/minmax-fp32-neonv8-ld128-x16.c
index f99a75b..139a20f 100644
--- a/src/qs8-vmul/gen/minmax-fp32-neonv8-ld128-x16.c
+++ b/src/qs8-vmul/gen/minmax-fp32-neonv8-ld128-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const int8x16_t va_zero_point = vld1q_dup_s8(params->fp32_neonv8.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-neonv8-ld64-x16.c b/src/qs8-vmul/gen/minmax-fp32-neonv8-ld64-x16.c
index 34a1e8b..c24f35f 100644
--- a/src/qs8-vmul/gen/minmax-fp32-neonv8-ld64-x16.c
+++ b/src/qs8-vmul/gen/minmax-fp32-neonv8-ld64-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(params->fp32_neonv8.a_zero_point);
   const int8x8_t vb_zero_point = vld1_dup_s8(params->fp32_neonv8.b_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-neonv8-ld64-x8.c b/src/qs8-vmul/gen/minmax-fp32-neonv8-ld64-x8.c
index e013de5..3ce8cb7 100644
--- a/src/qs8-vmul/gen/minmax-fp32-neonv8-ld64-x8.c
+++ b/src/qs8-vmul/gen/minmax-fp32-neonv8-ld64-x8.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(params->fp32_neonv8.a_zero_point);
   const int8x8_t vb_zero_point = vld1_dup_s8(params->fp32_neonv8.b_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-scalar-x1.c b/src/qs8-vmul/gen/minmax-fp32-scalar-x1.c
index 29e25bb..850036d 100644
--- a/src/qs8-vmul/gen/minmax-fp32-scalar-x1.c
+++ b/src/qs8-vmul/gen/minmax-fp32-scalar-x1.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const int32_t vb_zero_point = params->fp32_scalar.b_zero_point;
diff --git a/src/qs8-vmul/gen/minmax-fp32-scalar-x2.c b/src/qs8-vmul/gen/minmax-fp32-scalar-x2.c
index 160184b..63c8956 100644
--- a/src/qs8-vmul/gen/minmax-fp32-scalar-x2.c
+++ b/src/qs8-vmul/gen/minmax-fp32-scalar-x2.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const int32_t vb_zero_point = params->fp32_scalar.b_zero_point;
diff --git a/src/qs8-vmul/gen/minmax-fp32-scalar-x4.c b/src/qs8-vmul/gen/minmax-fp32-scalar-x4.c
index e2397ea..56b1480 100644
--- a/src/qs8-vmul/gen/minmax-fp32-scalar-x4.c
+++ b/src/qs8-vmul/gen/minmax-fp32-scalar-x4.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const int32_t vb_zero_point = params->fp32_scalar.b_zero_point;
diff --git a/src/qs8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x16.c b/src/qs8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x16.c
index 70f4dd7..c1363bb 100644
--- a/src/qs8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x16.c
+++ b/src/qs8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x8.c b/src/qs8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x8.c
index 04d8cdc..e5d471c 100644
--- a/src/qs8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x8.c
+++ b/src/qs8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x16.c b/src/qs8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x16.c
index abf2d98..d32f639 100644
--- a/src/qs8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x16.c
+++ b/src/qs8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse4.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x8.c b/src/qs8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x8.c
index cab5e16..3506e1e 100644
--- a/src/qs8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x8.c
+++ b/src/qs8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse4.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c b/src/qs8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
index d70c1d4..bf8ef74 100644
--- a/src/qs8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
+++ b/src/qs8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->fp32_wasmsimd.a_zero_point);
diff --git a/src/qs8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c b/src/qs8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
index f951f61..fc9af8c 100644
--- a/src/qs8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
+++ b/src/qs8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->fp32_wasmsimd.a_zero_point);
diff --git a/src/qs8-vmul/neon.c.in b/src/qs8-vmul/neon.c.in
index 595e221..274c3ec 100644
--- a/src/qs8-vmul/neon.c.in
+++ b/src/qs8-vmul/neon.c.in
@@ -44,7 +44,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   $if LD128:
     #if XNN_ARCH_ARM64
diff --git a/src/qs8-vmul/scalar.c.in b/src/qs8-vmul/scalar.c.in
index 5fdee20..ca7421a 100644
--- a/src/qs8-vmul/scalar.c.in
+++ b/src/qs8-vmul/scalar.c.in
@@ -20,7 +20,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const int32_t vb_zero_point = params->fp32_scalar.b_zero_point;
diff --git a/src/qs8-vmul/sse-mul16-ld64.c.in b/src/qs8-vmul/sse-mul16-ld64.c.in
index 17f5931..27ef43c 100644
--- a/src/qs8-vmul/sse-mul16-ld64.c.in
+++ b/src/qs8-vmul/sse-mul16-ld64.c.in
@@ -30,7 +30,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.a_zero_point);
diff --git a/src/qs8-vmul/wasmsimd-mul32-ld64.c.in b/src/qs8-vmul/wasmsimd-mul32-ld64.c.in
index 9a49e19..7149175 100644
--- a/src/qs8-vmul/wasmsimd-mul32-ld64.c.in
+++ b/src/qs8-vmul/wasmsimd-mul32-ld64.c.in
@@ -27,7 +27,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->${PARAMS_STRUCT}.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x16.c b/src/qs8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x16.c
index 1c79774..3609673 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x16.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse4.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x8.c b/src/qs8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x8.c
index 51d2437..2ed30ba 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x8.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse4.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-neon-ld128-x16.c b/src/qs8-vmulc/gen/minmax-fp32-neon-ld128-x16.c
index d115042..b5fc466 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-neon-ld128-x16.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-neon-ld128-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const int8x16_t va_zero_point = vld1q_dup_s8(params->fp32_neon.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-neon-ld64-x16.c b/src/qs8-vmulc/gen/minmax-fp32-neon-ld64-x16.c
index fcbdc04..bf15730 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-neon-ld64-x16.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-neon-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(params->fp32_neon.a_zero_point);
   const float32x4_t vscale = vld1q_dup_f32(&params->fp32_neon.scale);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-neon-ld64-x8.c b/src/qs8-vmulc/gen/minmax-fp32-neon-ld64-x8.c
index e69cf0a..600a6e9 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-neon-ld64-x8.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-neon-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(params->fp32_neon.a_zero_point);
   const float32x4_t vscale = vld1q_dup_f32(&params->fp32_neon.scale);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld128-x16.c b/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld128-x16.c
index 03acb3f..3aa9c6c 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld128-x16.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld128-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const int8x16_t va_zero_point = vld1q_dup_s8(params->fp32_neonv8.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld64-x16.c b/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld64-x16.c
index ac3c891..0c5f01c 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld64-x16.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld64-x16.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(params->fp32_neonv8.a_zero_point);
   const float32x4_t vscale = vld1q_dup_f32(&params->fp32_neonv8.scale);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld64-x8.c b/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld64-x8.c
index b9e328d..83d298b 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld64-x8.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-neonv8-ld64-x8.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const int8x8_t va_zero_point = vld1_dup_s8(params->fp32_neonv8.a_zero_point);
   const float32x4_t vscale = vld1q_dup_f32(&params->fp32_neonv8.scale);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-scalar-x1.c b/src/qs8-vmulc/gen/minmax-fp32-scalar-x1.c
index 64b8ec5..f7fc15f 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-scalar-x1.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-scalar-x1.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const float vscale = params->fp32_scalar.scale;
diff --git a/src/qs8-vmulc/gen/minmax-fp32-scalar-x2.c b/src/qs8-vmulc/gen/minmax-fp32-scalar-x2.c
index c5c0b64..e0ac22a 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-scalar-x2.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-scalar-x2.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const float vscale = params->fp32_scalar.scale;
diff --git a/src/qs8-vmulc/gen/minmax-fp32-scalar-x4.c b/src/qs8-vmulc/gen/minmax-fp32-scalar-x4.c
index 40aa316..0847326 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-scalar-x4.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-scalar-x4.c
@@ -20,7 +20,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const float vscale = params->fp32_scalar.scale;
diff --git a/src/qs8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x16.c b/src/qs8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x16.c
index f0bdb7d..b4b02b8 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x16.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x8.c b/src/qs8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x8.c
index f9c3558..305a03d 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x8.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x16.c b/src/qs8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x16.c
index d87e7b6..511e366 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x16.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse4.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x8.c b/src/qs8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x8.c
index f2236dc..5c59c83 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x8.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse4.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c b/src/qs8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
index 56aa9c1..0688404 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->fp32_wasmsimd.a_zero_point);
diff --git a/src/qs8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c b/src/qs8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
index dced09e..74c238c 100644
--- a/src/qs8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
+++ b/src/qs8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
@@ -19,7 +19,7 @@
     const int8_t* input_a,
     const int8_t* input_b,
     int8_t* output,
-    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qs8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->fp32_wasmsimd.a_zero_point);
diff --git a/src/qs8-vmulc/neon.c.in b/src/qs8-vmulc/neon.c.in
index 63f81fe..16bb85e 100644
--- a/src/qs8-vmulc/neon.c.in
+++ b/src/qs8-vmulc/neon.c.in
@@ -44,7 +44,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   $if LD128:
     #if XNN_ARCH_ARM64
diff --git a/src/qs8-vmulc/scalar.c.in b/src/qs8-vmulc/scalar.c.in
index 72162b4..93ccebd 100644
--- a/src/qs8-vmulc/scalar.c.in
+++ b/src/qs8-vmulc/scalar.c.in
@@ -20,7 +20,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const float vscale = params->fp32_scalar.scale;
diff --git a/src/qs8-vmulc/sse-mul16-ld64.c.in b/src/qs8-vmulc/sse-mul16-ld64.c.in
index ec15d7d..d3d4c4a 100644
--- a/src/qs8-vmulc/sse-mul16-ld64.c.in
+++ b/src/qs8-vmulc/sse-mul16-ld64.c.in
@@ -30,7 +30,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.a_zero_point);
diff --git a/src/qs8-vmulc/wasmsimd-mul32-ld64.c.in b/src/qs8-vmulc/wasmsimd-mul32-ld64.c.in
index b4d01fc..089d1a5 100644
--- a/src/qs8-vmulc/wasmsimd-mul32-ld64.c.in
+++ b/src/qs8-vmulc/wasmsimd-mul32-ld64.c.in
@@ -27,7 +27,7 @@
     const ${XINT8_T}* input_a,
     const ${XINT8_T}* input_b,
     ${XINT8_T}* output,
-    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_${DATATYPE.lower()}_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->${PARAMS_STRUCT}.a_zero_point);
diff --git a/src/qu8-avgpool/9p8x-minmax-neon-c8.c b/src/qu8-avgpool/9p8x-minmax-neon-c8.c
index dcf6d1a..29a7f7d 100644
--- a/src/qu8-avgpool/9p8x-minmax-neon-c8.c
+++ b/src/qu8-avgpool/9p8x-minmax-neon-c8.c
@@ -25,7 +25,7 @@
     uint8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/qu8-avgpool/9p8x-minmax-sse2-c8.c b/src/qu8-avgpool/9p8x-minmax-sse2-c8.c
index d0db5e6..3a799ff 100644
--- a/src/qu8-avgpool/9p8x-minmax-sse2-c8.c
+++ b/src/qu8-avgpool/9p8x-minmax-sse2-c8.c
@@ -24,7 +24,7 @@
     uint8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements > 9);
diff --git a/src/qu8-avgpool/9x-minmax-neon-c8.c b/src/qu8-avgpool/9x-minmax-neon-c8.c
index c06e361..18cbb02 100644
--- a/src/qu8-avgpool/9x-minmax-neon-c8.c
+++ b/src/qu8-avgpool/9x-minmax-neon-c8.c
@@ -24,7 +24,7 @@
     uint8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/qu8-avgpool/9x-minmax-sse2-c8.c b/src/qu8-avgpool/9x-minmax-sse2-c8.c
index 5d487a6..b5477b6 100644
--- a/src/qu8-avgpool/9x-minmax-sse2-c8.c
+++ b/src/qu8-avgpool/9x-minmax-sse2-c8.c
@@ -23,7 +23,7 @@
     uint8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
index a795df3..b0e9212 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
index 6f9ded5..a694199 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
index 8413e02..a8b0493 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
index 6e3cb8b..bd711c1 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
index f152a11..0acbf33 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
index 980c5d1..5857103 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
index 9cf5723..34848a2 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
index 222dd1a..6d295ff 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
index a765199..0861f92 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
index d48c2da..2032aa2 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c b/src/qu8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
index 986d99e..9542f55 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-rndnu-neon-mul16.c b/src/qu8-dwconv/gen/up16x25-minmax-rndnu-neon-mul16.c
index 3238e02..a839ea2 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-rndnu-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8.c b/src/qu8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8.c
index 69b7665..25462a0 100644
--- a/src/qu8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8.c
+++ b/src/qu8-dwconv/gen/up16x25-minmax-rndnu-neon-mul8.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
index ed32d93..2b1104e 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
index 956fb89..d59415a 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
index 43e88e6..77adf3d 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
index 3c3ab09..1abfd02 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
index aba88bd..f9111c3 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
index 3fcc8c4..8d7525f 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
index f34d91a..1af6b71 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
index 5b2e23b..1a17c07 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
index 40f5d45..98f86f2 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
index 440bbf8..ab22ba2 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c b/src/qu8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
index c2a4849..801b75b 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-rndnu-neon-mul16.c b/src/qu8-dwconv/gen/up16x9-minmax-rndnu-neon-mul16.c
index f9833fd..674c2ff 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-rndnu-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8.c b/src/qu8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8.c
index cb2f495..88f8489 100644
--- a/src/qu8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8.c
+++ b/src/qu8-dwconv/gen/up16x9-minmax-rndnu-neon-mul8.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c b/src/qu8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
index b630329..766da37 100644
--- a/src/qu8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up24x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c b/src/qu8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
index 5918cae..6538701 100644
--- a/src/qu8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qu8-dwconv/gen/up24x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c b/src/qu8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
index 791c8e5..9feb305 100644
--- a/src/qu8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qu8-dwconv/gen/up24x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x25-minmax-rndnu-neon-mul16.c b/src/qu8-dwconv/gen/up24x25-minmax-rndnu-neon-mul16.c
index 4507b0e..637cf19 100644
--- a/src/qu8-dwconv/gen/up24x25-minmax-rndnu-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up24x25-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x25-minmax-rndnu-neon-mul8.c b/src/qu8-dwconv/gen/up24x25-minmax-rndnu-neon-mul8.c
index ef7dac7..2b016dd 100644
--- a/src/qu8-dwconv/gen/up24x25-minmax-rndnu-neon-mul8.c
+++ b/src/qu8-dwconv/gen/up24x25-minmax-rndnu-neon-mul8.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c b/src/qu8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
index 0f57782..c2b707d 100644
--- a/src/qu8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up24x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c b/src/qu8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
index 6caca59..d539420 100644
--- a/src/qu8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qu8-dwconv/gen/up24x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c b/src/qu8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
index aff0184..20f44bb 100644
--- a/src/qu8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qu8-dwconv/gen/up24x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x9-minmax-rndnu-neon-mul16.c b/src/qu8-dwconv/gen/up24x9-minmax-rndnu-neon-mul16.c
index 929a3ef..653701c 100644
--- a/src/qu8-dwconv/gen/up24x9-minmax-rndnu-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up24x9-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up24x9-minmax-rndnu-neon-mul8.c b/src/qu8-dwconv/gen/up24x9-minmax-rndnu-neon-mul8.c
index 409aa02..2e5b5e0 100644
--- a/src/qu8-dwconv/gen/up24x9-minmax-rndnu-neon-mul8.c
+++ b/src/qu8-dwconv/gen/up24x9-minmax-rndnu-neon-mul8.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c b/src/qu8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
index aecf804..71592ec 100644
--- a/src/qu8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
+++ b/src/qu8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c b/src/qu8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
index 01046f3..0213d23 100644
--- a/src/qu8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
+++ b/src/qu8-dwconv/gen/up32x25-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c b/src/qu8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
index 19e7270..46b6cf7 100644
--- a/src/qu8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up32x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c b/src/qu8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
index 1b262a9..adbe910 100644
--- a/src/qu8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qu8-dwconv/gen/up32x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x25-minmax-rndnu-neon-mul16.c b/src/qu8-dwconv/gen/up32x25-minmax-rndnu-neon-mul16.c
index ff0a72c..06e3784 100644
--- a/src/qu8-dwconv/gen/up32x25-minmax-rndnu-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up32x25-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x25-minmax-rndnu-neon-mul8.c b/src/qu8-dwconv/gen/up32x25-minmax-rndnu-neon-mul8.c
index 687dac5..3f8bb74 100644
--- a/src/qu8-dwconv/gen/up32x25-minmax-rndnu-neon-mul8.c
+++ b/src/qu8-dwconv/gen/up32x25-minmax-rndnu-neon-mul8.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c b/src/qu8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
index 6ebc24d..41d3ac9 100644
--- a/src/qu8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
+++ b/src/qu8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c b/src/qu8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
index 09f86dd..704f801 100644
--- a/src/qu8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
+++ b/src/qu8-dwconv/gen/up32x9-minmax-fp32-avx512skx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c b/src/qu8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
index f5745be..6ff3d32 100644
--- a/src/qu8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up32x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c b/src/qu8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
index f9c1f83..eb49dc6 100644
--- a/src/qu8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qu8-dwconv/gen/up32x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x9-minmax-rndnu-neon-mul16.c b/src/qu8-dwconv/gen/up32x9-minmax-rndnu-neon-mul16.c
index 0f8565b..6349dcf 100644
--- a/src/qu8-dwconv/gen/up32x9-minmax-rndnu-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up32x9-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up32x9-minmax-rndnu-neon-mul8.c b/src/qu8-dwconv/gen/up32x9-minmax-rndnu-neon-mul8.c
index 41f7695..fec2000 100644
--- a/src/qu8-dwconv/gen/up32x9-minmax-rndnu-neon-mul8.c
+++ b/src/qu8-dwconv/gen/up32x9-minmax-rndnu-neon-mul8.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
index 27f5713..ffa4cd9 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
index 7dbee6c..7f2bcd9 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
index b00bf1a..71490c4 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
index 0190689..9b408d8 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
index 0e9ba1f..a010548 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
index dac1f95..d6893e9 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
index 5b8204b..de66805 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
index 992eae8..20128a0 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
index ed8cf30..c998e2e 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c b/src/qu8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
index d755908..2124931 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-rndnu-neon-mul16.c b/src/qu8-dwconv/gen/up8x25-minmax-rndnu-neon-mul16.c
index 4376202..8422909 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-rndnu-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x25-minmax-rndnu-neon-mul8.c b/src/qu8-dwconv/gen/up8x25-minmax-rndnu-neon-mul8.c
index f7196bb..f7a5ec5 100644
--- a/src/qu8-dwconv/gen/up8x25-minmax-rndnu-neon-mul8.c
+++ b/src/qu8-dwconv/gen/up8x25-minmax-rndnu-neon-mul8.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
index 4520fe4..d20f595 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
index 7ca9428..8fba0bc 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
index ae8c666..8c26bdf 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
index a8f8a28..ef615cd 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
index ac24fa1..2220e6e 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-neonv8-mul16.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
index 6123c0e..ba479f7 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse2-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
index 9dd8385..903d96b 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse41-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
index e570fcc..77cb134 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-sse41-mul32.c
@@ -25,7 +25,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
index 059291c..80c2dc4 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-wasmsimd-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c b/src/qu8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
index ae3fb65..4693f8d 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-fp32-xop-mul32.c
@@ -30,7 +30,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-rndnu-neon-mul16.c b/src/qu8-dwconv/gen/up8x9-minmax-rndnu-neon-mul16.c
index c197ae9..d1cd0c6 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-rndnu-neon-mul16.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-rndnu-neon-mul16.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/gen/up8x9-minmax-rndnu-neon-mul8.c b/src/qu8-dwconv/gen/up8x9-minmax-rndnu-neon-mul8.c
index 27387a6..dd09f98 100644
--- a/src/qu8-dwconv/gen/up8x9-minmax-rndnu-neon-mul8.c
+++ b/src/qu8-dwconv/gen/up8x9-minmax-rndnu-neon-mul8.c
@@ -24,7 +24,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-dwconv/unipass-neon-mul8.c.in b/src/qu8-dwconv/unipass-neon-mul8.c.in
index 4b6631e..99e10b0 100644
--- a/src/qu8-dwconv/unipass-neon-mul8.c.in
+++ b/src/qu8-dwconv/unipass-neon-mul8.c.in
@@ -26,7 +26,7 @@
     size_t output_increment,
     size_t input_offset,
     const uint8_t* zero,
-    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_conv_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(channels != 0);
   assert(output_width != 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-neon-x16.c b/src/qu8-f32-vcvt/gen/vcvt-neon-x16.c
index 4dab3c0..fefd90d 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-neon-x16.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-neon-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-neon-x24.c b/src/qu8-f32-vcvt/gen/vcvt-neon-x24.c
index e781a87..c7e2411 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-neon-x24.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-neon-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-neon-x32.c b/src/qu8-f32-vcvt/gen/vcvt-neon-x32.c
index fcd7ec3..c6f4f90 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-neon-x32.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-neon-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-neon-x8.c b/src/qu8-f32-vcvt/gen/vcvt-neon-x8.c
index 6250514..ba07bde 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-neon-x8.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-neon-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-sse2-x16.c b/src/qu8-f32-vcvt/gen/vcvt-sse2-x16.c
index 5f5de72..c4cc587 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-sse2-x16.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-sse2-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-sse2-x24.c b/src/qu8-f32-vcvt/gen/vcvt-sse2-x24.c
index 2374a65..dd27634 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-sse2-x24.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-sse2-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-sse2-x32.c b/src/qu8-f32-vcvt/gen/vcvt-sse2-x32.c
index 7455588..61d5e7f 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-sse2-x32.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-sse2-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-sse2-x8.c b/src/qu8-f32-vcvt/gen/vcvt-sse2-x8.c
index d5c99f2..79ddd62 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-sse2-x8.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-sse2-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-sse41-x16.c b/src/qu8-f32-vcvt/gen/vcvt-sse41-x16.c
index 4974b33..5211db0 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-sse41-x16.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-sse41-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-sse41-x24.c b/src/qu8-f32-vcvt/gen/vcvt-sse41-x24.c
index 68460e0..ae8cf0f 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-sse41-x24.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-sse41-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-sse41-x32.c b/src/qu8-f32-vcvt/gen/vcvt-sse41-x32.c
index dd11b4e..e1684cd 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-sse41-x32.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-sse41-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-sse41-x8.c b/src/qu8-f32-vcvt/gen/vcvt-sse41-x8.c
index f455a24..42a5426 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-sse41-x8.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-sse41-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x16.c b/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x16.c
index d04e47b..623bc5f 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x16.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x16.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x24.c b/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x24.c
index 97108f3..a31f965 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x24.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x24.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x32.c b/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x32.c
index 1709159..8156719 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x32.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x32.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x8.c b/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x8.c
index 5e9f85f..deb9e02 100644
--- a/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x8.c
+++ b/src/qu8-f32-vcvt/gen/vcvt-wasmsimd-x8.c
@@ -20,7 +20,7 @@
     size_t n,
     const uint8_t* x,
     float* y,
-    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
   assert(n % sizeof(uint8_t) == 0);
diff --git a/src/qu8-gavgpool/7p7x-minmax-neon-c8.c b/src/qu8-gavgpool/7p7x-minmax-neon-c8.c
index 8de68e9..02da189 100644
--- a/src/qu8-gavgpool/7p7x-minmax-neon-c8.c
+++ b/src/qu8-gavgpool/7p7x-minmax-neon-c8.c
@@ -23,7 +23,7 @@
     const uint8_t* zero,
     int32_t* buffer,
     uint8_t* output,
-    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qu8-gavgpool/7p7x-minmax-sse2-c8.c b/src/qu8-gavgpool/7p7x-minmax-sse2-c8.c
index d4cf431..950e8f8 100644
--- a/src/qu8-gavgpool/7p7x-minmax-sse2-c8.c
+++ b/src/qu8-gavgpool/7p7x-minmax-sse2-c8.c
@@ -22,7 +22,7 @@
     const uint8_t* zero,
     int32_t* buffer,
     uint8_t* output,
-    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows > 7);
   assert(channels != 0);
diff --git a/src/qu8-gavgpool/7x-minmax-neon-c8.c b/src/qu8-gavgpool/7x-minmax-neon-c8.c
index 0068ee9..6bfb312 100644
--- a/src/qu8-gavgpool/7x-minmax-neon-c8.c
+++ b/src/qu8-gavgpool/7x-minmax-neon-c8.c
@@ -21,7 +21,7 @@
     size_t input_stride,
     const uint8_t* zero,
     uint8_t* output,
-    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qu8-gavgpool/7x-minmax-sse2-c8.c b/src/qu8-gavgpool/7x-minmax-sse2-c8.c
index be9ec6a..6a577ba 100644
--- a/src/qu8-gavgpool/7x-minmax-sse2-c8.c
+++ b/src/qu8-gavgpool/7x-minmax-sse2-c8.c
@@ -20,7 +20,7 @@
     size_t input_stride,
     const uint8_t* zero,
     uint8_t* output,
-    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_avgpool_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(rows != 0);
   assert(rows <= 7);
diff --git a/src/qu8-vadd/gen/minmax-avx-mul16-ld64-x16.c b/src/qu8-vadd/gen/minmax-avx-mul16-ld64-x16.c
index 9d2da04..c3f25fc 100644
--- a/src/qu8-vadd/gen/minmax-avx-mul16-ld64-x16.c
+++ b/src/qu8-vadd/gen/minmax-avx-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qu8-vadd/gen/minmax-avx-mul16-ld64-x8.c b/src/qu8-vadd/gen/minmax-avx-mul16-ld64-x8.c
index 3d55d0f..1a5c3cc 100644
--- a/src/qu8-vadd/gen/minmax-avx-mul16-ld64-x8.c
+++ b/src/qu8-vadd/gen/minmax-avx-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qu8-vadd/gen/minmax-avx-mul32-ld32-x16.c b/src/qu8-vadd/gen/minmax-avx-mul32-ld32-x16.c
index 0075baa..754610d 100644
--- a/src/qu8-vadd/gen/minmax-avx-mul32-ld32-x16.c
+++ b/src/qu8-vadd/gen/minmax-avx-mul32-ld32-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-avx-mul32-ld32-x8.c b/src/qu8-vadd/gen/minmax-avx-mul32-ld32-x8.c
index 36bcc2a..c7614d2 100644
--- a/src/qu8-vadd/gen/minmax-avx-mul32-ld32-x8.c
+++ b/src/qu8-vadd/gen/minmax-avx-mul32-ld32-x8.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-avx2-mul32-ld64-x16.c b/src/qu8-vadd/gen/minmax-avx2-mul32-ld64-x16.c
index d2e9996..670ee93 100644
--- a/src/qu8-vadd/gen/minmax-avx2-mul32-ld64-x16.c
+++ b/src/qu8-vadd/gen/minmax-avx2-mul32-ld64-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i vbias = _mm256_load_si256((const __m256i*) params->avx2.bias);
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-avx2-mul32-ld64-x8.c b/src/qu8-vadd/gen/minmax-avx2-mul32-ld64-x8.c
index 2910624..a1c605b 100644
--- a/src/qu8-vadd/gen/minmax-avx2-mul32-ld64-x8.c
+++ b/src/qu8-vadd/gen/minmax-avx2-mul32-ld64-x8.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i vbias = _mm256_load_si256((const __m256i*) params->avx2.bias);
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-avx512skx-mul32-ld128-x16.c b/src/qu8-vadd/gen/minmax-avx512skx-mul32-ld128-x16.c
index 46110ce..318a7ff 100644
--- a/src/qu8-vadd/gen/minmax-avx512skx-mul32-ld128-x16.c
+++ b/src/qu8-vadd/gen/minmax-avx512skx-mul32-ld128-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i vbias = _mm512_load_si512(params->avx512.bias);
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-avx512skx-mul32-ld128-x32.c b/src/qu8-vadd/gen/minmax-avx512skx-mul32-ld128-x32.c
index cb86eec..3eef1c6 100644
--- a/src/qu8-vadd/gen/minmax-avx512skx-mul32-ld128-x32.c
+++ b/src/qu8-vadd/gen/minmax-avx512skx-mul32-ld128-x32.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i vbias = _mm512_load_si512(params->avx512.bias);
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-neon-ld128-x16.c b/src/qu8-vadd/gen/minmax-neon-ld128-x16.c
index a19ab98..9cc5ecd 100644
--- a/src/qu8-vadd/gen/minmax-neon-ld128-x16.c
+++ b/src/qu8-vadd/gen/minmax-neon-ld128-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const uint8x16_t va_zero_point = vld1q_dup_u8(&params->neon.a_zero_point);
diff --git a/src/qu8-vadd/gen/minmax-neon-ld64-x16.c b/src/qu8-vadd/gen/minmax-neon-ld64-x16.c
index 98caf66..70c26e3 100644
--- a/src/qu8-vadd/gen/minmax-neon-ld64-x16.c
+++ b/src/qu8-vadd/gen/minmax-neon-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(&params->neon.a_zero_point);
   const uint8x8_t vb_zero_point = vld1_dup_u8(&params->neon.b_zero_point);
diff --git a/src/qu8-vadd/gen/minmax-neon-ld64-x32.c b/src/qu8-vadd/gen/minmax-neon-ld64-x32.c
index 10f278c..8d50136 100644
--- a/src/qu8-vadd/gen/minmax-neon-ld64-x32.c
+++ b/src/qu8-vadd/gen/minmax-neon-ld64-x32.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(&params->neon.a_zero_point);
   const uint8x8_t vb_zero_point = vld1_dup_u8(&params->neon.b_zero_point);
diff --git a/src/qu8-vadd/gen/minmax-neon-ld64-x8.c b/src/qu8-vadd/gen/minmax-neon-ld64-x8.c
index 9e3adce..87f7eb8 100644
--- a/src/qu8-vadd/gen/minmax-neon-ld64-x8.c
+++ b/src/qu8-vadd/gen/minmax-neon-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(&params->neon.a_zero_point);
   const uint8x8_t vb_zero_point = vld1_dup_u8(&params->neon.b_zero_point);
diff --git a/src/qu8-vadd/gen/minmax-scalar-x1.c b/src/qu8-vadd/gen/minmax-scalar-x1.c
index 430435c..79e3ee5 100644
--- a/src/qu8-vadd/gen/minmax-scalar-x1.c
+++ b/src/qu8-vadd/gen/minmax-scalar-x1.c
@@ -18,7 +18,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qu8-vadd/gen/minmax-scalar-x2.c b/src/qu8-vadd/gen/minmax-scalar-x2.c
index 78404b1..05203dc 100644
--- a/src/qu8-vadd/gen/minmax-scalar-x2.c
+++ b/src/qu8-vadd/gen/minmax-scalar-x2.c
@@ -18,7 +18,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qu8-vadd/gen/minmax-scalar-x4.c b/src/qu8-vadd/gen/minmax-scalar-x4.c
index 4f153be..f433225 100644
--- a/src/qu8-vadd/gen/minmax-scalar-x4.c
+++ b/src/qu8-vadd/gen/minmax-scalar-x4.c
@@ -18,7 +18,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qu8-vadd/gen/minmax-sse2-mul16-ld64-x16.c b/src/qu8-vadd/gen/minmax-sse2-mul16-ld64-x16.c
index fa92f77..c1a42ed 100644
--- a/src/qu8-vadd/gen/minmax-sse2-mul16-ld64-x16.c
+++ b/src/qu8-vadd/gen/minmax-sse2-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qu8-vadd/gen/minmax-sse2-mul16-ld64-x8.c b/src/qu8-vadd/gen/minmax-sse2-mul16-ld64-x8.c
index be00962..6777b38 100644
--- a/src/qu8-vadd/gen/minmax-sse2-mul16-ld64-x8.c
+++ b/src/qu8-vadd/gen/minmax-sse2-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qu8-vadd/gen/minmax-sse41-mul16-ld64-x16.c b/src/qu8-vadd/gen/minmax-sse41-mul16-ld64-x16.c
index 60e858a..000e696 100644
--- a/src/qu8-vadd/gen/minmax-sse41-mul16-ld64-x16.c
+++ b/src/qu8-vadd/gen/minmax-sse41-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qu8-vadd/gen/minmax-sse41-mul16-ld64-x8.c b/src/qu8-vadd/gen/minmax-sse41-mul16-ld64-x8.c
index d1cdd1c..48a2136 100644
--- a/src/qu8-vadd/gen/minmax-sse41-mul16-ld64-x8.c
+++ b/src/qu8-vadd/gen/minmax-sse41-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse2.bias);
   const __m128i va_multiplier_lo = _mm_load_si128((const __m128i*) params->sse2.a_multiplier_lo);
diff --git a/src/qu8-vadd/gen/minmax-sse41-mul32-ld32-x16.c b/src/qu8-vadd/gen/minmax-sse41-mul32-ld32-x16.c
index 4d2420a..e5b9205 100644
--- a/src/qu8-vadd/gen/minmax-sse41-mul32-ld32-x16.c
+++ b/src/qu8-vadd/gen/minmax-sse41-mul32-ld32-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-sse41-mul32-ld32-x8.c b/src/qu8-vadd/gen/minmax-sse41-mul32-ld32-x8.c
index 0adf807..8fb0ec8 100644
--- a/src/qu8-vadd/gen/minmax-sse41-mul32-ld32-x8.c
+++ b/src/qu8-vadd/gen/minmax-sse41-mul32-ld32-x8.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-wasmsimd-x16.c b/src/qu8-vadd/gen/minmax-wasmsimd-x16.c
index 956b9d3..7101414 100644
--- a/src/qu8-vadd/gen/minmax-wasmsimd-x16.c
+++ b/src/qu8-vadd/gen/minmax-wasmsimd-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t vbias = wasm_v128_load(params->wasmsimd.bias);
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-wasmsimd-x32.c b/src/qu8-vadd/gen/minmax-wasmsimd-x32.c
index 43e7d97..5aa61e5 100644
--- a/src/qu8-vadd/gen/minmax-wasmsimd-x32.c
+++ b/src/qu8-vadd/gen/minmax-wasmsimd-x32.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t vbias = wasm_v128_load(params->wasmsimd.bias);
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-wasmsimd-x8.c b/src/qu8-vadd/gen/minmax-wasmsimd-x8.c
index bdcfbfe..5061390 100644
--- a/src/qu8-vadd/gen/minmax-wasmsimd-x8.c
+++ b/src/qu8-vadd/gen/minmax-wasmsimd-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t vbias = wasm_v128_load(params->wasmsimd.bias);
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-xop-mul32-ld32-x16.c b/src/qu8-vadd/gen/minmax-xop-mul32-ld32-x16.c
index ffd2cf8..7d3de52 100644
--- a/src/qu8-vadd/gen/minmax-xop-mul32-ld32-x16.c
+++ b/src/qu8-vadd/gen/minmax-xop-mul32-ld32-x16.c
@@ -25,7 +25,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
diff --git a/src/qu8-vadd/gen/minmax-xop-mul32-ld32-x8.c b/src/qu8-vadd/gen/minmax-xop-mul32-ld32-x8.c
index 259175d..a3d4fdd 100644
--- a/src/qu8-vadd/gen/minmax-xop-mul32-ld32-x8.c
+++ b/src/qu8-vadd/gen/minmax-xop-mul32-ld32-x8.c
@@ -25,7 +25,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_load_si128((const __m128i*) params->sse4.bias);
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
diff --git a/src/qu8-vaddc/gen/minmax-avx-mul16-ld64-x16.c b/src/qu8-vaddc/gen/minmax-avx-mul16-ld64-x16.c
index df51820..f6096ba 100644
--- a/src/qu8-vaddc/gen/minmax-avx-mul16-ld64-x16.c
+++ b/src/qu8-vaddc/gen/minmax-avx-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qu8-vaddc/gen/minmax-avx-mul16-ld64-x8.c b/src/qu8-vaddc/gen/minmax-avx-mul16-ld64-x8.c
index 43bdb76..36a7981 100644
--- a/src/qu8-vaddc/gen/minmax-avx-mul16-ld64-x8.c
+++ b/src/qu8-vaddc/gen/minmax-avx-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qu8-vaddc/gen/minmax-avx-mul32-ld32-x16.c b/src/qu8-vaddc/gen/minmax-avx-mul32-ld32-x16.c
index 21eb4cd..f83a828 100644
--- a/src/qu8-vaddc/gen/minmax-avx-mul32-ld32-x16.c
+++ b/src/qu8-vaddc/gen/minmax-avx-mul32-ld32-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4.shift);
diff --git a/src/qu8-vaddc/gen/minmax-avx-mul32-ld32-x8.c b/src/qu8-vaddc/gen/minmax-avx-mul32-ld32-x8.c
index db4c569..c00a492 100644
--- a/src/qu8-vaddc/gen/minmax-avx-mul32-ld32-x8.c
+++ b/src/qu8-vaddc/gen/minmax-avx-mul32-ld32-x8.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4.shift);
diff --git a/src/qu8-vaddc/gen/minmax-avx2-mul32-ld64-x16.c b/src/qu8-vaddc/gen/minmax-avx2-mul32-ld64-x16.c
index a9d0ef7..6567c39 100644
--- a/src/qu8-vaddc/gen/minmax-avx2-mul32-ld64-x16.c
+++ b/src/qu8-vaddc/gen/minmax-avx2-mul32-ld64-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx2.shift);
diff --git a/src/qu8-vaddc/gen/minmax-avx2-mul32-ld64-x8.c b/src/qu8-vaddc/gen/minmax-avx2-mul32-ld64-x8.c
index 0e64fee..74ad2b0 100644
--- a/src/qu8-vaddc/gen/minmax-avx2-mul32-ld64-x8.c
+++ b/src/qu8-vaddc/gen/minmax-avx2-mul32-ld64-x8.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m256i va_multiplier = _mm256_load_si256((const __m256i*) params->avx2.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx2.shift);
diff --git a/src/qu8-vaddc/gen/minmax-avx512skx-mul32-ld128-x16.c b/src/qu8-vaddc/gen/minmax-avx512skx-mul32-ld128-x16.c
index d63f7b6..1be381e 100644
--- a/src/qu8-vaddc/gen/minmax-avx512skx-mul32-ld128-x16.c
+++ b/src/qu8-vaddc/gen/minmax-avx512skx-mul32-ld128-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx512.shift);
diff --git a/src/qu8-vaddc/gen/minmax-avx512skx-mul32-ld128-x32.c b/src/qu8-vaddc/gen/minmax-avx512skx-mul32-ld128-x32.c
index ceebdcf..bd948f2 100644
--- a/src/qu8-vaddc/gen/minmax-avx512skx-mul32-ld128-x32.c
+++ b/src/qu8-vaddc/gen/minmax-avx512skx-mul32-ld128-x32.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const __m512i va_multiplier = _mm512_load_si512(params->avx512.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->avx512.shift);
diff --git a/src/qu8-vaddc/gen/minmax-neon-ld128-x16.c b/src/qu8-vaddc/gen/minmax-neon-ld128-x16.c
index e231999..7a6213e 100644
--- a/src/qu8-vaddc/gen/minmax-neon-ld128-x16.c
+++ b/src/qu8-vaddc/gen/minmax-neon-ld128-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const uint8x16_t va_zero_point = vld1q_dup_u8(&params->neon.a_zero_point);
diff --git a/src/qu8-vaddc/gen/minmax-neon-ld64-x16.c b/src/qu8-vaddc/gen/minmax-neon-ld64-x16.c
index f8185e2..a4896ce 100644
--- a/src/qu8-vaddc/gen/minmax-neon-ld64-x16.c
+++ b/src/qu8-vaddc/gen/minmax-neon-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(&params->neon.a_zero_point);
   const int32x4_t va_multiplier = vld1q_dup_s32(&params->neon.a_multiplier);
diff --git a/src/qu8-vaddc/gen/minmax-neon-ld64-x32.c b/src/qu8-vaddc/gen/minmax-neon-ld64-x32.c
index d6ddfa1..5ac6148 100644
--- a/src/qu8-vaddc/gen/minmax-neon-ld64-x32.c
+++ b/src/qu8-vaddc/gen/minmax-neon-ld64-x32.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(&params->neon.a_zero_point);
   const int32x4_t va_multiplier = vld1q_dup_s32(&params->neon.a_multiplier);
diff --git a/src/qu8-vaddc/gen/minmax-neon-ld64-x8.c b/src/qu8-vaddc/gen/minmax-neon-ld64-x8.c
index bde3ed1..d9886dd 100644
--- a/src/qu8-vaddc/gen/minmax-neon-ld64-x8.c
+++ b/src/qu8-vaddc/gen/minmax-neon-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(&params->neon.a_zero_point);
   const int32x4_t va_multiplier = vld1q_dup_s32(&params->neon.a_multiplier);
diff --git a/src/qu8-vaddc/gen/minmax-scalar-x1.c b/src/qu8-vaddc/gen/minmax-scalar-x1.c
index c506999..096b2fc 100644
--- a/src/qu8-vaddc/gen/minmax-scalar-x1.c
+++ b/src/qu8-vaddc/gen/minmax-scalar-x1.c
@@ -18,7 +18,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias + (int32_t) *input_b * params->scalar.b_multiplier;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qu8-vaddc/gen/minmax-scalar-x2.c b/src/qu8-vaddc/gen/minmax-scalar-x2.c
index 4e48464..ff775bf 100644
--- a/src/qu8-vaddc/gen/minmax-scalar-x2.c
+++ b/src/qu8-vaddc/gen/minmax-scalar-x2.c
@@ -18,7 +18,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias + (int32_t) *input_b * params->scalar.b_multiplier;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qu8-vaddc/gen/minmax-scalar-x4.c b/src/qu8-vaddc/gen/minmax-scalar-x4.c
index af54875..d77b74f 100644
--- a/src/qu8-vaddc/gen/minmax-scalar-x4.c
+++ b/src/qu8-vaddc/gen/minmax-scalar-x4.c
@@ -18,7 +18,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t vbias = params->scalar.bias + (int32_t) *input_b * params->scalar.b_multiplier;
   const int32_t va_multiplier = params->scalar.a_multiplier;
diff --git a/src/qu8-vaddc/gen/minmax-sse2-mul16-ld64-x16.c b/src/qu8-vaddc/gen/minmax-sse2-mul16-ld64-x16.c
index 673c34a..19bedc9 100644
--- a/src/qu8-vaddc/gen/minmax-sse2-mul16-ld64-x16.c
+++ b/src/qu8-vaddc/gen/minmax-sse2-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qu8-vaddc/gen/minmax-sse2-mul16-ld64-x8.c b/src/qu8-vaddc/gen/minmax-sse2-mul16-ld64-x8.c
index e1c5764..101a0bd 100644
--- a/src/qu8-vaddc/gen/minmax-sse2-mul16-ld64-x8.c
+++ b/src/qu8-vaddc/gen/minmax-sse2-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qu8-vaddc/gen/minmax-sse41-mul16-ld64-x16.c b/src/qu8-vaddc/gen/minmax-sse41-mul16-ld64-x16.c
index 9f3d3e2..2285557 100644
--- a/src/qu8-vaddc/gen/minmax-sse41-mul16-ld64-x16.c
+++ b/src/qu8-vaddc/gen/minmax-sse41-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qu8-vaddc/gen/minmax-sse41-mul16-ld64-x8.c b/src/qu8-vaddc/gen/minmax-sse41-mul16-ld64-x8.c
index 584319e..d8de699 100644
--- a/src/qu8-vaddc/gen/minmax-sse41-mul16-ld64-x8.c
+++ b/src/qu8-vaddc/gen/minmax-sse41-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i vbias = _mm_add_epi32(
     _mm_shuffle_epi32(_mm_cvtsi32_si128(params->sse2.b_multiplier * (int32_t) *input_b), _MM_SHUFFLE(0, 0, 0, 0)),
diff --git a/src/qu8-vaddc/gen/minmax-sse41-mul32-ld32-x16.c b/src/qu8-vaddc/gen/minmax-sse41-mul32-ld32-x16.c
index 31e4f81..8e8e024 100644
--- a/src/qu8-vaddc/gen/minmax-sse41-mul32-ld32-x16.c
+++ b/src/qu8-vaddc/gen/minmax-sse41-mul32-ld32-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4.shift);
diff --git a/src/qu8-vaddc/gen/minmax-sse41-mul32-ld32-x8.c b/src/qu8-vaddc/gen/minmax-sse41-mul32-ld32-x8.c
index 9fca60f..a06386a 100644
--- a/src/qu8-vaddc/gen/minmax-sse41-mul32-ld32-x8.c
+++ b/src/qu8-vaddc/gen/minmax-sse41-mul32-ld32-x8.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4.shift);
diff --git a/src/qu8-vaddc/gen/minmax-wasmsimd-x16.c b/src/qu8-vaddc/gen/minmax-wasmsimd-x16.c
index 44bea6a..b556807 100644
--- a/src/qu8-vaddc/gen/minmax-wasmsimd-x16.c
+++ b/src/qu8-vaddc/gen/minmax-wasmsimd-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
   const int32_t vshift = params->wasmsimd.shift;
diff --git a/src/qu8-vaddc/gen/minmax-wasmsimd-x32.c b/src/qu8-vaddc/gen/minmax-wasmsimd-x32.c
index 0498279..692577b 100644
--- a/src/qu8-vaddc/gen/minmax-wasmsimd-x32.c
+++ b/src/qu8-vaddc/gen/minmax-wasmsimd-x32.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
   const int32_t vshift = params->wasmsimd.shift;
diff --git a/src/qu8-vaddc/gen/minmax-wasmsimd-x8.c b/src/qu8-vaddc/gen/minmax-wasmsimd-x8.c
index cbd7c62..0641e9a 100644
--- a/src/qu8-vaddc/gen/minmax-wasmsimd-x8.c
+++ b/src/qu8-vaddc/gen/minmax-wasmsimd-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const v128_t va_multiplier = wasm_v128_load(params->wasmsimd.a_multiplier);
   const int32_t vshift = params->wasmsimd.shift;
diff --git a/src/qu8-vaddc/gen/minmax-xop-mul32-ld32-x16.c b/src/qu8-vaddc/gen/minmax-xop-mul32-ld32-x16.c
index 89bca3d..c692bf5 100644
--- a/src/qu8-vaddc/gen/minmax-xop-mul32-ld32-x16.c
+++ b/src/qu8-vaddc/gen/minmax-xop-mul32-ld32-x16.c
@@ -25,7 +25,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4.shift);
diff --git a/src/qu8-vaddc/gen/minmax-xop-mul32-ld32-x8.c b/src/qu8-vaddc/gen/minmax-xop-mul32-ld32-x8.c
index c03c0e7..6b9c2aa 100644
--- a/src/qu8-vaddc/gen/minmax-xop-mul32-ld32-x8.c
+++ b/src/qu8-vaddc/gen/minmax-xop-mul32-ld32-x8.c
@@ -25,7 +25,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_addsub_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const __m128i va_multiplier = _mm_load_si128((const __m128i*) params->sse4.a_multiplier);
   const __m128i vshift = _mm_loadu_si32(params->sse4.shift);
diff --git a/src/qu8-vmul/gen/minmax-fp32-avx-mul16-ld64-x16.c b/src/qu8-vmul/gen/minmax-fp32-avx-mul16-ld64-x16.c
index 2b93f6f..ba0b346 100644
--- a/src/qu8-vmul/gen/minmax-fp32-avx-mul16-ld64-x16.c
+++ b/src/qu8-vmul/gen/minmax-fp32-avx-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-avx-mul16-ld64-x8.c b/src/qu8-vmul/gen/minmax-fp32-avx-mul16-ld64-x8.c
index 106305e..8ac33e2 100644
--- a/src/qu8-vmul/gen/minmax-fp32-avx-mul16-ld64-x8.c
+++ b/src/qu8-vmul/gen/minmax-fp32-avx-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-neon-ld128-x16.c b/src/qu8-vmul/gen/minmax-fp32-neon-ld128-x16.c
index 03f6d5b..167c819 100644
--- a/src/qu8-vmul/gen/minmax-fp32-neon-ld128-x16.c
+++ b/src/qu8-vmul/gen/minmax-fp32-neon-ld128-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const uint8x16_t va_zero_point = vld1q_dup_u8(params->fp32_neon.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-neon-ld64-x16.c b/src/qu8-vmul/gen/minmax-fp32-neon-ld64-x16.c
index 4ec8341..3e73534 100644
--- a/src/qu8-vmul/gen/minmax-fp32-neon-ld64-x16.c
+++ b/src/qu8-vmul/gen/minmax-fp32-neon-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(params->fp32_neon.a_zero_point);
   const uint8x8_t vb_zero_point = vld1_dup_u8(params->fp32_neon.b_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-neon-ld64-x8.c b/src/qu8-vmul/gen/minmax-fp32-neon-ld64-x8.c
index 7230148..47efb16 100644
--- a/src/qu8-vmul/gen/minmax-fp32-neon-ld64-x8.c
+++ b/src/qu8-vmul/gen/minmax-fp32-neon-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(params->fp32_neon.a_zero_point);
   const uint8x8_t vb_zero_point = vld1_dup_u8(params->fp32_neon.b_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-neonv8-ld128-x16.c b/src/qu8-vmul/gen/minmax-fp32-neonv8-ld128-x16.c
index 595348a..b485b55 100644
--- a/src/qu8-vmul/gen/minmax-fp32-neonv8-ld128-x16.c
+++ b/src/qu8-vmul/gen/minmax-fp32-neonv8-ld128-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const uint8x16_t va_zero_point = vld1q_dup_u8(params->fp32_neonv8.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-neonv8-ld64-x16.c b/src/qu8-vmul/gen/minmax-fp32-neonv8-ld64-x16.c
index 6d0c295..f5c2bbf 100644
--- a/src/qu8-vmul/gen/minmax-fp32-neonv8-ld64-x16.c
+++ b/src/qu8-vmul/gen/minmax-fp32-neonv8-ld64-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(params->fp32_neonv8.a_zero_point);
   const uint8x8_t vb_zero_point = vld1_dup_u8(params->fp32_neonv8.b_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-neonv8-ld64-x8.c b/src/qu8-vmul/gen/minmax-fp32-neonv8-ld64-x8.c
index e56d7db..d181e57 100644
--- a/src/qu8-vmul/gen/minmax-fp32-neonv8-ld64-x8.c
+++ b/src/qu8-vmul/gen/minmax-fp32-neonv8-ld64-x8.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(params->fp32_neonv8.a_zero_point);
   const uint8x8_t vb_zero_point = vld1_dup_u8(params->fp32_neonv8.b_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-scalar-x1.c b/src/qu8-vmul/gen/minmax-fp32-scalar-x1.c
index a250ed9..b6a3fbc 100644
--- a/src/qu8-vmul/gen/minmax-fp32-scalar-x1.c
+++ b/src/qu8-vmul/gen/minmax-fp32-scalar-x1.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const int32_t vb_zero_point = params->fp32_scalar.b_zero_point;
diff --git a/src/qu8-vmul/gen/minmax-fp32-scalar-x2.c b/src/qu8-vmul/gen/minmax-fp32-scalar-x2.c
index 210c279..f8926e6 100644
--- a/src/qu8-vmul/gen/minmax-fp32-scalar-x2.c
+++ b/src/qu8-vmul/gen/minmax-fp32-scalar-x2.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const int32_t vb_zero_point = params->fp32_scalar.b_zero_point;
diff --git a/src/qu8-vmul/gen/minmax-fp32-scalar-x4.c b/src/qu8-vmul/gen/minmax-fp32-scalar-x4.c
index 9b4d1f2..46c135a 100644
--- a/src/qu8-vmul/gen/minmax-fp32-scalar-x4.c
+++ b/src/qu8-vmul/gen/minmax-fp32-scalar-x4.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const int32_t vb_zero_point = params->fp32_scalar.b_zero_point;
diff --git a/src/qu8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x16.c b/src/qu8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x16.c
index 1d68232..d99ff3a 100644
--- a/src/qu8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x16.c
+++ b/src/qu8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x8.c b/src/qu8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x8.c
index 58be43b..c37c0ef 100644
--- a/src/qu8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x8.c
+++ b/src/qu8-vmul/gen/minmax-fp32-sse2-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x16.c b/src/qu8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x16.c
index cbfe90e..d1957b1 100644
--- a/src/qu8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x16.c
+++ b/src/qu8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x8.c b/src/qu8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x8.c
index 83e48f8..2a02204 100644
--- a/src/qu8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x8.c
+++ b/src/qu8-vmul/gen/minmax-fp32-sse41-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c b/src/qu8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
index a3d3d32..a8a1ec4 100644
--- a/src/qu8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
+++ b/src/qu8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->fp32_wasmsimd.a_zero_point);
diff --git a/src/qu8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c b/src/qu8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
index a2ca179..ab3fbee 100644
--- a/src/qu8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
+++ b/src/qu8-vmul/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->fp32_wasmsimd.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x16.c b/src/qu8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x16.c
index 64c4289..b49262b 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x16.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x8.c b/src/qu8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x8.c
index 53528d5..e225b55 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x8.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-avx-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-neon-ld128-x16.c b/src/qu8-vmulc/gen/minmax-fp32-neon-ld128-x16.c
index 79eac4a..2f76a02 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-neon-ld128-x16.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-neon-ld128-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const uint8x16_t va_zero_point = vld1q_dup_u8(params->fp32_neon.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-neon-ld64-x16.c b/src/qu8-vmulc/gen/minmax-fp32-neon-ld64-x16.c
index 389e1df..28db07f 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-neon-ld64-x16.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-neon-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(params->fp32_neon.a_zero_point);
   const float32x4_t vscale = vld1q_dup_f32(&params->fp32_neon.scale);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-neon-ld64-x8.c b/src/qu8-vmulc/gen/minmax-fp32-neon-ld64-x8.c
index 37851a8..7299b57 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-neon-ld64-x8.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-neon-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(params->fp32_neon.a_zero_point);
   const float32x4_t vscale = vld1q_dup_f32(&params->fp32_neon.scale);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld128-x16.c b/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld128-x16.c
index b265d52..1d875ad 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld128-x16.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld128-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   #if XNN_ARCH_ARM64
     const uint8x16_t va_zero_point = vld1q_dup_u8(params->fp32_neonv8.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld64-x16.c b/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld64-x16.c
index 1bcc107..1caf154 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld64-x16.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld64-x16.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(params->fp32_neonv8.a_zero_point);
   const float32x4_t vscale = vld1q_dup_f32(&params->fp32_neonv8.scale);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld64-x8.c b/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld64-x8.c
index 1bf1b1c..d3f4ee1 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld64-x8.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-neonv8-ld64-x8.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   const uint8x8_t va_zero_point = vld1_dup_u8(params->fp32_neonv8.a_zero_point);
   const float32x4_t vscale = vld1q_dup_f32(&params->fp32_neonv8.scale);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-scalar-x1.c b/src/qu8-vmulc/gen/minmax-fp32-scalar-x1.c
index c93da69..880dcc3 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-scalar-x1.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-scalar-x1.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const float vscale = params->fp32_scalar.scale;
diff --git a/src/qu8-vmulc/gen/minmax-fp32-scalar-x2.c b/src/qu8-vmulc/gen/minmax-fp32-scalar-x2.c
index fa7fa46..b983511 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-scalar-x2.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-scalar-x2.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const float vscale = params->fp32_scalar.scale;
diff --git a/src/qu8-vmulc/gen/minmax-fp32-scalar-x4.c b/src/qu8-vmulc/gen/minmax-fp32-scalar-x4.c
index 8003dfd..c7b5c58 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-scalar-x4.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-scalar-x4.c
@@ -20,7 +20,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
 {
   const int32_t va_zero_point = params->fp32_scalar.a_zero_point;
   const float vscale = params->fp32_scalar.scale;
diff --git a/src/qu8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x16.c b/src/qu8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x16.c
index cddf996..64e1921 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x16.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x8.c b/src/qu8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x8.c
index ed8a23d..7bfcf3f 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x8.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-sse2-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x16.c b/src/qu8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x16.c
index eaea25a..f78dc07 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x16.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x8.c b/src/qu8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x8.c
index eabebf5..3603a3a 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x8.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-sse41-mul16-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const __m128i va_zero_point = _mm_load_si128((const __m128i*) params->fp32_sse2.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c b/src/qu8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
index 566545e..258eedd 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x16.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->fp32_wasmsimd.a_zero_point);
diff --git a/src/qu8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c b/src/qu8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
index fb1fdd5..40b1bee 100644
--- a/src/qu8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
+++ b/src/qu8-vmulc/gen/minmax-fp32-wasmsimd-mul32-ld64-x8.c
@@ -19,7 +19,7 @@
     const uint8_t* input_a,
     const uint8_t* input_b,
     uint8_t* output,
-    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+    const union xnn_qu8_mul_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 
 {
   const v128_t va_zero_point = wasm_v128_load(params->fp32_wasmsimd.a_zero_point);
diff --git a/src/s8-ibilinear/gen/neon-c16.c b/src/s8-ibilinear/gen/neon-c16.c
index 5281688..1d6e6b3 100644
--- a/src/s8-ibilinear/gen/neon-c16.c
+++ b/src/s8-ibilinear/gen/neon-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/neon-c8.c b/src/s8-ibilinear/gen/neon-c8.c
index b255793..fb2fdc8 100644
--- a/src/s8-ibilinear/gen/neon-c8.c
+++ b/src/s8-ibilinear/gen/neon-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/sse2-c16.c b/src/s8-ibilinear/gen/sse2-c16.c
index b66215c..7f0a6a2 100644
--- a/src/s8-ibilinear/gen/sse2-c16.c
+++ b/src/s8-ibilinear/gen/sse2-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/sse2-c8.c b/src/s8-ibilinear/gen/sse2-c8.c
index 7e6befa..834fa4e 100644
--- a/src/s8-ibilinear/gen/sse2-c8.c
+++ b/src/s8-ibilinear/gen/sse2-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/sse41-c16.c b/src/s8-ibilinear/gen/sse41-c16.c
index 63bf650..1e4b2ad 100644
--- a/src/s8-ibilinear/gen/sse41-c16.c
+++ b/src/s8-ibilinear/gen/sse41-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/sse41-c8.c b/src/s8-ibilinear/gen/sse41-c8.c
index f19cac4..9c7b8d0 100644
--- a/src/s8-ibilinear/gen/sse41-c8.c
+++ b/src/s8-ibilinear/gen/sse41-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/wasmsimd-dot16x2-c16.c b/src/s8-ibilinear/gen/wasmsimd-dot16x2-c16.c
index dd0efd3..27d596a 100644
--- a/src/s8-ibilinear/gen/wasmsimd-dot16x2-c16.c
+++ b/src/s8-ibilinear/gen/wasmsimd-dot16x2-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/wasmsimd-dot16x2-c8.c b/src/s8-ibilinear/gen/wasmsimd-dot16x2-c8.c
index 5a1a6c8..dd9d7e5 100644
--- a/src/s8-ibilinear/gen/wasmsimd-dot16x2-c8.c
+++ b/src/s8-ibilinear/gen/wasmsimd-dot16x2-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/wasmsimd-mul32-c16.c b/src/s8-ibilinear/gen/wasmsimd-mul32-c16.c
index 3cbb91c..0de7162 100644
--- a/src/s8-ibilinear/gen/wasmsimd-mul32-c16.c
+++ b/src/s8-ibilinear/gen/wasmsimd-mul32-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/gen/wasmsimd-mul32-c8.c b/src/s8-ibilinear/gen/wasmsimd-mul32-c8.c
index 26fd39c..03ac62b 100644
--- a/src/s8-ibilinear/gen/wasmsimd-mul32-c8.c
+++ b/src/s8-ibilinear/gen/wasmsimd-mul32-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     int8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/neon.c.in b/src/s8-ibilinear/neon.c.in
index 6fc3e6e..7d1d589 100644
--- a/src/s8-ibilinear/neon.c.in
+++ b/src/s8-ibilinear/neon.c.in
@@ -31,7 +31,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     ${XINT8_T}*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/sse.c.in b/src/s8-ibilinear/sse.c.in
index 92aece9..0cbe054 100644
--- a/src/s8-ibilinear/sse.c.in
+++ b/src/s8-ibilinear/sse.c.in
@@ -41,7 +41,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     ${XINT8_T}*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/wasmsimd-dot16x2.c.in b/src/s8-ibilinear/wasmsimd-dot16x2.c.in
index 144c46b..35f6e18 100644
--- a/src/s8-ibilinear/wasmsimd-dot16x2.c.in
+++ b/src/s8-ibilinear/wasmsimd-dot16x2.c.in
@@ -27,7 +27,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     ${XINT8_T}*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-ibilinear/wasmsimd-mul32.c.in b/src/s8-ibilinear/wasmsimd-mul32.c.in
index aaae554..6a8a1a1 100644
--- a/src/s8-ibilinear/wasmsimd-mul32.c.in
+++ b/src/s8-ibilinear/wasmsimd-mul32.c.in
@@ -27,7 +27,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     ${XINT8_T}*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/s8-maxpool/9p8x-minmax-neon-c16.c b/src/s8-maxpool/9p8x-minmax-neon-c16.c
index cf320a9..2e52e11 100644
--- a/src/s8-maxpool/9p8x-minmax-neon-c16.c
+++ b/src/s8-maxpool/9p8x-minmax-neon-c16.c
@@ -19,7 +19,7 @@
     int8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/s8-maxpool/9p8x-minmax-sse2-c16.c b/src/s8-maxpool/9p8x-minmax-sse2-c16.c
index ca0fff6..2ea7990 100644
--- a/src/s8-maxpool/9p8x-minmax-sse2-c16.c
+++ b/src/s8-maxpool/9p8x-minmax-sse2-c16.c
@@ -19,7 +19,7 @@
     int8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/s8-maxpool/9p8x-minmax-sse41-c16.c b/src/s8-maxpool/9p8x-minmax-sse41-c16.c
index 4d362d7..33f40fd 100644
--- a/src/s8-maxpool/9p8x-minmax-sse41-c16.c
+++ b/src/s8-maxpool/9p8x-minmax-sse41-c16.c
@@ -19,7 +19,7 @@
     int8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/s8-maxpool/9p8x-minmax-wasmsimd-c16.c b/src/s8-maxpool/9p8x-minmax-wasmsimd-c16.c
index a9c291e..87339bf 100644
--- a/src/s8-maxpool/9p8x-minmax-wasmsimd-c16.c
+++ b/src/s8-maxpool/9p8x-minmax-wasmsimd-c16.c
@@ -19,7 +19,7 @@
     int8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/s8-vclamp/neon-x64.c b/src/s8-vclamp/neon-x64.c
index 11f99d2..302d7d7 100644
--- a/src/s8-vclamp/neon-x64.c
+++ b/src/s8-vclamp/neon-x64.c
@@ -14,7 +14,7 @@
     size_t n,
     const int8_t* x,
     int8_t* y,
-    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
 
diff --git a/src/s8-vclamp/sse2-x64.c b/src/s8-vclamp/sse2-x64.c
index caf8f12..a2d25c6 100644
--- a/src/s8-vclamp/sse2-x64.c
+++ b/src/s8-vclamp/sse2-x64.c
@@ -14,7 +14,7 @@
     size_t n,
     const int8_t* x,
     int8_t* y,
-    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
 
diff --git a/src/s8-vclamp/sse41-x64.c b/src/s8-vclamp/sse41-x64.c
index 2b330ee..cba4552 100644
--- a/src/s8-vclamp/sse41-x64.c
+++ b/src/s8-vclamp/sse41-x64.c
@@ -14,7 +14,7 @@
     size_t n,
     const int8_t* x,
     int8_t* y,
-    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
 
diff --git a/src/s8-vclamp/wasmsimd-x64.c b/src/s8-vclamp/wasmsimd-x64.c
index 8a827ce..c9261e4 100644
--- a/src/s8-vclamp/wasmsimd-x64.c
+++ b/src/s8-vclamp/wasmsimd-x64.c
@@ -14,7 +14,7 @@
     size_t n,
     const int8_t* x,
     int8_t* y,
-    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_s8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
 
diff --git a/src/u8-ibilinear/gen/neon-c16.c b/src/u8-ibilinear/gen/neon-c16.c
index 968a054..f5c51c0 100644
--- a/src/u8-ibilinear/gen/neon-c16.c
+++ b/src/u8-ibilinear/gen/neon-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/neon-c8.c b/src/u8-ibilinear/gen/neon-c8.c
index 527ff6b..6a2f997 100644
--- a/src/u8-ibilinear/gen/neon-c8.c
+++ b/src/u8-ibilinear/gen/neon-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/sse2-c16.c b/src/u8-ibilinear/gen/sse2-c16.c
index bea9023..d0f5213 100644
--- a/src/u8-ibilinear/gen/sse2-c16.c
+++ b/src/u8-ibilinear/gen/sse2-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/sse2-c8.c b/src/u8-ibilinear/gen/sse2-c8.c
index c7e3c30..faaed80 100644
--- a/src/u8-ibilinear/gen/sse2-c8.c
+++ b/src/u8-ibilinear/gen/sse2-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/sse41-c16.c b/src/u8-ibilinear/gen/sse41-c16.c
index 836a02f..88f08a3 100644
--- a/src/u8-ibilinear/gen/sse41-c16.c
+++ b/src/u8-ibilinear/gen/sse41-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/sse41-c8.c b/src/u8-ibilinear/gen/sse41-c8.c
index 5f10f42..d289b3d 100644
--- a/src/u8-ibilinear/gen/sse41-c8.c
+++ b/src/u8-ibilinear/gen/sse41-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/wasmsimd-dot16x2-c16.c b/src/u8-ibilinear/gen/wasmsimd-dot16x2-c16.c
index 155869e..35ea014 100644
--- a/src/u8-ibilinear/gen/wasmsimd-dot16x2-c16.c
+++ b/src/u8-ibilinear/gen/wasmsimd-dot16x2-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/wasmsimd-dot16x2-c8.c b/src/u8-ibilinear/gen/wasmsimd-dot16x2-c8.c
index 68b4325..ec5da03 100644
--- a/src/u8-ibilinear/gen/wasmsimd-dot16x2-c8.c
+++ b/src/u8-ibilinear/gen/wasmsimd-dot16x2-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/wasmsimd-mul32-c16.c b/src/u8-ibilinear/gen/wasmsimd-mul32-c16.c
index 9b7dec2..6fffb20 100644
--- a/src/u8-ibilinear/gen/wasmsimd-mul32-c16.c
+++ b/src/u8-ibilinear/gen/wasmsimd-mul32-c16.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-ibilinear/gen/wasmsimd-mul32-c8.c b/src/u8-ibilinear/gen/wasmsimd-mul32-c8.c
index b70c3a3..5350fdd 100644
--- a/src/u8-ibilinear/gen/wasmsimd-mul32-c8.c
+++ b/src/u8-ibilinear/gen/wasmsimd-mul32-c8.c
@@ -22,7 +22,7 @@
     size_t input_offset,
     const int16_t*restrict weights,
     uint8_t*restrict output,
-    size_t output_increment) XNN_DISABLE_TSAN
+    size_t output_increment) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(channels != 0);
diff --git a/src/u8-maxpool/9p8x-minmax-neon-c16.c b/src/u8-maxpool/9p8x-minmax-neon-c16.c
index 04abf1d..b781f3f 100644
--- a/src/u8-maxpool/9p8x-minmax-neon-c16.c
+++ b/src/u8-maxpool/9p8x-minmax-neon-c16.c
@@ -22,7 +22,7 @@
     uint8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/u8-maxpool/9p8x-minmax-sse2-c16.c b/src/u8-maxpool/9p8x-minmax-sse2-c16.c
index d602c0d..490fa2e 100644
--- a/src/u8-maxpool/9p8x-minmax-sse2-c16.c
+++ b/src/u8-maxpool/9p8x-minmax-sse2-c16.c
@@ -22,7 +22,7 @@
     uint8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/u8-maxpool/9p8x-minmax-wasmsimd-c16.c b/src/u8-maxpool/9p8x-minmax-wasmsimd-c16.c
index 10a4b58..dfbdbfe 100644
--- a/src/u8-maxpool/9p8x-minmax-wasmsimd-c16.c
+++ b/src/u8-maxpool/9p8x-minmax-wasmsimd-c16.c
@@ -19,7 +19,7 @@
     uint8_t* output,
     size_t input_increment,
     size_t output_increment,
-    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(output_pixels != 0);
   assert(kernel_elements != 0);
diff --git a/src/u8-vclamp/neon-x64.c b/src/u8-vclamp/neon-x64.c
index 6a1866b..0674ab3 100644
--- a/src/u8-vclamp/neon-x64.c
+++ b/src/u8-vclamp/neon-x64.c
@@ -14,7 +14,7 @@
     size_t n,
     const uint8_t* x,
     uint8_t* y,
-    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
 
diff --git a/src/u8-vclamp/sse2-x64.c b/src/u8-vclamp/sse2-x64.c
index 7535c17..68fbaab 100644
--- a/src/u8-vclamp/sse2-x64.c
+++ b/src/u8-vclamp/sse2-x64.c
@@ -14,7 +14,7 @@
     size_t n,
     const uint8_t* x,
     uint8_t* y,
-    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
 
diff --git a/src/u8-vclamp/wasmsimd-x64.c b/src/u8-vclamp/wasmsimd-x64.c
index badadab..c81493b 100644
--- a/src/u8-vclamp/wasmsimd-x64.c
+++ b/src/u8-vclamp/wasmsimd-x64.c
@@ -14,7 +14,7 @@
     size_t n,
     const uint8_t* x,
     uint8_t* y,
-    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_DISABLE_TSAN
+    const union xnn_u8_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
 {
   assert(n != 0);
 
diff --git a/src/xnnpack/common.h b/src/xnnpack/common.h
index d728953..00b74ae 100644
--- a/src/xnnpack/common.h
+++ b/src/xnnpack/common.h
@@ -226,6 +226,8 @@
   #define XNN_DISABLE_MSAN
 #endif
 
+#define XNN_OOB_READS XNN_DISABLE_TSAN XNN_DISABLE_MSAN
+
 #if defined(__GNUC__)
   #define XNN_INTRINSIC inline __attribute__((__always_inline__, __artificial__))
 #elif defined(_MSC_VER)
diff --git a/src/xx-pad/neon.c b/src/xx-pad/neon.c
index ae45559..084306a 100644
--- a/src/xx-pad/neon.c
+++ b/src/xx-pad/neon.c
@@ -19,7 +19,7 @@
     size_t input_stride,
     void* output,
     size_t output_stride,
-    uint32_t fill_pattern) XNN_DISABLE_TSAN
+    uint32_t fill_pattern) XNN_OOB_READS
 {
   const size_t input_increment = input_stride - channels;
   const size_t output_increment = output_stride - (pre_padding + channels + post_padding);
diff --git a/src/xx-pad/scalar.c b/src/xx-pad/scalar.c
index c87114c..cca4af2 100644
--- a/src/xx-pad/scalar.c
+++ b/src/xx-pad/scalar.c
@@ -17,7 +17,7 @@
     size_t input_stride,
     void* output,
     size_t output_stride,
-    const uint32_t fill_pattern) XNN_DISABLE_TSAN
+    const uint32_t fill_pattern) XNN_OOB_READS
 {
   const size_t input_increment = input_stride - channels;
   const size_t output_increment = output_stride - (pre_padding + channels + post_padding);
diff --git a/src/xx-pad/sse2.c b/src/xx-pad/sse2.c
index 7b2c713..e9bc93b 100644
--- a/src/xx-pad/sse2.c
+++ b/src/xx-pad/sse2.c
@@ -19,7 +19,7 @@
     size_t input_stride,
     void* output,
     size_t output_stride,
-    const uint32_t fill_pattern) XNN_DISABLE_TSAN
+    const uint32_t fill_pattern) XNN_OOB_READS
 {
   const size_t input_increment = input_stride - channels;
   const size_t output_increment = output_stride - (pre_padding + channels + post_padding);
diff --git a/src/xx-pad/wasmsimd.c b/src/xx-pad/wasmsimd.c
index e861da8..9edb3cf 100644
--- a/src/xx-pad/wasmsimd.c
+++ b/src/xx-pad/wasmsimd.c
@@ -19,7 +19,7 @@
     size_t input_stride,
     void* output,
     size_t output_stride,
-    const uint32_t fill_pattern) XNN_DISABLE_TSAN
+    const uint32_t fill_pattern) XNN_OOB_READS
 {
   const size_t input_increment = input_stride - channels;
   const size_t output_increment = output_stride - (pre_padding + channels + post_padding);