[jit] Remove the meaningless lokup loop in mono_merge_basic_blocks(), add assertions.
authorVladimir Kargov <kargov@gmail.com>
Thu, 29 Dec 2016 03:52:30 +0000 (19:52 -0800)
committerVladimir Kargov <kargov@gmail.com>
Wed, 4 Jan 2017 00:18:08 +0000 (16:18 -0800)
mono/mini/branch-opts.c

index 1602b03d59aae4ef6d211d82ce75bf61f80b17b6..d8f8f569377a44f0eb8dd6748e2d521b6e81cfc9 100644 (file)
@@ -973,15 +973,12 @@ mono_merge_basic_blocks (MonoCompile *cfg, MonoBasicBlock *bb, MonoBasicBlock *b
        MonoBasicBlock *prev_bb;
        int i;
 
+       /* There may be only one control flow edge between two BBs that we merge, and it should connect these BBs together. */
+       g_assert (bb->out_count == 1 && bbn->in_count == 1 && bb->out_bb [0] == bbn && bbn->in_bb [0] == bb);
+
        bb->has_array_access |= bbn->has_array_access;
        bb->extended |= bbn->extended;
 
-       /* Compute prev_bb if possible to avoid the linear search below */
-       prev_bb = NULL;
-       for (i = 0; i < bbn->in_count; ++i)
-               if (bbn->in_bb [0]->next_bb == bbn)
-                       prev_bb = bbn->in_bb [0];
-
        mono_unlink_bblock (cfg, bb, bbn);
        for (i = 0; i < bbn->out_count; ++i)
                mono_link_bblock (cfg, bb, bbn->out_bb [i]);
@@ -1034,10 +1031,14 @@ mono_merge_basic_blocks (MonoCompile *cfg, MonoBasicBlock *bb, MonoBasicBlock *b
                bb->last_ins = bbn->last_ins;
        }
 
-       if (!prev_bb) {
+
+       /* Check if the control flow predecessor is also the linear IL predecessor. */
+       if (bbn->in_bb [0]->next_bb == bbn)
+               prev_bb = bbn->in_bb [0];
+       else
+               /* If it isn't, look for one among all basic blocks. */
                for (prev_bb = cfg->bb_entry; prev_bb && prev_bb->next_bb != bbn; prev_bb = prev_bb->next_bb)
                        ;
-       }
        if (prev_bb) {
                prev_bb->next_bb = bbn->next_bb;
        } else {