I wrote:
> However, it definitely is a regression that the build fails
> altogether.  Too bad nobody tried the x86 -> ARM case earlier.

I replicated this on longfin's host (x86_64 mac mini).
It seems there are two problems:

1. pg_cpu.h believes that x86-specific code can be conditional on

#if defined(USE_SSE2) || defined(__i386__)

but macOS doesn't define __i386__, only __x86_64__.  It works
anyway on single-arch builds because the test to set USE_SSE2
succeeds, but not on multi-arch builds.

2. checksum.c believes that it's okay to call x86_feature_available
if USE_AVX2_WITH_RUNTIME_CHECK is set.  I didn't track down just
why that's getting set in a multi-arch build when USE_SSE2 is not,
but it is, and that's probably good since it means we get at least
some optimization for x86 Macs.  But we have to disregard it when
we're doing the ARM side.

The attached quick hack makes the build work on my machine.
I'm hesitant to shove it into the tree though because I'm
not too certain whether there could be side-effects on
other platforms.  I think the way to proceed for now is for
EDB to apply this patch in their build of beta1, and we can
review the patch at leisure afterwards.

                        regards, tom lane

diff --git a/src/backend/storage/page/checksum.c b/src/backend/storage/page/checksum.c
index 030c44f7308..db8544bca01 100644
--- a/src/backend/storage/page/checksum.c
+++ b/src/backend/storage/page/checksum.c
@@ -26,6 +26,12 @@
 #define PG_CHECKSUM_INTERNAL
 #include "storage/checksum_impl.h"	/* IWYU pragma: keep */
 
+/* In universal macOS builds, don't try to compile AVX code on the ARM side */
+#if defined(__i386__) || defined(__x86_64__)
+#else
+#undef USE_AVX2_WITH_RUNTIME_CHECK
+#endif
+
 
 static uint32
 pg_checksum_block_fallback(const PGChecksummablePage *page)
diff --git a/src/include/port/pg_cpu.h b/src/include/port/pg_cpu.h
index 566ed7a16e3..b276d7f1a4e 100644
--- a/src/include/port/pg_cpu.h
+++ b/src/include/port/pg_cpu.h
@@ -13,7 +13,7 @@
 #ifndef PG_CPU_H
 #define PG_CPU_H
 
-#if defined(USE_SSE2) || defined(__i386__)
+#if defined(USE_SSE2) || defined(__i386__) || defined(__x86_64__)
 
 typedef enum X86FeatureId
 {

Reply via email to