core(ipp): disable SSE4.2 meanStdDev() optimization for CV_32F
authorAlexander Alekhin <alexander.alekhin@intel.com>
Fri, 26 Oct 2018 11:57:20 +0000 (14:57 +0300)
committerAlexander Alekhin <alexander.alekhin@intel.com>
Fri, 26 Oct 2018 12:57:26 +0000 (15:57 +0300)
modules/core/src/mean.cpp

index b488ee2..aed5f76 100644 (file)
@@ -674,10 +674,23 @@ static bool ipp_meanStdDev(Mat& src, OutputArray _mean, OutputArray _sdv, Mat& m
     if (cn > 1)
         return false;
 #endif
-#if IPP_VERSION_X100 < 201901
+#if IPP_VERSION_X100 >= 201900 && IPP_VERSION_X100 < 201901
     // IPP_DISABLE: 32f C3C functions can read outside of allocated memory
     if (cn > 1 && src.depth() == CV_32F)
         return false;
+
+    // SSE4.2 buffer overrun
+#if defined(_WIN32) && !defined(_WIN64)
+    // IPPICV doesn't have AVX2 in 32-bit builds
+    // However cv::ipp::getIppTopFeatures() may return AVX2 value on AVX2 capable H/W
+    // details #12959
+#else
+    if (cv::ipp::getIppTopFeatures() == ippCPUID_SSE42) // Linux x64 + OPENCV_IPP=SSE42 is affected too
+#endif
+    {
+        if (src.depth() == CV_32F && src.dims > 1 && src.size[src.dims - 1] == 6)
+            return false;
+    }
 #endif
 
     size_t total_size = src.total();