use tv_t.h instead of tv.h
[libfirm] / ir / ana / irsimpletype.c
index 6a58d3a..172eaec 100644 (file)
@@ -46,7 +46,7 @@ void precompute_pointer_types(void) {
     set_type_link(get_irp_type(i), (void *)firm_unknown_type);
   for (i = get_irp_n_types()-1; i>=0; --i) {
     type *tp = get_irp_type(i);
-    if (is_pointer_type(tp))
+    if (is_Pointer_type(tp))
       set_type_link(get_pointer_points_to_type(tp), (void *)tp);
   }
 }
@@ -153,8 +153,8 @@ static type *find_type_for_node(ir_node *n) {
       type *ana_res_type = get_irn_type(get_Return_res(n, i));
       if (ana_res_type == firm_unknown_type) continue;
       if (res_type != ana_res_type && "return value has wrong type") {
-    DDMN(n);
-    assert(res_type == ana_res_type && "return value has wrong type");
+        DDMN(n);
+        assert(res_type == ana_res_type && "return value has wrong type");
       }
     }
     */
@@ -172,6 +172,7 @@ static type *find_type_for_node(ir_node *n) {
   case iro_Sync:
   case iro_Tuple:
   case iro_Bad:
+  case iro_NoMem:
   case iro_Break:
   case iro_CallBegin:
   case iro_EndReg:
@@ -184,7 +185,7 @@ static type *find_type_for_node(ir_node *n) {
     tp = get_SymConst_value_type(n); break;
   case iro_Sel:
     tp = find_pointer_type_to(get_entity_type(get_Sel_entity(n))); break;
-  /* assymetric binops */
+  /* asymmetric binops */
   case iro_Shl:
   case iro_Shr:
   case iro_Shrs:
@@ -206,7 +207,7 @@ static type *find_type_for_node(ir_node *n) {
       tp1 = compute_irn_type(get_Phi_pred(n, i));
       assert(tp1 != initial_type);
       if ((tp1 != phi_cycle_type) && (tp1 != firm_none_type))
-    break;
+        break;
     }
 
     /* find a second real type */
@@ -214,8 +215,8 @@ static type *find_type_for_node(ir_node *n) {
     for (; (i < n_preds); ++i) {
       tp2 = compute_irn_type(get_Phi_pred(n, i));
       if ((tp2 == phi_cycle_type) || (tp2 == firm_none_type)) {
-    tp2 = tp1;
-    continue;
+        tp2 = tp1;
+        continue;
       }
       if (tp2 != tp1) break;
     }
@@ -224,17 +225,19 @@ static type *find_type_for_node(ir_node *n) {
 
     if (tp1 == tp2) { tp = tp1; break; }
 
-    VERBOSE_UNKNOWN_TYPE(("Phi %ld with two different types: %s, %s: unknown type.\n", get_irn_node_nr(n),
-              get_type_name(tp1), get_type_name(tp2)));
-    tp = firm_unknown_type;
+    if (get_firm_verbosity() > 1) {
+      VERBOSE_UNKNOWN_TYPE(("Phi %ld with two different types: %s, %s: unknown type.\n", get_irn_node_nr(n),
+                           get_type_name(tp1), get_type_name(tp2)));
+    }
+    tp = firm_unknown_type;   /* Test for supertypes? */
   } break;
   case iro_Load: {
     ir_node *a = get_Load_ptr(n);
     if (get_irn_op(a) == op_Sel)
       tp = get_entity_type(get_Sel_entity(a));
-    else if (is_pointer_type(compute_irn_type(a))) {
+    else if (is_Pointer_type(compute_irn_type(a))) {
       tp = get_pointer_points_to_type(get_irn_typeinfo_type(a));
-      if (is_array_type(tp)) tp = get_array_element_type(tp);
+      if (is_Array_type(tp)) tp = get_array_element_type(tp);
     } else {
       VERBOSE_UNKNOWN_TYPE(("Load %ld with typeless address. result: unknown type\n", get_irn_node_nr(n)));
       tp = firm_unknown_type;
@@ -267,8 +270,8 @@ static type *find_type_for_node(ir_node *n) {
       tp = tp1; break;
     }
     if (mode_is_reference(get_irn_mode(n)) &&
-    mode_is_int(get_irn_mode(a))       &&
-    mode_is_reference(get_irn_mode(b))    ) {
+       mode_is_int(get_irn_mode(a))       &&
+       mode_is_reference(get_irn_mode(b))    ) {
       tp = tp2; break;
     }
     goto default_code;
@@ -280,6 +283,16 @@ static type *find_type_for_node(ir_node *n) {
     }
     goto default_code;
   } break;
+  case iro_Mux: {
+    a = get_Mux_true(n);
+    b = get_Mux_false(n);
+    tp1 = compute_irn_type(a);
+    tp2 = compute_irn_type(b);
+    if (tp1 == tp2)
+      tp = tp1;
+    else
+      tp = firm_unknown_type;
+  } break;
 
   default:
   default_code: {
@@ -292,15 +305,17 @@ static type *find_type_for_node(ir_node *n) {
 
     if (is_binop(n)) {
       if (tp1 == tp2) {
-       tp = tp1;
-       break;
+             tp = tp1;
+             break;
       }
       if((tp1 == phi_cycle_type) || (tp2 == phi_cycle_type)) {
-       tp = phi_cycle_type;
-       break;
+             tp = phi_cycle_type;
+             break;
+      }
+      if (get_firm_verbosity() > 1) {
+       VERBOSE_UNKNOWN_TYPE(("Binop %ld with two different types: %s, %s: unknown type \n", get_irn_node_nr(n),
+                             get_type_name(tp1), get_type_name(tp2)));
       }
-      VERBOSE_UNKNOWN_TYPE(("Binop %ld with two different types: %s, %s: unknown type \n", get_irn_node_nr(n),
-                           get_type_name(tp1), get_type_name(tp2)));
       tp = firm_unknown_type;
       break;
     }
@@ -340,7 +355,7 @@ static void compute_type(ir_node *n, void *env) {
 }
 
 static void analyse_irg (ir_graph *irg) {
-  set_irg_typeinfo_state(irg, irg_typeinfo_consistent);
+  set_irg_typeinfo_state(irg, ir_typeinfo_consistent);
   irg_walk_graph(irg, NULL, compute_type, NULL);
 }
 
@@ -358,6 +373,7 @@ void simple_analyse_types(void) {
     current_ir_graph = get_irp_irg(i);
     analyse_irg(current_ir_graph);
   }
+  set_irp_typeinfo_state(ir_typeinfo_consistent);
 }
 
 void free_simple_type_information(void) {
@@ -367,4 +383,5 @@ void free_simple_type_information(void) {
     free_type(phi_cycle_type);
     phi_cycle_type = NULL;
   }
+  set_irp_typeinfo_state(ir_typeinfo_none);
 }