OSDN Git Service

2007-04-21 Andrew Pinski <andrew_pinski@playstation.sony.com>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Apr 2007 21:47:35 +0000 (21:47 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Apr 2007 21:47:35 +0000 (21:47 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124024 138bc75d-0d04-0410-961f-82ee72b054a4

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 fe2dbaa..8f74ec8 100644 (file)
@@ -1,5 +1,14 @@
 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.
        (GENERIC_NEXT): New function macro.
        (PHI_CHAIN): Use phi_node's new chain variable.
index 7ddc88c..2a3803a 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 3157d85..e5772ff 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);
+}