Attached is a draft patch to incorporate Victor's slimmed-down test into configure. If you have a chance, could you confirm it does the right thing on your Sparc machine?
BTW, it would be a good idea to set up a buildfarm member on that machine, if you care about whether that configuration continues to work in the future. regards, tom lane
diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index 076656c..cbfccf6 100644 *** a/config/c-compiler.m4 --- b/config/c-compiler.m4 *************** AC_DEFUN([PGAC_TYPE_128BIT_INT], *** 108,136 **** [AC_CACHE_CHECK([for __int128], [pgac_cv__128bit_int], [AC_LINK_IFELSE([AC_LANG_PROGRAM([ /* * These are globals to discourage the compiler from folding all the * arithmetic tests down to compile-time constants. We do not have ! * convenient support for 64bit literals at this point... */ __int128 a = 48828125; ! __int128 b = 97656255; ],[ __int128 c,d; a = (a << 12) + 1; /* 200000000001 */ b = (b << 12) + 5; /* 400000000005 */ ! /* use the most relevant arithmetic ops */ c = a * b; d = (c + b) / b; ! /* return different values, to prevent optimizations */ if (d != a+1) ! return 0; ! return 1; ])], [pgac_cv__128bit_int=yes], [pgac_cv__128bit_int=no])]) if test x"$pgac_cv__128bit_int" = xyes ; then ! AC_DEFINE(PG_INT128_TYPE, __int128, [Define to the name of a signed 128-bit integer type.]) ! AC_CHECK_ALIGNOF(PG_INT128_TYPE) fi])# PGAC_TYPE_128BIT_INT --- 108,166 ---- [AC_CACHE_CHECK([for __int128], [pgac_cv__128bit_int], [AC_LINK_IFELSE([AC_LANG_PROGRAM([ /* + * We don't actually run this test, just link it to verify that any support + * functions needed for __int128 are present. + * * These are globals to discourage the compiler from folding all the * arithmetic tests down to compile-time constants. We do not have ! * convenient support for 128bit literals at this point... */ __int128 a = 48828125; ! __int128 b = 97656250; ],[ __int128 c,d; a = (a << 12) + 1; /* 200000000001 */ b = (b << 12) + 5; /* 400000000005 */ ! /* try the most relevant arithmetic ops */ c = a * b; d = (c + b) / b; ! /* must use the results, else compiler may optimize arithmetic away */ if (d != a+1) ! return 1; ])], [pgac_cv__128bit_int=yes], [pgac_cv__128bit_int=no])]) if test x"$pgac_cv__128bit_int" = xyes ; then ! # Some versions of gcc have problems passing __int128 function arguments ! # when using non-default alignment. Test that, if not cross-compiling. ! AC_CACHE_CHECK([for __int128 alignment bug], [pgac_cv__128bit_int_bug], ! [AC_RUN_IFELSE([AC_LANG_PROGRAM([ ! /* This must match the corresponding code in c.h: */ ! #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) ! #define pg_attribute_aligned(a) __attribute__((aligned(a))) ! #endif ! typedef __int128 int128a ! #if defined(pg_attribute_aligned) ! pg_attribute_aligned(8) ! #endif ! ; ! int128a holder; ! void pass_by_val(void *buffer, int128a par) { holder = par; } ! ],[ ! long int i64 = 97656225L << 12; ! int128a q; ! pass_by_val(main, (int128a) i64); ! q = (int128a) i64; ! if (q != holder) ! return 1; ! ])], ! [pgac_cv__128bit_int_bug=ok], ! [pgac_cv__128bit_int_bug=broken], ! [pgac_cv__128bit_int_bug=assuming-ok])]) ! if test x"$pgac_cv__128bit_int_bug" != xbroken ; then ! AC_DEFINE(PG_INT128_TYPE, __int128, [Define to the name of a signed 128-bit integer type.]) ! AC_CHECK_ALIGNOF(PG_INT128_TYPE) ! fi fi])# PGAC_TYPE_128BIT_INT diff --git a/configure b/configure index 45221e1..6eaed45 100755 *** a/configure --- b/configure *************** else *** 14996,15007 **** /* end confdefs.h. */ /* * These are globals to discourage the compiler from folding all the * arithmetic tests down to compile-time constants. We do not have ! * convenient support for 64bit literals at this point... */ __int128 a = 48828125; ! __int128 b = 97656255; int main () --- 14996,15010 ---- /* end confdefs.h. */ /* + * We don't actually run this test, just link it to verify that any support + * functions needed for __int128 are present. + * * These are globals to discourage the compiler from folding all the * arithmetic tests down to compile-time constants. We do not have ! * convenient support for 128bit literals at this point... */ __int128 a = 48828125; ! __int128 b = 97656250; int main () *************** main () *** 15010,15022 **** __int128 c,d; a = (a << 12) + 1; /* 200000000001 */ b = (b << 12) + 5; /* 400000000005 */ ! /* use the most relevant arithmetic ops */ c = a * b; d = (c + b) / b; ! /* return different values, to prevent optimizations */ if (d != a+1) ! return 0; ! return 1; ; return 0; --- 15013,15024 ---- __int128 c,d; a = (a << 12) + 1; /* 200000000001 */ b = (b << 12) + 5; /* 400000000005 */ ! /* try the most relevant arithmetic ops */ c = a * b; d = (c + b) / b; ! /* must use the results, else compiler may optimize arithmetic away */ if (d != a+1) ! return 1; ; return 0; *************** fi *** 15033,15042 **** { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__128bit_int" >&5 $as_echo "$pgac_cv__128bit_int" >&6; } if test x"$pgac_cv__128bit_int" = xyes ; then $as_echo "#define PG_INT128_TYPE __int128" >>confdefs.h ! # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of PG_INT128_TYPE" >&5 $as_echo_n "checking alignment of PG_INT128_TYPE... " >&6; } --- 15035,15097 ---- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__128bit_int" >&5 $as_echo "$pgac_cv__128bit_int" >&6; } if test x"$pgac_cv__128bit_int" = xyes ; then + # Some versions of gcc have problems passing __int128 function arguments + # when using non-default alignment. Test that, if not cross-compiling. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __int128 alignment bug" >&5 + $as_echo_n "checking for __int128 alignment bug... " >&6; } + if ${pgac_cv__128bit_int_bug+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test "$cross_compiling" = yes; then : + pgac_cv__128bit_int_bug=assuming-ok + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + /* This must match the corresponding code in c.h: */ + #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) + #define pg_attribute_aligned(a) __attribute__((aligned(a))) + #endif + typedef __int128 int128a + #if defined(pg_attribute_aligned) + pg_attribute_aligned(8) + #endif + ; + int128a holder; + void pass_by_val(void *buffer, int128a par) { holder = par; } + + int + main () + { + + long int i64 = 97656225L << 12; + int128a q; + pass_by_val(main, (int128a) i64); + q = (int128a) i64; + if (q != holder) + return 1; + + ; + return 0; + } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + pgac_cv__128bit_int_bug=ok + else + pgac_cv__128bit_int_bug=broken + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__128bit_int_bug" >&5 + $as_echo "$pgac_cv__128bit_int_bug" >&6; } + if test x"$pgac_cv__128bit_int_bug" != xbroken ; then $as_echo "#define PG_INT128_TYPE __int128" >>confdefs.h ! # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of PG_INT128_TYPE" >&5 $as_echo_n "checking alignment of PG_INT128_TYPE... " >&6; } *************** cat >>confdefs.h <<_ACEOF *** 15071,15076 **** --- 15126,15132 ---- _ACEOF + fi fi # Check for various atomic operations now that we have checked how to declare