re PR rtl-optimization/57637 (Miscompare on 178.galgel in SPEC2000 on arm)
authorZhenqiang Chen <zhenqiang.chen@linaro.org>
Tue, 30 Jul 2013 06:53:31 +0000 (06:53 +0000)
committerXuepeng Guo <xguo@gcc.gnu.org>
Tue, 30 Jul 2013 06:53:31 +0000 (06:53 +0000)
gcc/
2013-07-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>

PR rtl-optimization/57637
* function.c (move_insn_for_shrink_wrap): Also check the
GEN set of the LIVE problem for the liveness analysis
if it exists, otherwise give up.

gcc/testsuite/
2013-07-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>

* gcc.target/arm/pr57637.c: New testcase.

From-SVN: r201326

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr57637.c [new file with mode: 0644]

index 6274a963975f71a2ee92da206b82ca83125094a0..d073a190471464108b3315d5c492fa9800e90398 100644 (file)
@@ -1,3 +1,10 @@
+2013-07-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
+
+       PR rtl-optimization/57637
+       * function.c (move_insn_for_shrink_wrap): Also check the
+       GEN set of the LIVE problem for the liveness analysis
+       if it exists, otherwise give up.
+
 2013-07-29  Bill Schmidt  <wschmidt@vnet.linux.ibm.com>
 
        PR tree-optimization/57993
