re PR middle-end/59471 (ICE using vector extensions (non-top-level BIT_FIELD_REF...
authorRichard Biener <rguenther@suse.de>
Wed, 8 Jan 2014 08:59:29 +0000 (08:59 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 8 Jan 2014 08:59:29 +0000 (08:59 +0000)
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

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr59471.c [new file with mode: 0644]

index 986ffaf..1f7c1a5 100644 (file)
@@ -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
index a6e0c75..202d084 100644 (file)
@@ -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;
index 442eb03..3ebbab4 100644 (file)
@@ -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 (file)
index 0000000..8ff7136
--- /dev/null
@@ -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];
+}