aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKewen Lin <linkw@linux.ibm.com>2024-05-20 21:01:06 -0500
committerKewen Lin <linkw@linux.ibm.com>2024-05-20 21:01:06 -0500
commitc547e353597ac4e0af09c2faca8c5a16744dcea4 (patch)
treee853749c30cfc0dce4bf4e05135c0fe78471054e
parentb666d86b41c85a1756bf43951661a03f670a6852 (diff)
downloadgcc-c547e353597ac4e0af09c2faca8c5a16744dcea4.zip
gcc-c547e353597ac4e0af09c2faca8c5a16744dcea4.tar.gz
gcc-c547e353597ac4e0af09c2faca8c5a16744dcea4.tar.bz2
rs6000: Fix ICE on IEEE128 long double without vsx [PR114402]
As PR114402 shows, we supports IEEE128 format long double even if there is no vsx support, but there is an ICE about cbranch as the test case shows. For now, we only supports compare:CCFP pattern for IEEE128 fp if TARGET_FLOAT128_HW, so in function rs6000_generate_compare we have a check with !TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode) to make !TARGET_FLOAT128_HW IEEE128 fp handling go with libcall. But unfortunately the IEEE128 without vsx support doesn't meet FLOAT128_VECTOR_P (mode) so it goes further with an unmatched compare:CCFP pattern which triggers ICE. So this patch is to make rs6000_generate_compare consider IEEE128 without vsx as well then it can end up with libcall. PR target/114402 gcc/ChangeLog: * config/rs6000/rs6000.cc (rs6000_generate_compare): Make IEEE128 handling without vsx go with libcall. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr114402.c: New test.
-rw-r--r--gcc/config/rs6000/rs6000.cc4
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr114402.c16
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index e713a1e..d18e262 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -15283,7 +15283,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode)
rtx op0 = XEXP (cmp, 0);
rtx op1 = XEXP (cmp, 1);
- if (!TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode))
+ if (!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (mode))
comp_mode = CCmode;
else if (FLOAT_MODE_P (mode))
comp_mode = CCFPmode;
@@ -15315,7 +15315,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode)
/* IEEE 128-bit support in VSX registers when we do not have hardware
support. */
- if (!TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode))
+ if (!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (mode))
{
rtx libfunc = NULL_RTX;
bool check_nan = false;
diff --git a/gcc/testsuite/gcc.target/powerpc/pr114402.c b/gcc/testsuite/gcc.target/powerpc/pr114402.c
new file mode 100644
index 0000000..9323c5e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr114402.c
@@ -0,0 +1,16 @@
+/* Explicitly disable VSX when VSX is on. */
+/* { dg-options "-mno-vsx" { target powerpc_vsx } } */
+
+/* Verify there is no ICE. */
+
+long double a;
+long double b;
+
+int
+foo ()
+{
+ if (a > b)
+ return 0;
+ else
+ return 1;
+}