X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Freassoc.c;h=b7cfe70133f5ff43bb3b55ce015ca5f4afc0d007;hb=f1a1a6092d9e4ebd9e22dd1c57d76ef8aeda74fc;hp=8f12a135127dcbd791f836aee9ae863a4c9203c4;hpb=c3dc0fd520c65b7aa0760ef1a49c87415d362de1;p=libfirm diff --git a/ir/opt/reassoc.c b/ir/opt/reassoc.c index 8f12a1351..b7cfe7013 100644 --- a/ir/opt/reassoc.c +++ b/ir/opt/reassoc.c @@ -56,7 +56,12 @@ static const_class_t get_const_class(ir_node *n, ir_node *block) return REAL_CONSTANT; if (op == op_SymConst) return CONST_EXPR; - if (is_loop_invariant(n, block)) + + /* + * Beware: Bad nodes are always loop-invariant, but + * cannot handled in later code, so filter them here + */ + if (! is_Bad(n) && is_loop_invariant(n, block)) return CONST_EXPR; return NO_CONSTANT; @@ -324,7 +329,7 @@ static void do_reassociation(ir_node *n, void *env) hook_reassociate(1); - /* Reassociation must run until a fixpoint is reached. */ + /* reassociation must run until a fixpoint is reached. */ do { ir_op *op = get_irn_op(n); ir_mode *mode = get_irn_mode(n); @@ -351,6 +356,8 @@ void optimize_reassociation(ir_graph *irg) irg_loopinfo_state state; assert(get_irg_phase_state(irg) != phase_building); + assert(get_irg_pinned(irg) != op_pin_state_floats && + "Reassociation needs pinned graph to work properly"); /* reassociation needs constant folding */ if (!get_opt_reassociation() || !get_opt_constant_folding())