>>> We currently have the problem that the compiler used in GUB for >>> compiling 32bit binaries gets an internal compiler fault for those >>> options. >>> >>> We'll need to figure out whether a newer compiler does the trick, and if >>> it does, update GUB. Or find a different way of proceeding. >>> >>> I'll see whether I can convince my current compilers to generate 32bit >>> code and see whether those are currently up to using those options. If >>> current compilers don't want them, we'll need to revert to a different >>> plan. >> >> It seems that static cast from `unsigned long long` to `double` >> by x86 SSE2 raises the internal compile error. >> However, static cast from `signed long long` to `double` >> does not raise the errir. >> I think it can be a workaround for rational.cc. >> >> i.e. >> First, static cast from `unsigned long long` to `signed long long` >> Then, static cast from `singed long long` to `double` > > Oh wow. I would never have thought one could identify something as > specific. I think I have convinced my system to build a 32bit Guile, > but have problems convincing LilyPond to do the same. So I cannot help > with debugging this situation yet or even finding out whether it > persists into newer compiler versions.
I've attached the workaround patch for stable/2.20 branch. The results of my experiment is here. Current stable/2.20 bcad34e31d7866eb126e73abc89eeeb01faf081f without the patch: ``` $ ~gub/gub/target/darwin-x86/root/usr/cross/bin/i686-apple-darwin8-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc rational.cc: In member function 'double Rational::to_double() const': rational.cc:48:1: internal compiler error: in gen_reg_rtx, at emit-rtl.c:838 } ^ 0x773934 gen_reg_rtx(machine_mode) /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/emit-rtl.c:838 0xc53c53 gen_split_4130(rtx_def*, rtx_def**) /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/config/i386/sse.md:884 0x7772a7 try_split(rtx_def*, rtx_def*, int) /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/emit-rtl.c:3444 0x8feb71 split_insn /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/recog.c:2897 0x9034e4 split_all_insns() /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/recog.c:2987 0x903578 rest_of_handle_split_after_reload /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/recog.c:3938 0x903578 execute /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/recog.c:3967 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. $ ~gub/gub/target/linux-x86/root/usr/cross/bin/i686-linux-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ~gub/gub/target/freebsd-x86/root/usr/cross/bin/i686-freebsd6-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ``` Current stable/2.20 bcad34e31d7866eb126e73abc89eeeb01faf081f with the patch: ``` $ ~gub/gub/target/darwin-x86/root/usr/cross/bin/i686-apple-darwin8-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc rational.cc:52:5: warning: floating constant exceeds range of 'double' [-Woverflow] return -HUGE_VAL; ^ rational.cc:54:5: warning: floating constant exceeds range of 'double' [-Woverflow] return HUGE_VAL; ^ $ ~gub/gub/target/linux-x86/root/usr/cross/bin/i686-linux-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ~gub/gub/target/freebsd-x86/root/usr/cross/bin/i686-freebsd6-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ```
>From 2a3816e49067e026c7180dc6a3b2d5614d9c20d6 Mon Sep 17 00:00:00 2001 From: Masamichi Hosoda <truer...@trueroad.jp> Date: Tue, 4 Feb 2020 23:30:29 +0900 Subject: [PATCH] Add workaround for avoiding GUB darwin-x86 error In GUB, g++ 4.9.4 for darwin-x86 (macOS x86), it seems that static cast from `unsigned long long` to `double` by x86 SSE2 raises an internal compile error. However, static cast from `signed long long` to `double` does not raise the error. So we use it for a workaround. i.e. First, static cast from `unsigned long long` to `signed long long`. Then, static cast from `singed long long` to `double`. --- flower/rational.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/flower/rational.cc b/flower/rational.cc index 559e1646a0..9435edbb8f 100644 --- a/flower/rational.cc +++ b/flower/rational.cc @@ -31,7 +31,23 @@ double Rational::to_double () const { if (sign_ == -1 || sign_ == 1 || sign_ == 0) +// FIXME: workaround: In GUB, g++ 4.9.4 for darwin-x86, +// it seems that static cast from `unsigned long long` to `double` +// by x86 SSE2 raises an internal compile error. +// However, static cast from `signed long long` to `double` +// does not raise the error. +// So we use it for a workaround. +#if defined (__i386__) && defined (__APPLE__) && \ + defined (__SSE2_MATH__) && __GNUC__ < 5 + { + I64 inum = num_; + I64 iden = den_; + return static_cast<double> (sign_) * + static_cast<double> (inum) / static_cast<double> (iden); + } +#else return (double)sign_ * (double)num_ / (double)den_; +#endif if (sign_ == -2) return -HUGE_VAL; else if (sign_ == 2) -- 2.21.0