* Patrik Torstensson (Patrik.Torstesson at gmail.com)
*
* (C) 2005 Ximian, Inc. http://www.ximian.com
+ * Copyright 2011 Xamarin Inc. http://www.xamarin.com
*/
#include "mini.h"
MonoInst *
mono_branch_optimize_exception_target (MonoCompile *cfg, MonoBasicBlock *bb, const char * exname)
{
- MonoMethod *method = cfg->method;
- MonoMethodHeader *header = mono_method_get_header (method);
+ MonoMethodHeader *header = cfg->header;
MonoExceptionClause *clause;
MonoClass *exclass;
int i;
return jump;
}
+ return NULL;
+ } else {
+ /* Branching to an outer clause could skip inner clauses */
return NULL;
}
} else {
OP_CMOV_LGT_UN
};
-static int
+static G_GNUC_UNUSED int
br_to_br_un (int opcode)
{
switch (opcode) {
if (cfg->ret && ins1->dreg == cfg->ret->dreg)
continue;
+ if (!(cfg->opt & MONO_OPT_DEADCE))
+ /*
+ * It is possible that dreg is never set before, so we can't use
+ * it as an sreg of the cmov instruction (#582322).
+ */
+ continue;
+
if (cfg->verbose_level > 2) {
printf ("\tBranch -> CMove optimization (2) in BB%d on\n", bb->block_num);
printf ("\t\t"); mono_print_ins (compare);
mono_handle_global_vregs (cfg);
if (cfg->opt & (MONO_OPT_CONSPROP | MONO_OPT_COPYPROP))
mono_local_cprop (cfg);
- mono_local_deadce (cfg);
+ if (cfg->opt & MONO_OPT_DEADCE)
+ mono_local_deadce (cfg);
}
#endif
}
static void
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) {
/* the block are in sequence anyway ... */
/* branches to the following block can be removed */
- if (bb->last_ins && bb->last_ins->opcode == OP_BR) {
+ if (bb->last_ins && bb->last_ins->opcode == OP_BR && !bbn->out_of_line) {
bb->last_ins->opcode = OP_NOP;
changed = TRUE;
if (cfg->verbose_level > 2)
}
if (bb->last_ins && MONO_IS_COND_BRANCH_NOFP (bb->last_ins)) {
- if (bb->last_ins->inst_false_bb && bb->last_ins->inst_false_bb->out_of_line && (bb->region == bb->last_ins->inst_false_bb->region)) {
+ if (bb->last_ins->inst_false_bb && bb->last_ins->inst_false_bb->out_of_line && (bb->region == bb->last_ins->inst_false_bb->region) && !cfg->disable_out_of_line_bblocks) {
/* Reverse the branch */
bb->last_ins->opcode = mono_reverse_branch_op (bb->last_ins->opcode);
bbn = bb->last_ins->inst_false_bb;