From: Eric Botcazou Date: Thu, 3 Dec 2020 14:54:14 +0000 (+0100) Subject: Fix PR middle-end/98099 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=277ff3406d533990e98cf1c2075b9dc9db6fa48a;p=gcc.git Fix PR middle-end/98099 this replaces the ICE by a sorry message for the use of reverse scalar storage order with 128-bit decimal floating-point type on 32-bit targets. gcc/ChangeLog: PR middle-end/98099 * expmed.c (flip_storage_order): In the case of a non-integer mode, sorry out if the integer mode to be used instead is not supported. gcc/testsuite/ChangeLog: * gcc.dg/pr98099.c: New test. --- diff --git a/gcc/expmed.c b/gcc/expmed.c index ce88f322961..0d600bd7b54 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -412,7 +412,8 @@ flip_storage_order (machine_mode mode, rtx x) && __builtin_expect (reverse_float_storage_order_supported < 0, 0)) check_reverse_float_storage_order_support (); - if (!int_mode_for_size (GET_MODE_PRECISION (mode), 0).exists (&int_mode)) + if (!int_mode_for_size (GET_MODE_PRECISION (mode), 0).exists (&int_mode) + || !targetm.scalar_mode_supported_p (int_mode)) { sorry ("reverse storage order for %smode", GET_MODE_NAME (mode)); return x; diff --git a/gcc/testsuite/gcc.dg/pr98099.c b/gcc/testsuite/gcc.dg/pr98099.c new file mode 100644 index 00000000000..34909f225ff --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr98099.c @@ -0,0 +1,12 @@ +/* PR middle-end/98099 */ +/* Reported by G. Steinmetz */ + +/* { dg-do compile } */ +/* { dg-options "-fsso-struct=big-endian" } */ + +struct S { _Decimal128 a; }; + +_Decimal128 f (struct S x) +{ + return x.a; /* { dg-message "sorry, unimplemented: reverse storage order" "" { target { ! int128 } } } */ +}