diff options
author | Richard Biener <rguenther@suse.de> | 2024-08-21 14:15:33 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2024-08-21 15:37:05 +0200 |
commit | 893cef363c46fa879b47d2b042c19c98bcd2b5f8 (patch) | |
tree | 0cb452ae6d0856ff63ba2e9310c2518d12bfa078 | |
parent | f577959f420ae404f99f630dadc1c0370734d0da (diff) | |
download | gcc-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.
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr116406.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.cc | 3 |
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; |