aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-01-08 08:59:29 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-01-08 08:59:29 +0000
commit0bd34ae42178978a45a5ad947f10a66d41d68f77 (patch)
tree094682c8d689ea456ddeaee532cbdfeba9f2278a
parent3c92da9027c684296d644deb2cf3e6316ed3c867 (diff)
downloadgcc-0bd34ae42178978a45a5ad947f10a66d41d68f77.zip
gcc-0bd34ae42178978a45a5ad947f10a66d41d68f77.tar.gz
gcc-0bd34ae42178978a45a5ad947f10a66d41d68f77.tar.bz2
re PR middle-end/59471 (ICE using vector extensions (non-top-level BIT_FIELD_REF, IMAGPART_EXPR or REALPART_EXPR))
2014-01-08 Richard Biener <rguenther@suse.de> PR middle-end/59471 * gimplify.c (gimplify_expr): Gimplify register-register type VIEW_CONVERT_EXPRs to separate stmts. * gcc.dg/pr59471.c: New testcase. From-SVN: r206420
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimplify.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr59471.c16
4 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 986ffaf..1f7c1a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-08 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/59471
+ * gimplify.c (gimplify_expr): Gimplify register-register type
+ VIEW_CONVERT_EXPRs to separate stmts.
+
2014-01-07 Jeff Law <law@redhat.com>
PR middle-end/53623
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index a6e0c75..202d084 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -7373,12 +7373,22 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
TREE_TYPE (*expr_p));
break;
+ case VIEW_CONVERT_EXPR:
+ if (is_gimple_reg_type (TREE_TYPE (*expr_p))
+ && is_gimple_reg_type (TREE_TYPE (TREE_OPERAND (*expr_p, 0))))
+ {
+ ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
+ post_p, is_gimple_val, fb_rvalue);
+ recalculate_side_effects (*expr_p);
+ break;
+ }
+ /* Fallthru. */
+
case ARRAY_REF:
case ARRAY_RANGE_REF:
case REALPART_EXPR:
case IMAGPART_EXPR:
case COMPONENT_REF:
- case VIEW_CONVERT_EXPR:
ret = gimplify_compound_lval (expr_p, pre_p, post_p,
fallback ? fallback : fb_rvalue);
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 442eb03..3ebbab4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-08 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/59471
+ * gcc.dg/pr59471.c: New testcase.
+
2014-01-07 Jeff Law <law@redhat.com>
PR middle-end/53623
diff --git a/gcc/testsuite/gcc.dg/pr59471.c b/gcc/testsuite/gcc.dg/pr59471.c
new file mode 100644
index 0000000..8ff7136
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr59471.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+typedef unsigned char uint8x4_t
+__attribute__ ((__vector_size__ (4)));
+
+typedef unsigned short uint16x8_t
+__attribute__ ((__vector_size__ (16)));
+
+typedef unsigned int uint32x4_t
+__attribute__ ((__vector_size__ (16)));
+
+uint8x4_t
+foo (uint16x8_t x)
+{
+ return (uint8x4_t) ((uint32x4_t) x)[0];
+}