https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69727
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2016-02-09 Ever confirmed|0 |1 --- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Steps to reproduce on non-powerpc host (no need for ppc64 binutils): ../configure --target powerpc64-linux --enable-languages=c,c++ --disable-bootstrap make -j16 Ctrl^C it early, after it configures stuff in gcc/ subdir and starts building there copy over the attached auto-host.h into gcc/ subdir cd gcc touch auto-host.h make -j16 cc1 cc1plus copy over the attached caller-save.{ii,gcda} into a new subdirectory ..../cc1plus -fpreprocessed caller-save.ii -msecure-plt -quiet -dumpbase caller-save.ii -auxbase-strip caller-save.s -g -O2 -version -fno-PIE -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -fprofile-use -o caller-save.s This generates (besides debug info) the same assembly as the one in native profiledbootstrap that ICEs on the typedef float TFtype __attribute__ ((mode (TF))); typedef _Complex float TCtype __attribute__ ((mode (TC))); TCtype __multc3 (TFtype a, TFtype b, TFtype c, TFtype d) { TFtype ac, bd, ad, bc, x, y; TCtype res; ac = a * c; bd = b * d; ad = a * d; bc = b * c; __asm__ ("" : "=m"(ac) : "m"(ac)); __asm__ ("" : "=m"(bd) : "m"(bd)); __asm__ ("" : "=m"(ad) : "m"(ad)); __asm__ ("" : "=m"(bc) : "m"(bc)); x = ac - bd; y = ad + bc; if (__builtin_expect ((x) != (x), 0) && __builtin_expect ((y) != (y), 0)) { _Bool recalc = 0; if (__builtin_expect (!__builtin_expect ((a) != (a), 0) & !__builtin_expect (!__builtin_expect (((a) - (a)) != ((a) - (a)), 0), 1), 0) || __builtin_expect (!__builtin_expect ((b) != (b), 0) & !__builtin_expect (!__builtin_expect (((b) - (b)) != ((b) - (b)), 0), 1), 0)) { a = __builtin_copysignl (__builtin_expect (!__builtin_expect ((a) != (a), 0) & !__builtin_expect (!__builtin_expect (((a) - (a)) != ((a) - (a)), 0), 1), 0) ? 1 : 0, a); b = __builtin_copysignl (__builtin_expect (!__builtin_expect ((b) != (b), 0) & !__builtin_expect (!__builtin_expect (((b) - (b)) != ((b) - (b)), 0), 1), 0) ? 1 : 0, b); if (__builtin_expect ((c) != (c), 0)) c = __builtin_copysignl (0, c); if (__builtin_expect ((d) != (d), 0)) d = __builtin_copysignl (0, d); recalc = 1; } if (__builtin_expect (!__builtin_expect ((c) != (c), 0) & !__builtin_expect (!__builtin_expect (((c) - (c)) != ((c) - (c)), 0), 1), 0) || __builtin_expect (!__builtin_expect ((d) != (d), 0) & !__builtin_expect (!__builtin_expect (((d) - (d)) != ((d) - (d)), 0), 1), 0)) { c = __builtin_copysignl (__builtin_expect (!__builtin_expect ((c) != (c), 0) & !__builtin_expect (!__builtin_expect (((c) - (c)) != ((c) - (c)), 0), 1), 0) ? 1 : 0, c); d = __builtin_copysignl (__builtin_expect (!__builtin_expect ((d) != (d), 0) & !__builtin_expect (!__builtin_expect (((d) - (d)) != ((d) - (d)), 0), 1), 0) ? 1 : 0, d); if (__builtin_expect ((a) != (a), 0)) a = __builtin_copysignl (0, a); if (__builtin_expect ((b) != (b), 0)) b = __builtin_copysignl (0, b); recalc = 1; } if (!recalc && (__builtin_expect (!__builtin_expect ((ac) != (ac), 0) & !__builtin_expect (!__builtin_expect (((ac) - (ac)) != ((ac) - (ac)), 0), 1), 0) || __builtin_expect (!__builtin_expect ((bd) != (bd), 0) & !__builtin_expect (!__builtin_expect (((bd) - (bd)) != ((bd) - (bd)), 0), 1), 0) || __builtin_expect (!__builtin_expect ((ad) != (ad), 0) & !__builtin_expect (!__builtin_expect (((ad) - (ad)) != ((ad) - (ad)), 0), 1), 0) || __builtin_expect (!__builtin_expect ((bc) != (bc), 0) & !__builtin_expect (!__builtin_expect (((bc) - (bc)) != ((bc) - (bc)), 0), 1), 0))) { if (__builtin_expect ((a) != (a), 0)) a = __builtin_copysignl (0, a); if (__builtin_expect ((b) != (b), 0)) b = __builtin_copysignl (0, b); if (__builtin_expect ((c) != (c), 0)) c = __builtin_copysignl (0, c); if (__builtin_expect ((d) != (d), 0)) d = __builtin_copysignl (0, d); recalc = 1; } if (recalc) { x = __builtin_huge_vall () * (a * c - b * d); y = __builtin_huge_vall () * (a * d + b * c); } } __real__ res = x; __imag__ res = y; return res; } testcase.