-/*
- * branch-opts.c: Branch optimizations support
+/**
+ * \file
+ * Branch optimizations support
*
* Authors:
* Patrik Torstensson (Patrik.Torstesson at gmail.com)
* 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.
}
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) {
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]);
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 {
} while (changed && (niterations > 0));
}
-#endif /* DISABLE_JIT */
+#else /* !DISABLE_JIT */
+
+MONO_EMPTY_SOURCE_FILE (branch_opts);
+
+#endif /* !DISABLE_JIT */