re PR c/30265 (Compound literal can cause invalid gimple)
authorAndrew Pinski <andrew_pinski@playstation.sony.com>
Sat, 21 Apr 2007 21:47:35 +0000 (21:47 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Sat, 21 Apr 2007 21:47:35 +0000 (14:47 -0700)
2007-04-21  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR C/30265
        * c-gimplifier.c (gimplify_compound_literal_expr): Mark the
        decl as addressable if the compound literal was marked as
        addressable.
        Mark the decl as a gimple register if it is a complex or
        vector decl and does not live in memory.
2007-04-21  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR C/30265
        * gcc.c-torture/compile/compound-literal-2.c: New testcase.
        * gcc.c-torture/compile/compound-literal-3.c: New testcase.

From-SVN: r124024

gcc/ChangeLog
gcc/c-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/compound-literal-2.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/compound-literal-3.c [new file with mode: 0644]

index fe2dbaa4e982b6b24e1666c3c644b6172c03f030..8f74ec8492f0bc5c342772af077013d33d36a90d 100644 (file)
@@ -1,3 +1,12 @@
+2007-04-21  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR C/30265
+       * c-gimplifier.c (gimplify_compound_literal_expr): Mark the
+       decl as addressable if the compound literal was marked as
+       addressable.
+       Mark the decl as a gimple register if it is a complex or
+       vector decl and does not live in memory.
+
 2007-04-21  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        * tree.h (GIMPLE_TUPLE_P): Also true for PHI_NODEs.
index 7ddc88cf4ea939e2731195e10bd422942f31d27c..2a3803a6458fe8c8dab1398e39737070799e79a1 100644 (file)
@@ -183,6 +183,20 @@ gimplify_compound_literal_expr (tree *expr_p, tree *pre_p)
 {
   tree decl_s = COMPOUND_LITERAL_EXPR_DECL_STMT (*expr_p);
   tree decl = DECL_EXPR_DECL (decl_s);
+  /* Mark the decl as addressable if the compound literal
+     expression is addressable now, otherwise it is marked too late
+     after we gimplify the initialization expression.  */
+  if (TREE_ADDRESSABLE (*expr_p))
+    TREE_ADDRESSABLE (decl) = 1;
+
+  /* Preliminarily mark non-addressed complex variables as eligible
+     for promotion to gimple registers.  We'll transform their uses
+     as we find them.  */
+  if ((TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE
+       || TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE)
+      && !TREE_THIS_VOLATILE (decl)
+      && !needs_to_live_in_memory (decl))
+    DECL_GIMPLE_REG_P (decl) = 1;
 
   /* This decl isn't mentioned in the enclosing block, so add it to the
      list of temps.  FIXME it seems a bit of a kludge to say that
index 3157d85de1df11a787c577f83163804d4b5510f7..e5772ffb52f855103a4572fa25cee09d24c06f25 100644 (file)
@@ -1,3 +1,9 @@
+2007-04-21  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR C/30265
+       * gcc.c-torture/compile/compound-literal-2.c: New testcase.
+       * gcc.c-torture/compile/compound-literal-3.c: New testcase.
+
 2007-04-21  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/31136
diff --git a/gcc/testsuite/gcc.c-torture/compile/compound-literal-2.c b/gcc/testsuite/gcc.c-torture/compile/compound-literal-2.c
new file mode 100644 (file)
index 0000000..7e2f304
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR C/30265, invalid gimple was produced because we did not mark
+   the compound literal's decl early enough.  */
+
+int f(float *);
+int g(float x)
+{
+  return f(&(float){x}) + f(&x);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/compound-literal-3.c b/gcc/testsuite/gcc.c-torture/compile/compound-literal-3.c
new file mode 100644 (file)
index 0000000..bcd413c
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR C/30265, invalid gimple was produced because we did not mark
+   the compound literal's decl early enough.  */
+
+int f(_Complex float *);
+int g(_Complex float x)
+{
+  return f(&(_Complex float){x+1}) + f(&x);
+}