+ ir_mode *m;
+
+ /* we are in danger iff an exception will arise. TODO: be more precisely,
+ * for instance Div. will NOT rise if divisor != 0
+ */
+ if (is_binop(n) && !is_fragile_op(n))
+ return is_irn_const_expression(get_binop_left(n)) && is_irn_const_expression(get_binop_right(n));
+
+ m = get_irn_mode(n);
+ switch (get_irn_opcode(n)) {
+ case iro_Const:
+ case iro_SymConst:
+ case iro_Unknown:
+ return 1;
+ case iro_Conv:
+ case iro_Cast:
+ return is_irn_const_expression(get_irn_n(n, 0));
+ default:
+ break;
+ }
+ return 0;
+} /* is_irn_const_expression */
+
+/*
+ * Copies a firm subgraph that complies to the restrictions for
+ * constant expressions to current_block in current_ir_graph.
+ */
+ir_node *copy_const_value(dbg_info *dbg, ir_node *n) {
+ ir_node *nn;
+ ir_mode *m;
+
+ /* @@@ GL I think we should implement this using the routines from irgopt for
+ dead node elimination/inlineing. */
+
+ m = get_irn_mode(n);
+ switch (get_irn_opcode(n)) {
+ case iro_Const:
+ nn = new_d_Const_type(dbg, m, get_Const_tarval(n), get_Const_type(n));
+ break;
+ case iro_SymConst:
+ nn = new_d_SymConst_type(dbg, get_irn_mode(n), get_SymConst_symbol(n), get_SymConst_kind(n),
+ get_SymConst_value_type(n));
+ break;
+ case iro_Add:
+ nn = new_d_Add(dbg, copy_const_value(dbg, get_Add_left(n)),
+ copy_const_value(dbg, get_Add_right(n)), m); break;
+ case iro_Sub:
+ nn = new_d_Sub(dbg, copy_const_value(dbg, get_Sub_left(n)),
+ copy_const_value(dbg, get_Sub_right(n)), m); break;
+ case iro_Mul:
+ nn = new_d_Mul(dbg, copy_const_value(dbg, get_Mul_left(n)),
+ copy_const_value(dbg, get_Mul_right(n)), m); break;
+ case iro_And:
+ nn = new_d_And(dbg, copy_const_value(dbg, get_And_left(n)),
+ copy_const_value(dbg, get_And_right(n)), m); break;
+ case iro_Or:
+ nn = new_d_Or(dbg, copy_const_value(dbg, get_Or_left(n)),
+ copy_const_value(dbg, get_Or_right(n)), m); break;
+ case iro_Eor:
+ nn = new_d_Eor(dbg, copy_const_value(dbg, get_Eor_left(n)),
+ copy_const_value(dbg, get_Eor_right(n)), m); break;
+ case iro_Cast:
+ nn = new_d_Cast(dbg, copy_const_value(dbg, get_Cast_op(n)), get_Cast_type(n)); break;
+ case iro_Conv:
+ nn = new_d_Conv(dbg, copy_const_value(dbg, get_Conv_op(n)), m); break;
+ case iro_Unknown:
+ nn = new_d_Unknown(m); break;
+ default:
+ assert(0 && "opcode invalid or not implemented");
+ nn = NULL;
+ break;
+ }
+ return nn;
+} /* copy_const_value */
+
+static ir_initializer_t null_initializer = { IR_INITIALIZER_NULL };
+
+ir_initializer_t *get_initializer_null(void)
+{
+ return &null_initializer;