re PR middle-end/70370 (ICE in execute_todo, at passes.c:2003 when using __real__...
authorRichard Biener <rguenther@suse.de>
Thu, 24 Mar 2016 12:19:56 +0000 (12:19 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 24 Mar 2016 12:19:56 +0000 (12:19 +0000)
2016-03-24  Richard Biener  <rguenther@suse.de>

PR middle-end/70370
* gimplify.c (gimplify_asm_expr): Handle !allows_mem outputs
with register bases.

* gcc.dg/torture/pr70370.c: New testcase.

From-SVN: r234453

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

index 3c80e770d247bd67b1b560e2f16c5b3be7d24185..a4ade25c6ca17d983a168fe04dff70075b3a4a5b 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-24  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/70370
+       * gimplify.c (gimplify_asm_expr): Handle !allows_mem outputs
+       with register bases.
+
 2016-03-24  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/70372
index 5d03435cb0ac39d3be7874da1f010b0d205f8119..b9757db4c893f64c5766662daf19439b2c9b5cdc 100644 (file)
@@ -5191,6 +5191,32 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
          ret = tret;
        }
 
+      /* If the constraint does not allow memory make sure we gimplify
+         it to a register if it is not already but its base is.  This
+        happens for complex and vector components.  */
+      if (!allows_mem)
+       {
+         tree op = TREE_VALUE (link);
+         if (! is_gimple_val (op)
+             && is_gimple_reg_type (TREE_TYPE (op))
+             && is_gimple_reg (get_base_address (op)))
+           {
+             tree tem = create_tmp_reg (TREE_TYPE (op));
+             tree ass;
+             if (is_inout)
+               {
+                 ass = build2 (MODIFY_EXPR, TREE_TYPE (tem),
+                               tem, unshare_expr (op));
+                 gimplify_and_add (ass, pre_p);
+               }
+             ass = build2 (MODIFY_EXPR, TREE_TYPE (tem), op, tem);
+             gimplify_and_add (ass, post_p);
+
+             TREE_VALUE (link) = tem;
+             tret = GS_OK;
+           }
+       }
+
       vec_safe_push (outputs, link);
       TREE_CHAIN (link) = NULL_TREE;
 
index be2e416e53deb32527e4fbc828b50115a70a1523..73cb726f644fe37968324ecc4b027ad8af4e6d8d 100644 (file)
@@ -1,3 +1,8 @@
+2016-03-24  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/70370
+       * gcc.dg/torture/pr70370.c: New testcase.
+
 2016-03-24  Tom de Vries  <tom@codesourcery.com>
 
        * gfortran.dg/goacc/data-tree.f95: Add missing initialization.
diff --git a/gcc/testsuite/gcc.dg/torture/pr70370.c b/gcc/testsuite/gcc.dg/torture/pr70370.c
new file mode 100644 (file)
index 0000000..d077bee
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-do compile } */
+
+_Complex float
+test1 (_Complex float f)
+{
+  __asm__ ("" : "+r" (__real f));
+  return f;
+}
+
+_Complex float
+test2 (_Complex float f)
+{
+  __asm__ ("" : "=r" (__real f));
+  return f;
+}
+
+struct X { int i; };
+
+struct X 
+test3 (struct X x)
+{
+  __asm__ ("" : "=r" (x.i));
+  return x;
+}
+
+struct X
+test4 (struct X x)
+{
+  __asm__ ("" : "+r" (x.i));
+  return x;
+}
+
+struct X 
+test5 (struct X x)
+{
+  __asm__ ("" : "=r" (x));
+  return x;
+}
+
+struct X
+test6 (struct X x)
+{
+  __asm__ ("" : "+r" (x));
+  return x;
+}