Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / branch-opts.c
index ca8289b81c8313619b3f5c3e5fec193c4a503298..0dab1240f8637cd2ac334e2b881124aeb441ca83 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * branch-opts.c: Branch optimizations support 
+/**
+ * \file
+ * Branch optimizations support
  *
  * Authors:
  *   Patrik Torstensson (Patrik.Torstesson at gmail.com)
@@ -8,10 +9,12 @@
  * Copyright 2011 Xamarin Inc.  http://www.xamarin.com
  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
- #include "mini.h"
 
+#include "config.h"
+#include <mono/utils/mono-compiler.h>
 #ifndef DISABLE_JIT
+
+#include "mini.h"
 
 /*
  * Returns true if @bb is a basic block which falls through the next block.
@@ -209,9 +212,11 @@ mono_replace_ins (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *ins, MonoInst
 
                /* Multiple BBs */
 
-               /* Set region */
-               for (tmp = first_bb; tmp; tmp = tmp->next_bb)
+               /* Set region/real_offset */
+               for (tmp = first_bb; tmp; tmp = tmp->next_bb) {
                        tmp->region = bb->region;
+                       tmp->real_offset = bb->real_offset;
+               }
 
                /* Split the original bb */
                if (ins->next)
@@ -814,17 +819,9 @@ replace_in_block (MonoBasicBlock *bb, MonoBasicBlock *orig, MonoBasicBlock *repl
 }
 
 static void
-replace_out_block_in_code (MonoBasicBlock *bb, MonoBasicBlock *orig, MonoBasicBlock *repl) {
+replace_out_block_in_code (MonoBasicBlock *bb, MonoBasicBlock *orig, MonoBasicBlock *repl)
+{
        MonoInst *ins;
-
-#if defined(__native_client_codegen__)
-       /* Need to maintain this flag for the new block because */
-       /* we can't jump indirectly to a non-aligned block.     */
-       if (orig->flags & BB_INDIRECT_JUMP_TARGET)
-       {
-               repl->flags |= BB_INDIRECT_JUMP_TARGET;
-       }
-#endif
        
        for (ins = bb->code; ins != NULL; ins = ins->next) {
                switch (ins->opcode) {
@@ -969,15 +966,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]);
@@ -1030,10 +1024,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 {
@@ -1476,4 +1474,8 @@ mono_optimize_branches (MonoCompile *cfg)
        } while (changed && (niterations > 0));
 }
 
-#endif /* DISABLE_JIT */
+#else /* !DISABLE_JIT */
+
+MONO_EMPTY_SOURCE_FILE (branch_opts);
+
+#endif /* !DISABLE_JIT */