[vlc-commits] [Git][videolan/vlc][master] contrib: aom: Backport patches to improve the SVE detection

Jean-Baptiste Kempf (@jbk) gitlab at videolan.org
Thu May 9 09:32:52 UTC 2024



Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC


Commits:
42cb003f by Martin Storsjö at 2024-05-09T08:44:13+00:00
contrib: aom: Backport patches to improve the SVE detection

This backports
https://aomedia.googlesource.com/aom/+/5ccdc66ab6eb8eb300eda854fab4ff250b2c2f92
and
https://aomedia.googlesource.com/aom/+/fb21617c1f3ef49795597e006b68adfba6e54be0.

This makes libaom test compiling a more nontrivial function,
which according to AAPCS requires backing up and restoring SVE
registers.

On current versions of Clang when targeting Windows, compiling such
a function errors out. This added test makes libaom not try to
compile the SVE codepaths for this target.

See https://github.com/llvm/llvm-project/issues/80009 for reference
on toolchain support for SVE functions on Windows on aarch64.

- - - - -


3 changed files:

- + contrib/src/aom/0001-cpu.cmake-Do-more-elaborate-test-of-whether-SVE-can-.patch
- + contrib/src/aom/0002-cpu.cmake-Address-issues-in-SVE-feature-tests.patch
- contrib/src/aom/rules.mak


Changes:

=====================================
contrib/src/aom/0001-cpu.cmake-Do-more-elaborate-test-of-whether-SVE-can-.patch
=====================================
@@ -0,0 +1,51 @@
+From 17cb0f6be6807c73027cce0d941868b3e5ede54f Mon Sep 17 00:00:00 2001
+From: Martin Storsjo <martin at martin.st>
+Date: Wed, 1 May 2024 00:45:41 +0300
+Subject: [PATCH 1/2] cpu.cmake: Do more elaborate test of whether SVE can be
+ compiled
+
+For Windows targets, Clang will successfully compile simpler
+SVE functions, but if the function requires backing up and restoring
+SVE registers (as part of the AAPCS calling convention), Clang
+will fail to generate unwind data for this function, resulting
+in an error.
+
+This issue is tracked upstream in Clang in
+https://github.com/llvm/llvm-project/issues/80009.
+
+Check whether the compiler can compile such a function, and
+disable SVE if it is unable to handle that case.
+
+Change-Id: I307d7398cedd1942c39ef034431a51696264ff47
+(cherry picked from commit 5ccdc66ab6eb8eb300eda854fab4ff250b2c2f92)
+---
+ build/cmake/cpu.cmake | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/build/cmake/cpu.cmake b/build/cmake/cpu.cmake
+index 489dbcbf44..e16e9ec6a5 100644
+--- a/build/cmake/cpu.cmake
++++ b/build/cmake/cpu.cmake
+@@ -56,8 +56,18 @@ if("${AOM_TARGET_CPU}" STREQUAL "arm64")
+ #endif
+ #include <arm_sve.h>
+ #include <arm_neon_sve_bridge.h>" HAVE_SVE_HEADERS)
++    # Check whether the compiler can compile SVE functions that require
++    # backup/restore of SVE registers according to AAPCS. Clang for Windows used
++    # to fail this, see https://github.com/llvm/llvm-project/issues/80009.
++    aom_check_source_compiles("arm_sve_preserve" "
++#include <arm_sve.h>
++void other(void);
++svfloat32_t func(svfloat32_t a) {
++  other();
++  return a;
++}" CAN_COMPILE_SVE)
+     set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQURED_FLAGS})
+-    if(HAVE_SVE_HEADERS EQUAL 0)
++    if(HAVE_SVE_HEADERS EQUAL 0 OR CAN_COMPILE_SVE EQUAL 0)
+       set(ENABLE_SVE 0)
+       set(ENABLE_SVE2 0)
+     endif()
+-- 
+2.34.1
+


