[PATCH] configure: use AC_LINK_IFELSE for intrinsics to fix LTO builds
Jussi Kivilinna
jussi.kivilinna at iki.fi
Tue May 12 19:33:04 CEST 2026
* configure.ac (gcry_cv_cc_x86_avx512_intrinsics)
(GCRY_AARCH64_NEON_INTRINSICS_TEST)
(GCRY_POWERPC_VECTOR_INTRINSICS_TEST)
(GCRY_RISCV_VECTOR_INTRINSICS_TEST): Add main() function to test
program.
(gcry_cv_cc_x86_avx512_intrinsics)
(gcry_cv_cc_aarch64_neon_intrinsics)
(gcry_cv_cc_aarch64_neon_intrinsics_cflags)
(gcry_cv_cc_ppc_altivec, gcry_cv_cc_ppc_altivec_cflags)
(gcry_cv_cc_riscv_vector_intrinsics)
(gcry_cv_cc_riscv_vector_intrinsics_cflags): Change AC_COMPILE_IFELSE
to AC_LINK_IFELSE.
--
With LTO enabled, AC_COMPILE_IFELSE does not perform actual
compilation. Solve issue by using AC_LINK_IFELSE to ensure LTO
performs code generation to detect missing vector extensions.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna at iki.fi>
---
configure.ac | 52 +++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 43 insertions(+), 9 deletions(-)
diff --git a/configure.ac b/configure.ac
index 30be86b5..b41f67f4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1768,7 +1768,7 @@ AC_CACHE_CHECK([whether compiler supports x86/AVX512 intrinsics],
gcry_cv_cc_x86_avx512_intrinsics="n/a"
else
gcry_cv_cc_x86_avx512_intrinsics=no
- AC_COMPILE_IFELSE([AC_LANG_SOURCE(
+ AC_LINK_IFELSE([AC_LANG_SOURCE(
[[#include <immintrin.h>
__m512i fn(void *in, __m128i y)
{
@@ -1781,6 +1781,12 @@ AC_CACHE_CHECK([whether compiler supports x86/AVX512 intrinsics],
::"x"(y),"r"(in):"memory","xmm6");
return x;
}
+ int main(void)
+ {
+ __m128i y = _mm_setzero_si128();
+ __m512i r = fn(&y, y);
+ return (int)_mm_cvtsi128_si32(_mm512_castsi512_si128(r));
+ }
]])],
[gcry_cv_cc_x86_avx512_intrinsics=yes])
fi])
@@ -2303,6 +2309,12 @@ m4_define([GCRY_AARCH64_NEON_INTRINSICS_TEST],
memory_barrier_with_vec(in);
return in;
}
+ int main(void)
+ {
+ __m128i v = {0, 0};
+ v = fn(v);
+ return (int)vgetq_lane_u64(v, 0);
+ }
]]
)]
)
@@ -2314,7 +2326,7 @@ AC_CACHE_CHECK([whether compiler supports AArch64/NEON/crypto intrinsics],
gcry_cv_cc_aarch64_neon_intrinsics="n/a"
else
gcry_cv_cc_aarch64_neon_intrinsics=no
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[GCRY_AARCH64_NEON_INTRINSICS_TEST],
[gcry_cv_cc_aarch64_neon_intrinsics=yes])
fi])
@@ -2333,7 +2345,7 @@ if test "$gcry_cv_cc_aarch64_neon_intrinsics" = "no" &&
[gcry_cv_cc_aarch64_neon_intrinsics_cflags],
[
gcry_cv_cc_aarch64_neon_intrinsics_cflags=no
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[GCRY_AARCH64_NEON_INTRINSICS_TEST],
[gcry_cv_cc_aarch64_neon_intrinsics_cflags=yes])
])
@@ -2372,6 +2384,12 @@ m4_define([GCRY_POWERPC_VECTOR_INTRINSICS_TEST],
y = vec_sld_u32 (y, y, 3);
return vec_cipher_be (t, in) ^ (block)y;
}
+ int main(void)
+ {
+ block b = {0};
+ b = fn(b);
+ return (int)vec_extract((vecu32)b, 0);
+ }
]]
)]
)
@@ -2383,7 +2401,7 @@ AC_CACHE_CHECK([whether compiler supports PowerPC AltiVec/VSX/crypto intrinsics]
gcry_cv_cc_ppc_altivec="n/a"
else
gcry_cv_cc_ppc_altivec=no
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[GCRY_POWERPC_VECTOR_INTRINSICS_TEST],
[gcry_cv_cc_ppc_altivec=yes])
fi])
@@ -2402,7 +2420,7 @@ if test "$gcry_cv_cc_ppc_altivec" = "no" &&
[gcry_cv_cc_ppc_altivec_cflags],
[
gcry_cv_cc_ppc_altivec_cflags=no
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[GCRY_POWERPC_VECTOR_INTRINSICS_TEST],
[gcry_cv_cc_ppc_altivec_cflags=yes])
])
@@ -2771,6 +2789,12 @@ m4_define([GCRY_RISCV_VECTOR_INTRINSICS_TEST],
clear_vec_reg_v0();
return in;
}
+ int main(void)
+ {
+ __m128i v = __riscv_vmv_v_x_u8m1(0, 16);
+ v = fn(v);
+ return (int)__riscv_vmv_x_s_u8m1_u8(v);
+ }
]]
)]
)
@@ -2782,7 +2806,7 @@ AC_CACHE_CHECK([whether compiler supports RISC-V vector intrinsics],
gcry_cv_cc_riscv_vector_intrinsics="n/a"
else
gcry_cv_cc_riscv_vector_intrinsics=no
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[GCRY_RISCV_VECTOR_INTRINSICS_TEST],
[gcry_cv_cc_riscv_vector_intrinsics=yes])
fi])
@@ -2806,7 +2830,7 @@ if test "$gcry_cv_cc_riscv_vector_intrinsics" = "no" &&
[gcry_cv_cc_riscv_vector_intrinsics_cflags],
[
gcry_cv_cc_riscv_vector_intrinsics_cflags=no
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[GCRY_RISCV_VECTOR_INTRINSICS_TEST],
[gcry_cv_cc_riscv_vector_intrinsics_cflags=yes])
])
@@ -2906,6 +2930,16 @@ m4_define([GCRY_RISCV_VECTOR_CRYPTO_INTRINSICS_TEST],
);
__riscv_vse32_v_u32m1(ptr + 0 * vl, a, vl);
}
+ int main(void)
+ {
+ unsigned int buf[256];
+ test_sha2(buf);
+ test_aes_key(buf);
+ test_aes_crypt(buf);
+ test_ghash(buf);
+ test_inline_vec_asm(buf);
+ return 0;
+ }
]]
)]
)
@@ -2917,7 +2951,7 @@ AC_CACHE_CHECK([whether compiler supports RISC-V vector cryptography intrinsics]
gcry_cv_cc_riscv_vector_crypto_intrinsics="n/a"
else
gcry_cv_cc_riscv_vector_crypto_intrinsics=no
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[GCRY_RISCV_VECTOR_CRYPTO_INTRINSICS_TEST],
[gcry_cv_cc_riscv_vector_crypto_intrinsics=yes])
fi])
@@ -2941,7 +2975,7 @@ if test "$gcry_cv_cc_riscv_vector_crypto_intrinsics" = "no" &&
AC_CACHE_CHECK([whether compiler supports RISC-V vector intrinsics with extra GCC flags],
[gcry_cv_cc_riscv_vector_crypto_intrinsics_cflags],
[gcry_cv_cc_riscv_vector_crypto_intrinsics_cflags=no
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[GCRY_RISCV_VECTOR_CRYPTO_INTRINSICS_TEST],
[gcry_cv_cc_riscv_vector_crypto_intrinsics_cflags=yes])])
if test "$gcry_cv_cc_riscv_vector_crypto_intrinsics_cflags" = "yes" ; then
--
2.53.0
More information about the Gcrypt-devel
mailing list