Snap for 7783058 from cebdfe545a07d542d2d8aeb7f128db71a7f4a119 to sc-v2-release

Change-Id: I02edb2f5cb6cfbdafb901fe3a2a3dc8ecb80784f
diff --git a/Android.bp b/Android.bp
index 702ddcc..270d327 100644
--- a/Android.bp
+++ b/Android.bp
@@ -208,6 +208,7 @@
         "-DOPUS_BUILD",
         "-DFIXED_POINT",
         "-DUSE_ALLOCA",
+        "-DSIMD_EXTRA_ALLOC_BYTES=16",
         "-DHAVE_LRINT",
         "-DHAVE_LRINTF",
         "-DENABLE_HARDENING",
diff --git a/celt/stack_alloc.h b/celt/stack_alloc.h
index ae40e2a..b289fac 100644
--- a/celt/stack_alloc.h
+++ b/celt/stack_alloc.h
@@ -88,10 +88,22 @@
  * @param type Type of element
  */
 
+#ifndef SIMD_EXTRA_ALLOC_BYTES
+#error define SIMD_EXTRA_ALLOC_BYTES appropriately in your makefile
+/*
+ * Useful values:
+ * 0  for an all-scalar processor, which should never over-read the arrays
+ * 16 for an implementation using ARM Neon or X86 SSE4 instructions, which work
+ *    with blocks of 16 bytes (128 bits)
+ */
+#endif
+
 #if defined(VAR_ARRAYS)
 
 #define VARDECL(type, var)
-#define ALLOC(var, size, type) type var[size]
+// include a full SIMD width afterwards;
+#define ALLOC(var, size, type) type var[(size) + ((SIMD_EXTRA_ALLOC_BYTES)/sizeof(type))]
+
 #define SAVE_STACK
 #define RESTORE_STACK
 #define ALLOC_STACK
@@ -103,9 +115,11 @@
 #define VARDECL(type, var) type *var
 
 # ifdef _WIN32
-#  define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size)))
+#  define ALLOC(var, size, type) var = \
+                                 ((type*)_alloca(sizeof(type)*(size) + SIMD_EXTRA_ALLOC_BYTES))
 # else
-#  define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size)))
+#  define ALLOC(var, size, type) var = \
+                                 ((type*)alloca(sizeof(type)*(size) + SIMD_EXTRA_ALLOC_BYTES))
 # endif
 
 #define SAVE_STACK
@@ -151,6 +165,11 @@
 
 #endif /* ENABLE_VALGRIND */
 
+// this path has NOT been modified to be safe in the face of SIMD over-reads
+#if SIMD_EXTRA_ALLOC_BYTES != 0
+#error  "ALLOC() is not updated in this configuration to provide for SIMD over-reads"
+#endif
+
 #include "os_support.h"
 #define VARDECL(type, var) type *var
 #define ALLOC(var, size, type) var = PUSH(global_stack, size, type)