=====================================
contrib/src/aom/0002-cpu.cmake-Address-issues-in-SVE-feature-tests.patch
=====================================
@@ -0,0 +1,58 @@
+From b349f7613350aa8a15c06470dc63c5d6a4a1222f Mon Sep 17 00:00:00 2001
+From: George Steed <george.steed at arm.com>
+Date: Sat, 4 May 2024 13:20:42 +0100
+Subject: [PATCH 2/2] cpu.cmake: Address issues in SVE feature tests
+
+A test to check that SVE registers were correctly handled as function
+parameters was added in 5ccdc66ab6eb8eb300eda854fab4ff250b2c2f92,
+however this appears to have a couple of issues:
+
+* Semicolons need to be escaped, else the compiler fails to compile due
+  to invalid syntax. We can fix this by prefixing each semicolon with a
+  backslash.
+
+* The "other" function does not have a definition so the test program
+  will always fail to link even if it compiles to an object file. We can
+  work around this by instructing CMake to only try compiling up to a
+  static library rather than a full executable.
+
+Change-Id: Ic37280d4b42b9031e68bed8a4b24c0eb51491827
+(cherry picked from commit fb21617c1f3ef49795597e006b68adfba6e54be0)
+---
+ build/cmake/cpu.cmake | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/build/cmake/cpu.cmake b/build/cmake/cpu.cmake
+index e16e9ec6a5..8d0acf3d2b 100644
+--- a/build/cmake/cpu.cmake
++++ b/build/cmake/cpu.cmake
+@@ -49,7 +49,9 @@ if("${AOM_TARGET_CPU}" STREQUAL "arm64")
+   # SVE and SVE2 require that the Neon-SVE bridge header is also available.
+   if(ENABLE_SVE OR ENABLE_SVE2)
+     set(OLD_CMAKE_REQURED_FLAGS ${CMAKE_REQUIRED_FLAGS})
++    set(OLD_CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE})
+     set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${AOM_SVE_FLAG}")
++    set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+     aom_check_source_compiles("arm_neon_sve_bridge_available" "
+ #ifndef __ARM_NEON_SVE_BRIDGE
+ #error 1
+@@ -61,12 +63,13 @@ if("${AOM_TARGET_CPU}" STREQUAL "arm64")
+     # to fail this, see https://github.com/llvm/llvm-project/issues/80009.
+     aom_check_source_compiles("arm_sve_preserve" "
+ #include <arm_sve.h>
+-void other(void);
++void other(void)\;
+ svfloat32_t func(svfloat32_t a) {
+-  other();
+-  return a;
++  other()\;
++  return a\;
+ }" CAN_COMPILE_SVE)
+     set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQURED_FLAGS})
++    set(CMAKE_TRY_COMPILE_TARGET_TYPE ${OLD_CMAKE_TRY_COMPILE_TARGET_TYPE})
+     if(HAVE_SVE_HEADERS EQUAL 0 OR CAN_COMPILE_SVE EQUAL 0)
+       set(ENABLE_SVE 0)
+       set(ENABLE_SVE2 0)
+-- 
+2.34.1
+


=====================================
contrib/src/aom/rules.mak
=====================================
@@ -15,6 +15,8 @@ $(TARBALLS)/libaom-$(AOM_VERSION).tar.gz:
 aom: libaom-$(AOM_VERSION).tar.gz .sum-aom
 	$(UNPACK)
 	$(APPLY) $(SRC)/aom/0002-cmake-win-fix-asm-flag-appending.patch
+	$(APPLY) $(SRC)/aom/0001-cpu.cmake-Do-more-elaborate-test-of-whether-SVE-can-.patch
+	$(APPLY) $(SRC)/aom/0002-cpu.cmake-Address-issues-in-SVE-feature-tests.patch
 	$(MOVE)
 
 DEPS_aom =



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/42cb003f059998cf03e70d7cbaa13b8ebf9b05fd

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/42cb003f059998cf03e70d7cbaa13b8ebf9b05fd
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list