* Modified by: Goetz Lindenmaier, Michael Beck
* Created:
* CVS-ID: $Id$
- * Copyright: (c) 1998-2005 Universität Karlsruhe
+ * Copyright: (c) 1998-2006 Universität Karlsruhe
* Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
*/
* Return the value of a 'sizeof' or 'alignof' SymConst.
*/
static tarval *computed_value_SymConst(ir_node *n) {
- ir_type *type;
+ ir_type *type;
+ ir_entity *ent;
switch (get_SymConst_kind(n)) {
case symconst_type_size:
if (get_type_state(type) == layout_fixed)
return new_tarval_from_long(get_type_alignment_bytes(type), get_irn_mode(n));
break;
+ case symconst_ofs_ent:
+ ent = get_SymConst_entity(n);
+ type = get_entity_owner(ent);
+ if (get_type_state(type) == layout_fixed)
+ return new_tarval_from_long(get_entity_offset(ent), get_irn_mode(n));
+ break;
default:
break;
}
} /* computed_value_Proj_Cmp */
/**
- * Return the value of a Proj, handle Proj(Cmp), Proj(Div), Proj(Mod), Proj(DivMod).
+ * Return the value of a Proj, handle Proj(Cmp), Proj(Div), Proj(Mod),
+ * Proj(DivMod) and Proj(Quot).
*/
static tarval *computed_value_Proj(ir_node *n) {
ir_node *a = get_Proj_pred(n);
return computed_value(a);
break;
+ case iro_Quot:
+ if (get_Proj_proj(n) == pn_Quot_res)
+ return computed_value(a);
+ break;
+
default:
return tarval_bad;
}
* @return
* The operations.
*/
-static ir_op_ops *firm_set_default_computed_value(opcode code, ir_op_ops *ops)
+static ir_op_ops *firm_set_default_computed_value(ir_opcode code, ir_op_ops *ops)
{
#define CASE(a) \
case iro_##a: \
* @return
* The operations.
*/
-static ir_op_ops *firm_set_default_equivalent_node(opcode code, ir_op_ops *ops)
+static ir_op_ops *firm_set_default_equivalent_node(ir_opcode code, ir_op_ops *ops)
{
#define CASE(a) \
case iro_##a: \
irg = current_ir_graph;
for (i = 0; i < n; ++i) {
pred = get_irn_n(phi, i);
- res[i] = new_r_Const_type(irg, get_nodes_block(pred),
- mode, res[i], get_Const_type(pred));
+ res[i] = new_r_Const_type(irg, get_irg_start_block(irg),
+ mode, res[i], get_Const_type(pred));
}
return new_r_Phi(irg, get_nodes_block(phi), n, (ir_node **)res, mode);
} /* apply_binop_on_phi */
irg = current_ir_graph;
for (i = 0; i < n; ++i) {
pred = get_irn_n(phi, i);
- res[i] = new_r_Const_type(irg, get_nodes_block(pred),
- mode, res[i], get_Const_type(pred));
+ res[i] = new_r_Const_type(irg, get_irg_start_block(irg),
+ mode, res[i], get_Const_type(pred));
}
return new_r_Phi(irg, get_nodes_block(phi), n, (ir_node **)res, mode);
} /* apply_unop_on_phi */
if (mode_is_float(mode) && (get_irg_fp_model(current_ir_graph) & fp_strict_algebraic))
return n;
- if (mode_is_num(mode) && (classify_Const(a) == CNST_NULL)) {
+ /* Beware of Sub(P, P) which cannot be optimized into a simple Minus ... */
+ if (mode_is_num(mode) && mode == get_irn_mode(a) && (classify_Const(a) == CNST_NULL)) {
n = new_rd_Minus(
get_irn_dbg_info(n),
current_ir_graph,
* @return
* The operations.
*/
-static ir_op_ops *firm_set_default_transform_node(opcode code, ir_op_ops *ops)
+static ir_op_ops *firm_set_default_transform_node(ir_opcode code, ir_op_ops *ops)
{
#define CASE(a) \
case iro_##a: \
* @return
* The operations.
*/
-static ir_op_ops *firm_set_default_node_cmp_attr(opcode code, ir_op_ops *ops)
+static ir_op_ops *firm_set_default_node_cmp_attr(ir_opcode code, ir_op_ops *ops)
{
#define CASE(a) \
case iro_##a: \
/**
* Return the canonical node computing the same value as n.
+ *
+ * @param value_table The value table
+ * @param n The node to lookup
+ *
* Looks up the node in a hash table.
*
* For Const nodes this is performed in the constructor, too. Const
if (!is_Bad(get_irn_n(block, i)))
break;
}
- if (i == irn_arity) return new_Bad();
+ if (i == irn_arity) {
+ ir_graph *irg = get_irn_irg(block);
+ /* the start block is never dead */
+ if(block != get_irg_start_block(irg)
+ && block != get_irg_end_block(irg))
+ return new_Bad();
+ }
}
}
* It can only be called if it is guaranteed that no other nodes
* reference this one, i.e., right after construction of a node.
*
+ * @param n The node to optimize
+ *
* current_ir_graph must be set to the graph of the node!
*/
ir_node *optimize_node(ir_node *n)
{
tarval *tv;
ir_node *oldn = n;
- opcode iro = get_irn_opcode(n);
+ ir_opcode iro = get_irn_opcode(n);
/* Always optimize Phi nodes: part of the construction. */
if ((!get_opt_optimize()) && (iro != iro_Phi)) return n;
{
tarval *tv;
ir_node *oldn = n;
- opcode iro = get_irn_opcode(n);
+ ir_opcode iro = get_irn_opcode(n);
if (!get_opt_optimize() && (get_irn_op(n) != op_Phi)) return n;
/**
* Wrapper for external use, set proper status bits after optimization.
*/
-ir_node *optimize_in_place(ir_node *n)
-{
+ir_node *optimize_in_place(ir_node *n) {
/* Handle graph state */
assert(get_irg_phase_state(current_ir_graph) != phase_building);
/*
* Sets the default operation for an ir_ops.
*/
-ir_op_ops *firm_set_default_operations(opcode code, ir_op_ops *ops)
-{
+ir_op_ops *firm_set_default_operations(ir_opcode code, ir_op_ops *ops) {
ops = firm_set_default_computed_value(code, ops);
ops = firm_set_default_equivalent_node(code, ops);
ops = firm_set_default_transform_node(code, ops);