https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119547

--- Comment #6 from 曾治金 <zhijin.zeng at spacemit dot com> ---
This issue report in https://github.com/opencv/opencv/issues/26936, and I
extract it into my test case. I just check the assemble code and don't run the
test case.


But if you need to run the opencv application to fix the issue, you can do it
as follow. 
1. download opencv
```
git clone https://github.com/opencv/opencv.git
git reset --hard 46dbc57a865594a5f9141a3a3b6878764df6cc0d

```
2. apply patch
```
diff --git a/modules/core/src/convert.simd.hpp
b/modules/core/src/convert.simd.hpp
index 841cb6f684..37a0f5b929 100644
--- a/modules/core/src/convert.simd.hpp
+++ b/modules/core/src/convert.simd.hpp
@@ -109,7 +109,7 @@ cvt_( const _Ts* src, size_t sstep, _Td* dst, size_t dstep,
Size size )
     {
         int j = 0;
 // Excluding GNU in CV_SIMD_SCALABLE because of "opencv/issues/26936"
-#if (CV_SIMD || (CV_SIMD_SCALABLE && !(defined(__GNUC__) &&
!defined(__clang__))) )
+#if (CV_SIMD || (CV_SIMD_SCALABLE))
         const int VECSZ = VTraits<_Twvec>::vlanes()*2;
         for( ; j < size.width; j += VECSZ )
         {
diff --git a/modules/core/src/convert_scale.simd.hpp
b/modules/core/src/convert_scale.simd.hpp
index aa998aed71..cfdf895b2a 100644
--- a/modules/core/src/convert_scale.simd.hpp
+++ b/modules/core/src/convert_scale.simd.hpp
@@ -92,7 +92,7 @@ template<typename _Ts, typename _Td> inline void
 cvt_32f( const _Ts* src, size_t sstep, _Td* dst, size_t dstep,
          Size size, float a, float b )
 {
-#if (CV_SIMD || (CV_SIMD_SCALABLE && !(defined(__GNUC__) &&
!defined(__clang__))) )
+#if (CV_SIMD || (CV_SIMD_SCALABLE) )
     v_float32 va = vx_setall_f32(a), vb = vx_setall_f32(b);
     const int VECSZ = VTraits<v_float32>::vlanes()*2;
 #endif
@@ -103,7 +103,7 @@ cvt_32f( const _Ts* src, size_t sstep, _Td* dst, size_t
dstep,
     {
         int j = 0;
 // Excluding GNU in CV_SIMD_SCALABLE because of "opencv/issues/26936"
-#if (CV_SIMD || (CV_SIMD_SCALABLE && !(defined(__GNUC__) &&
!defined(__clang__))) )
+#if (CV_SIMD || (CV_SIMD_SCALABLE) )
         for( ; j < size.width; j += VECSZ )
         {
             if( j > size.width - VECSZ )
@@ -164,7 +164,7 @@ template<typename _Ts, typename _Td> inline void
 cvt_64f( const _Ts* src, size_t sstep, _Td* dst, size_t dstep,
          Size size, double a, double b )
 {
-#if (CV_SIMD_64F || (CV_SIMD_SCALABLE_64F && !(defined(__GNUC__) &&
!defined(__clang__))) )
+#if (CV_SIMD_64F || (CV_SIMD_SCALABLE_64F) )
     v_float64 va = vx_setall_f64(a), vb = vx_setall_f64(b);
     const int VECSZ = VTraits<v_float64>::vlanes()*2;
 #endif
@@ -175,7 +175,7 @@ cvt_64f( const _Ts* src, size_t sstep, _Td* dst, size_t
dstep,
     {
         int j = 0;
 // Excluding GNU in CV_SIMD_SCALABLE because of "opencv/issues/26936"
-#if (CV_SIMD_64F || (CV_SIMD_SCALABLE_64F && !(defined(__GNUC__) &&
!defined(__clang__))) )
+#if (CV_SIMD_64F || (CV_SIMD_SCALABLE_64F) )
         for( ; j < size.width; j += VECSZ )
         {
             if( j > size.width - VECSZ )
```
3. build
add compile flag in opencv/platforms/linux/flags-riscv64.cmake
```
--param logical-op-non-short-circuit=0
```
```
SDK_DIR=/xxx/toolchain-path

cd ${WORKSPACE}/opencv

BUILD_TYPE=Release
BUILD_DIR=latest-4x

cmake -G Ninja -B cross-build/$BUILD_DIR-gcc \
      -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
      -DCMAKE_C_COMPILER=$SDK_DIR/bin/riscv64-unknown-linux-gnu-gcc \
      -DCMAKE_CXX_COMPILER=$SDK_DIR/bin/riscv64-unknown-linux-gnu-g++ \
     
-DCMAKE_TOOLCHAIN_FILE=$WORKSPACE/opencv/platforms/linux/riscv64-gcc.toolchain.cmake
\
      -DCPU_BASELINE=RVV -DCPU_BASELINE_REQUIRE=RVV -DRISCV_RVV_SCALABLE=ON
-DWITH_OPENCL=OFF .

cmake --build cross-build/$BUILD_DIR-gcc --target opencv_test_core -j10
```
4. run
```
export LD_LIBRARY_PATH=/xxxx/lib
./opencv_test_core --gtest_filter="Core_ConvertScale/ElemWiseTest.accuracy/0"
```

Reply via email to