aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuergen Christ <jchrist@linux.ibm.com>2024-02-19 10:10:35 +0100
committerJuergen Christ <jchrist@linux.ibm.com>2024-02-28 11:17:30 +0100
commit82ebfd35da49e5df87da132a7b8c41baeebc57b4 (patch)
treeec3d2ce7ead0f2f11308018896ca6a27c7c4573e
parentd6479050ecef10fd5e67b4da989229e4cfac53ee (diff)
downloadgcc-82ebfd35da49e5df87da132a7b8c41baeebc57b4.zip
gcc-82ebfd35da49e5df87da132a7b8c41baeebc57b4.tar.gz
gcc-82ebfd35da49e5df87da132a7b8c41baeebc57b4.tar.bz2
Only emulate integral vectors.
The emulation via word mode tries to perform integer arithmetic on floating point values instead of floating point arithmetic. This leads to mis-compilations. Failure occured on s390x on these existing test cases: gcc.dg/vect/tsvc/vect-tsvc-s112.c gcc.dg/vect/tsvc/vect-tsvc-s113.c gcc.dg/vect/tsvc/vect-tsvc-s119.c gcc.dg/vect/tsvc/vect-tsvc-s121.c gcc.dg/vect/tsvc/vect-tsvc-s131.c gcc.dg/vect/tsvc/vect-tsvc-s132.c gcc.dg/vect/tsvc/vect-tsvc-s2233.c gcc.dg/vect/tsvc/vect-tsvc-s421.c gcc.dg/vect/vect-alias-check-14.c gcc.target/s390/vector/partial/s390-vec-length-epil-run-1.c gcc.target/s390/vector/partial/s390-vec-length-epil-run-3.c gcc.target/s390/vector/partial/s390-vec-length-full-run-3.c gcc/ChangeLog: PR tree-optimization/114075 * tree-vect-stmts.cc (vectorizable_operation): Don't emulate floating point vectors Signed-off-by: Juergen Christ <jchrist@linux.ibm.com>
-rw-r--r--gcc/tree-vect-stmts.cc3
1 files changed, 2 insertions, 1 deletions
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 1dbe111..be0e1a9 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -6756,7 +6756,8 @@ vectorizable_operation (vec_info *vinfo,
those through even when the mode isn't word_mode. For
ops we have to lower the lowering code assumes we are
dealing with word_mode. */
- if ((((code == PLUS_EXPR || code == MINUS_EXPR || code == NEGATE_EXPR)
+ if (!INTEGRAL_TYPE_P (TREE_TYPE (vectype))
+ || (((code == PLUS_EXPR || code == MINUS_EXPR || code == NEGATE_EXPR)
|| !target_support_p)
&& maybe_ne (GET_MODE_SIZE (vec_mode), UNITS_PER_WORD))
/* Check only during analysis. */