On 07/31/2015 03:25 AM, Thomas Preud'homme wrote:
Hi,

Since commit r223113, loop-invariant pass rely on luids to determine if an 
invariant can be hoisted out of a loop without introducing temporaries. 
However, nothing is made to ensure luids are up-to-date. This patch adds a 
DF_LIVE problem and mark all blocks as dirty before using luids to ensure these 
will be recomputed.

ChangeLog entries are as follows:


2015-07-31  Thomas Preud'homme  <thomas.preudho...@arm.com>

         PR tree-optimization/67043
         * loop-invariant.c (find_defs): Force recomputation of all luids.


2015-07-29  Thomas Preud'homme  <thomas.preudho...@arm.com>

         PR tree-optimization/67043
         * gcc.dg/pr67043.c: New test.

Note: the testcase was heavily reduced from the Linux kernel sources by Markus 
Trippelsdorf and formatted to follow GNU code style.


diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c
index 1fdb84d..fc53e09 100644
--- a/gcc/loop-invariant.c
+++ b/gcc/loop-invariant.c
@@ -676,6 +676,8 @@ find_defs (struct loop *loop)
    df_remove_problem (df_chain);
    df_process_deferred_rescans ();
    df_chain_add_problem (DF_UD_CHAIN);
+  df_live_add_problem ();
+  df_live_set_all_dirty ();
    df_set_flags (DF_RD_PRUNE_DEAD_DEFS);
    df_analyze_loop (loop);
    check_invariant_table_size ();
diff --git a/gcc/testsuite/gcc.dg/pr67043.c b/gcc/testsuite/gcc.dg/pr67043.c
new file mode 100644
index 0000000..36aa686
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr67043.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fcompare-debug -w" } */
+
+extern void rt_mutex_owner (void);
+extern void rt_mutex_deadlock_account_lock (int);
+extern void signal_pending (void);
+__typeof__ (int *) a;
+int b;
+
+int
+try_to_take_rt_mutex (int p1) {
+  rt_mutex_owner ();
+  if (b)
+    return 0;
+  rt_mutex_deadlock_account_lock (p1);
+  return 1;
+}
+
+void
+__rt_mutex_slowlock (int p1) {
+  int c;
+  for (;;) {
+    c = ({
+      asm ("" : "=r"(a));
+      a;
+    });
+    if (try_to_take_rt_mutex (c))
+      break;
+    if (__builtin_expect (p1 == 0, 0))
+      signal_pending ();
+  }
+}


Patch was tested by running the testsuite against a bootstrapped native 
x86_64-linux-gnu GCC and against an arm-none-eabi GCC cross-compiler without 
any regression.

Is this ok for trunk?
So if we're relying on LUIDs, don't they get out-of-date each time we move an invariant? Or is there some call back into the DF routines after we move an invariant to fix the LUIDs?


jeff

Reply via email to