keeps behind a series of phis are fine
authorMatthias Braun <matze@braunis.de>
Wed, 2 Mar 2011 09:56:31 +0000 (10:56 +0100)
committerMatthias Braun <matze@braunis.de>
Fri, 4 Mar 2011 13:17:11 +0000 (14:17 +0100)
ir/be/beverify.c

index a443aea..95630b1 100644 (file)
@@ -254,21 +254,28 @@ static void verify_schedule_walker(ir_node *block, void *data)
                }
 
                if (be_is_Keep(node) || be_is_CopyKeep(node)) {
-                       /* at least 1 of the keep arguments has to be it schedule
+                       /* at least 1 of the keep arguments has to be its schedule
                         * predecessor */
                        int      arity   = get_irn_arity(node);
-                       int      problem = 1;
+                       bool     found   = false;
                        ir_node *prev    = sched_prev(node);
                        while (be_is_Keep(prev) || be_is_CopyKeep(prev))
                                prev = sched_prev(prev);
 
-                       for (i = 0; i < arity; ++i) {
-                               ir_node *in = get_irn_n(node, i);
-                               in = skip_Proj(in);
-                               if (in == prev)
-                                       problem = 0;
+                       while (true) {
+                               for (i = 0; i < arity; ++i) {
+                                       ir_node *in = get_irn_n(node, i);
+                                       in = skip_Proj(in);
+                                       if (in == prev)
+                                               found = true;
+                               }
+                               if (found)
+                                       break;
+                               prev = sched_prev(prev);
+                               if (!is_Phi(prev))
+                                       break;
                        }
-                       if (problem) {
+                       if (!found) {
                                ir_fprintf(stderr, "%+F not scheduled after its pred node in block %+F (%s)\n",
                                           node, block, get_irg_dump_name(env->irg));
                                env->problem_found = 1;