aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-11-12 11:15:15 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2024-11-12 13:03:39 +0100
commitd976daa931642d940b7b27032ca6139210c07eed (patch)
tree84ba82a9698a58380b65e54a95a3527b08ecf320 /gcc
parenta552a808f004c90d6f880f296041d674bdc27eda (diff)
downloadgcc-d976daa931642d940b7b27032ca6139210c07eed.zip
gcc-d976daa931642d940b7b27032ca6139210c07eed.tar.gz
gcc-d976daa931642d940b7b27032ca6139210c07eed.tar.bz2
tree-optimization/117417 - ICE with complex load optimization
When we decompose a complex load only used as real and imaginary parts we fail to honor IL constraints which are that a BIT_FIELD_REF of register type should be outermost in a ref. The following simply avoids the transform when the complex load has such a BIT_FIELD_REF. PR tree-optimization/117417 * tree-ssa-forwprop.cc (pass_forwprop::execute): Avoid decomposing BIT_FIELD_REF complex load. * gcc.dg/torture/pr117417.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr117417.c16
-rw-r--r--gcc/tree-ssa-forwprop.cc4
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr117417.c b/gcc/testsuite/gcc.dg/torture/pr117417.c
new file mode 100644
index 0000000..2c80dd5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr117417.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+typedef __attribute__((__vector_size__ (8))) double V;
+int bar (int a, V *p)
+{
+ V v;
+ v = *p;
+ a += *(_Complex short *) &v;
+ return a;
+}
+V x;
+int
+foo ()
+{
+ return bar (0, &x);
+}
diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index cb1e86c..5c690a2 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -3687,8 +3687,8 @@ pass_forwprop::execute (function *fun)
else if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
&& gimple_assign_load_p (stmt)
&& !gimple_has_volatile_ops (stmt)
- && (TREE_CODE (gimple_assign_rhs1 (stmt))
- != TARGET_MEM_REF)
+ && TREE_CODE (rhs) != TARGET_MEM_REF
+ && TREE_CODE (rhs) != BIT_FIELD_REF
&& !stmt_can_throw_internal (fun, stmt))
{
/* Rewrite loads used only in real/imagpart extractions to