libfirm doesn't allow Conv Is(xx b) anymore
authorMatthias Braun <matze@braunis.de>
Mon, 7 Nov 2011 12:34:28 +0000 (13:34 +0100)
committerMatthias Braun <matze@braunis.de>
Mon, 7 Nov 2011 12:35:38 +0000 (13:35 +0100)
ast2firm.c
libfirm

index a24c47a..71172df 100644 (file)
@@ -1072,6 +1072,37 @@ static ir_node *create_symconst(dbg_info *dbgi, ir_entity *entity)
        return new_d_SymConst(dbgi, mode_P, sym, symconst_addr_ent);
 }
 
+static ir_node *create_conv_from_b(dbg_info *dbgi, ir_node *value,
+                                   ir_mode *dest_mode)
+{
+       if (is_Const(value)) {
+               if (is_Const_null(value)) {
+                       return new_Const(get_mode_null(dest_mode));
+               } else {
+                       return new_Const(get_mode_one(dest_mode));
+               }
+       }
+
+       ir_node *cond       = new_d_Cond(dbgi, value);
+       ir_node *proj_true  = new_Proj(cond, mode_X, pn_Cond_true);
+       ir_node *proj_false = new_Proj(cond, mode_X, pn_Cond_false);
+       ir_node *tblock     = new_Block(1, &proj_true);
+       ir_node *fblock     = new_Block(1, &proj_false);
+       set_cur_block(tblock);
+       ir_node *const1 = new_Const(get_mode_one(dest_mode));
+       ir_node *tjump  = new_Jmp();
+       set_cur_block(fblock);
+       ir_node *const0 = new_Const(get_mode_null(dest_mode));
+       ir_node *fjump  = new_Jmp();
+
+       ir_node *in[2]      = { tjump, fjump };
+       ir_node *mergeblock = new_Block(2, in);
+       set_cur_block(mergeblock);
+       ir_node *phi_in[2]  = { const1, const0 };
+       ir_node *phi        = new_Phi(2, phi_in, dest_mode);
+       return phi;
+}
+
 static ir_node *create_conv(dbg_info *dbgi, ir_node *value, ir_mode *dest_mode)
 {
        ir_mode *value_mode = get_irn_mode(value);
@@ -1083,6 +1114,8 @@ static ir_node *create_conv(dbg_info *dbgi, ir_node *value, ir_mode *dest_mode)
                ir_node *zero = new_Const(get_mode_null(value_mode));
                ir_node *cmp  = new_d_Cmp(dbgi, value, zero, ir_relation_less_greater);
                return cmp;
+       } else if (value_mode == mode_b) {
+               return create_conv_from_b(dbgi, value, dest_mode);
        }
 
        return new_d_Conv(dbgi, value, dest_mode);
diff --git a/libfirm b/libfirm
index c89b93d..ab4e272 160000 (submodule)
--- a/libfirm
+++ b/libfirm
@@ -1 +1 @@
-Subproject commit c89b93d876b3285ee0c3d871fbfb00b431b0de45
+Subproject commit ab4e27261cf300c01cae065f4d48f54e664da8f1