index 3e33fc70632f2d13ebb5cc855f22a707f9f9405d..953fd48b2ad21e10e81f6e93c86a121ef08a9002 100644 (file)
@@ -5506,22 +5506,45 @@ move_insn_for_shrink_wrap (basic_block bb, rtx insn,
         except for any part that overlaps SRC (next loop).  */
       bb_uses = &DF_LR_BB_INFO (bb)->use;
       bb_defs = &DF_LR_BB_INFO (bb)->def;
-      for (i = dregno; i < end_dregno; i++)
+      if (df_live)
        {
-         if (REGNO_REG_SET_P (bb_uses, i) || REGNO_REG_SET_P (bb_defs, i))
-           next_block = NULL;
-         CLEAR_REGNO_REG_SET (live_out, i);
-         CLEAR_REGNO_REG_SET (live_in, i);
-       }
+         for (i = dregno; i < end_dregno; i++)
+           {
+             if (REGNO_REG_SET_P (bb_uses, i) || REGNO_REG_SET_P (bb_defs, i)
+                 || REGNO_REG_SET_P (&DF_LIVE_BB_INFO (bb)->gen, i))
+               next_block = NULL;
+             CLEAR_REGNO_REG_SET (live_out, i);
+             CLEAR_REGNO_REG_SET (live_in, i);
+           }
 
-      /* Check whether BB clobbers SRC.  We need to add INSN to BB if so.
-        Either way, SRC is now live on entry.  */
-      for (i = sregno; i < end_sregno; i++)
+         /* Check whether BB clobbers SRC.  We need to add INSN to BB if so.
+            Either way, SRC is now live on entry.  */
+         for (i = sregno; i < end_sregno; i++)
+           {
+             if (REGNO_REG_SET_P (bb_defs, i)
+                 || REGNO_REG_SET_P (&DF_LIVE_BB_INFO (bb)->gen, i))
+               next_block = NULL;
+             SET_REGNO_REG_SET (live_out, i);
+             SET_REGNO_REG_SET (live_in, i);
+           }
+       }
+      else
        {
-         if (REGNO_REG_SET_P (bb_defs, i))
-           next_block = NULL;
-         SET_REGNO_REG_SET (live_out, i);
-         SET_REGNO_REG_SET (live_in, i);
+         /* DF_LR_BB_INFO (bb)->def does not comprise the DF_REF_PARTIAL and
+            DF_REF_CONDITIONAL defs.  So if DF_LIVE doesn't exist, i.e.
+            at -O1, just give up searching NEXT_BLOCK.  */
+         next_block = NULL;
+         for (i = dregno; i < end_dregno; i++)
+           {
+             CLEAR_REGNO_REG_SET (live_out, i);
+             CLEAR_REGNO_REG_SET (live_in, i);
+           }
+
+         for (i = sregno; i < end_sregno; i++)
+           {
+             SET_REGNO_REG_SET (live_out, i);
+             SET_REGNO_REG_SET (live_in, i);
+           }
        }
 
       /* If we don't need to add the move to BB, look for a single
index bbc2ca6b7371efec452f621debdfe40cc9ea7f54..3c6e5e8203992db475473e596715fd3193117fe9 100644 (file)
@@ -1,3 +1,7 @@
+2013-07-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
+
+       * gcc.target/arm/pr57637.c: New testcase.
+
 2013-07-29  Bill Schmidt  <wschmidt@vnet.linux.ibm.com>
 
        PR tree-optimization/57993
diff --git a/gcc/testsuite/gcc.target/arm/pr57637.c b/gcc/testsuite/gcc.target/arm/pr57637.c
new file mode 100644 (file)
index 0000000..2b9bfdd
--- /dev/null
@@ -0,0 +1,206 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-inline" } */
+
+typedef struct _GtkCssStyleProperty GtkCssStyleProperty;
+
+struct _GtkCssStyleProperty
+{
+  int *initial_value;
+  unsigned int id;
+  unsigned int inherit :1;
+  unsigned int animated :1;
+  unsigned int affects_size :1;
+  unsigned int affects_font :1;
+
+  int * parse_value;
+  int * query_value;
+  int * assign_value;
+};
+
+void
+g_assertion_message_expr (const char *domain,
+                         const char *file,
+                         int line,
+                         const char *func,
+                         const char *expr) __attribute__((__noreturn__));
+
+void
+g_assertion_message_expr (const char *domain,
+                         const char *file,
+                         int line,
+                         const char *func,
+                         const char *expr)
+{
+  __builtin_abort ();
+}
+int
+get_id (GtkCssStyleProperty *property)
+{
+  return 1;
+}
+int
+_gtk_css_style_property_get_type ()
+{
+  return 1;
+}
+
+GtkCssStyleProperty *
+g_object_new (int object_type,
+            const char *first_property_name,
+            ...)
+{
+  return (GtkCssStyleProperty *) __builtin_malloc (sizeof (GtkCssStyleProperty));
+}
+
+typedef enum {
+  INHERIT = (1 << 0),
+  ANIMATED = (1 << 1),
+  RESIZE = (1 << 2),
+  FONT = (1 << 3)
+} GtkStylePropertyFlags;
+
+int t = 0;
+void
+gtk_css_style_property_register (const char * name,
+                                int expected_id,
+                                int value_type,
+                                int flags,
+                                int *parse_value,
+                                int *query_value,
+                                int *assign_value,
+                                int *initial_value)
+{
+  GtkCssStyleProperty *node;
+
+  do
+    {
+      if (__builtin_expect (__extension__ (
+                                          {
+                                            int _g_boolean_var_;
+                                            if (initial_value != ((void *)0))
+                                              _g_boolean_var_ = 1;
+                                            else
+                                              _g_boolean_var_ = 0;
+                                            _g_boolean_var_;
+                                          }),
+                           1))
+       ;
+      else
+        g_assertion_message_expr ("Gtk",
+                                 "gtkcssstylepropertyimpl.c",
+                                 85,
+                                 ((const char*) (__PRETTY_FUNCTION__)),
+                                 "initial_value != NULL");
+    } while (0);
+
+  do
+    {
+      if (__builtin_expect (__extension__ (
+                                          {
+                                            int _g_boolean_var_;
+                                            if (parse_value != ((void *)0))
+                                              _g_boolean_var_ = 1;
+                                            else
+                                              _g_boolean_var_ = 0;
+                                            _g_boolean_var_;
+                                          }),
+                           1))
+       ;
+      else
+       g_assertion_message_expr ("Gtk",
+                                 "gtkcssstylepropertyimpl.c",
+                                 86,
+                                 ((const char*) (__PRETTY_FUNCTION__)),
+                                 "parse_value != NULL");
+    } while (0);
+
+  do
+    {
+      if (__builtin_expect (__extension__ (
+                                          {
+                                            int _g_boolean_var_;
+                                            if (value_type == ((int) ((1) << (2)))
+                                                || query_value != ((void *)0))
+                                              _g_boolean_var_ = 1;
+                                            else
+                                              _g_boolean_var_ = 0;
+                                            _g_boolean_var_;
+                                          }),
+                           1))
+       ;
+      else
+       g_assertion_message_expr ("Gtk",
+                                 "gtkcssstylepropertyimpl.c",
+                                 87, ((const char*) (__PRETTY_FUNCTION__)),
+                                 "value_type == NONE || query_value != NULL");
+    } while (0);
+
+  /* FLAGS is changed in a cond_exec instruction with pr57637.  */
+  if (flags  == 15)
+    t = 15;
+
+  do
+    {
+      if (__builtin_expect (__extension__ (
+                                          {
+                                            int _g_boolean_var_;
+                                            if (value_type == ((1) << (2))
+                                                || assign_value != ((void *)0))
+                                              _g_boolean_var_ = 1;
+                                            else
+                                              _g_boolean_var_ = 0;
+                                            _g_boolean_var_;
+                                          }),
+                           1))
+       ;
+      else
+       g_assertion_message_expr ("Gtk",
+                                 "gtkcssstylepropertyimpl.c",
+                                 88, ((const char*) (__PRETTY_FUNCTION__)),
+                                 "value_type == NONE || assign_value != NULL");
+    } while (0);
+
+  node = g_object_new ((_gtk_css_style_property_get_type ()),
+                       "value-type", value_type,
+                       "affects-size", (flags & RESIZE) ? (0) : (!(0)),
+                       "affects-font", (flags & FONT) ? (!(0)) : (0),
+                       "animated", (flags & ANIMATED) ? (!(0)) : (0),
+                       "inherit", (flags & INHERIT) ? (!(0)) : (0),
+                       "initial-value", initial_value,
+                       "name", name,
+                       ((void *)0));
+
+  node->parse_value = parse_value;
+  node->query_value = query_value;
+  node->assign_value = assign_value;
+
+  do
+    {
+      if (__builtin_expect (__extension__ (
+                                          {
+                                            int _g_boolean_var_;
+                                            if (get_id (node) == expected_id)
+                                              _g_boolean_var_ = 1;
+                                            else
+                                              _g_boolean_var_ = 0;
+                                            _g_boolean_var_;
+                                          }),
+                           1))
+       ;
+      else
+       g_assertion_message_expr ("Gtk",
+                                 "gtkcssstylepropertyimpl.c",
+                                 106,
+                                 ((const char*) (__PRETTY_FUNCTION__)),
+                                 "get_id (node) == expected_id");
+    } while (0);
+}
+
+int main ()
+{
+  gtk_css_style_property_register ("test", 1, 4, 15, &t, &t, &t, &t);
+
+  if (t != 15)
+    __builtin_abort ();
+  return 0;
+}