aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-08-21 14:15:33 +0200
committerRichard Biener <rguenth@gcc.gnu.org>2024-08-21 15:37:05 +0200
commit893cef363c46fa879b47d2b042c19c98bcd2b5f8 (patch)
tree0cb452ae6d0856ff63ba2e9310c2518d12bfa078 /gcc
parentf577959f420ae404f99f630dadc1c0370734d0da (diff)
downloadgcc-893cef363c46fa879b47d2b042c19c98bcd2b5f8.zip
gcc-893cef363c46fa879b47d2b042c19c98bcd2b5f8.tar.gz
gcc-893cef363c46fa879b47d2b042c19c98bcd2b5f8.tar.bz2
tree-optimization/116406 - ICE with int<->float punning prevention
The following does away with the idea to use non-symmetrical testing of mode_can_transfer_bits in hash-table equality testing. It isn't feasible to always control query order to maintain consistency. PR tree-optimization/116406 * tree-ssa-sccvn.cc (vn_reference_eq): Never equate float and int when the float mode cannot transfer bits. Do not try to anticipate which is the mode we actually load from. * gcc.dg/tree-ssa/pr116406.c: New testcase. * gcc.dg/tree-ssa/ssa-pre-30.c: On x86 dd -msse -mfpmath=sse.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr116406.c21
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c1
-rw-r--r--gcc/tree-ssa-sccvn.cc3
3 files changed, 24 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr116406.c b/gcc/testsuite/gcc.dg/tree-ssa/pr116406.c
new file mode 100644
index 0000000..6643c49
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr116406.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -finstrument-functions-once" } */
+/* { dg-additional-options "-mfpmath=387" { target { x86_64-*-* i?86-*-* } } } */
+
+typedef union {
+ float f32;
+ double f64;
+ long i64;
+} U;
+
+_Bool
+foo (int c, U u)
+{
+ switch (c)
+ {
+ case 1:
+ return u.f32 - u.f64;
+ case 0:
+ return u.i64;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c
index cf93173..29dc181 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c
@@ -1,6 +1,7 @@
/* { dg-do compile } */
/* { dg-require-effective-target int32 } */
/* { dg-options "-O2 -fdump-tree-pre-details" } */
+/* { dg-additional-options "-msse -mfpmath=sse" { target { x86_64-*-* i?86-*-* } } } */
int f;
int g;
diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
index 4370d09..abf7d38 100644
--- a/gcc/tree-ssa-sccvn.cc
+++ b/gcc/tree-ssa-sccvn.cc
@@ -838,7 +838,8 @@ vn_reference_eq (const_vn_reference_t const vr1, const_vn_reference_t const vr2)
return false;
}
else if (TYPE_MODE (vr1->type) != TYPE_MODE (vr2->type)
- && !mode_can_transfer_bits (TYPE_MODE (vr1->type)))
+ && (!mode_can_transfer_bits (TYPE_MODE (vr1->type))
+ || !mode_can_transfer_bits (TYPE_MODE (vr2->type))))
return false;
i = 0;