return tarval_bad;
} /* computed_value_Mux */
-/**
- * Calculate the value of a Psi: can be evaluated, if a condition is true
- * and all previous conditions are false. If all conditions are false
- * we evaluate to the default one.
- */
-static tarval *computed_value_Psi(const ir_node *n) {
- if (is_Mux(n))
- return computed_value_Mux(n);
- return tarval_bad;
-} /* computed_value_Psi */
-
/**
* Calculate the value of a Confirm: can be evaluated,
* if it has the form Confirm(x, '=', Const).
* the Cmp result.
*/
else {
- ir_node *aaa = skip_Id(skip_Proj(aa));
- ir_node *aba = skip_Id(skip_Proj(ab));
+ ir_node *aaa = skip_Proj(aa);
+ ir_node *aba = skip_Proj(ab);
if ( ( (/* aa is ProjP and aaa is Alloc */
is_Proj(aa)
&& mode_is_reference(get_irn_mode(aa))
&& is_Alloc(aaa))
&& ( (/* ab is NULL */
- is_Const(ab)
- && mode_is_reference(get_irn_mode(ab))
- && is_Const_null(ab))
+ mode_is_reference(get_irn_mode(ab))
+ && tarval_is_null(tab))
|| (/* ab is other Alloc */
is_Proj(ab)
&& mode_is_reference(get_irn_mode(ab))
&& is_Alloc(aba)
&& (aaa != aba))))
|| (/* aa is NULL and aba is Alloc */
- is_Const(aa)
- && mode_is_reference(get_irn_mode(aa))
- && is_Const_null(aa)
+ mode_is_reference(get_irn_mode(aa))
+ && tarval_is_null(taa)
&& is_Proj(ab)
&& mode_is_reference(get_irn_mode(ab))
&& is_Alloc(aba)))
/* 3.: */
- return new_tarval_from_long(proj_nr & pn_Cmp_Ne, mode_b);
+ return new_tarval_from_long(proj_nr & pn_Cmp_Lg, mode_b);
}
}
return computed_value_Cmp_Confirm(a, aa, ab, proj_nr);
CASE(Rotl);
CASE(Conv);
CASE(Mux);
- CASE(Psi);
CASE(Confirm);
CASE_PROJ(Cmp);
CASE_PROJ(DivMod);
goto restart;
}
/* else both are strict conv, second is superfluous */
- } else if (is_Proj(a)) {
- ir_node *pred = get_Proj_pred(a);
- if (is_Load(pred)) {
- /* loads always return with the exact precision of n_mode */
- assert(get_Load_mode(pred) == n_mode);
- return a;
+ } else {
+ if (is_Proj(a)) {
+ ir_node *pred = get_Proj_pred(a);
+ if (is_Load(pred)) {
+ /* loads always return with the exact precision of n_mode */
+ assert(get_Load_mode(pred) == n_mode);
+ return a;
+ }
}
+ /* leave strict floating point Conv's */
+ return n;
}
-
- /* leave strict floating point Conv's */
- return n;
}
n = a;
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_CONV);
}
}
}
- if (mode_is_int(n_mode) && mode_is_float(a_mode)) {
+ if (mode_is_int(n_mode) && get_mode_arithmetic(a_mode) == irma_ieee754) {
/* ConvI(ConvF(I)) -> I, iff float mantissa >= int mode */
- size_t int_mantissa = get_mode_size_bits(n_mode) - (mode_is_signed(n_mode) ? 1 : 0);
- size_t float_mantissa;
- /* FIXME There is no way to get the mantissa size of a mode */
- switch (get_mode_size_bits(a_mode)) {
- case 32: float_mantissa = 23 + 1; break; // + 1 for implicit 1
- case 64: float_mantissa = 52 + 1; break;
- case 80: float_mantissa = 64 + 1; break;
- default: float_mantissa = 0; break;
- }
- if (float_mantissa != 0 && float_mantissa >= int_mantissa) {
+ unsigned int_mantissa = get_mode_size_bits(n_mode) - (mode_is_signed(n_mode) ? 1 : 0);
+ unsigned float_mantissa = tarval_ieee754_get_mantissa_size(a_mode);
+
+ if (float_mantissa >= int_mantissa) {
n = b;
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_CONV);
return n;
switch (proj_nr) {
case pn_Cmp_Eq:
- if ((cmp_l == t && cmp_r == f) || /* Psi(t == f, t, f) -> f */
- (cmp_l == f && cmp_r == t)) { /* Psi(f == t, t, f) -> f */
+ if ((cmp_l == t && cmp_r == f) || /* Mux(t == f, t, f) -> f */
+ (cmp_l == f && cmp_r == t)) { /* Mux(f == t, t, f) -> f */
n = f;
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_MUX_TRANSFORM);
return n;
case pn_Cmp_Lg:
case pn_Cmp_Ne:
- if ((cmp_l == t && cmp_r == f) || /* Psi(t != f, t, f) -> t */
- (cmp_l == f && cmp_r == t)) { /* Psi(f != t, t, f) -> t */
+ if ((cmp_l == t && cmp_r == f) || /* Mux(t != f, t, f) -> t */
+ (cmp_l == f && cmp_r == t)) { /* Mux(f != t, t, f) -> t */
n = t;
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_MUX_TRANSFORM);
return n;
return n;
} /* equivalent_node_Mux */
-/**
- * Returns a equivalent node of a Psi: if a condition is true
- * and all previous conditions are false we know its value.
- * If all conditions are false its value is the default one.
- */
-static ir_node *equivalent_node_Psi(ir_node *n) {
- if (is_Mux(n))
- return equivalent_node_Mux(n);
- return n;
-} /* equivalent_node_Psi */
-
/**
* Remove Confirm nodes if setting is on.
* Replace Confirms(x, '=', Constlike) by Constlike.
CASE(Proj);
CASE(Id);
CASE(Mux);
- CASE(Psi);
CASE(Confirm);
default:
/* leave NULL */;
if (! is_Phi(n) || get_irn_arity(n) == 0)
return 0;
- for (i = get_irn_arity(n) - 1; i >= 0; --i)
+ for (i = get_irn_arity(n) - 1; i >= 0; --i) {
if (! is_Const(get_irn_n(n, i)))
return 0;
- return 1;
+ }
+ return 1;
} /* is_const_Phi */
typedef tarval *(*tarval_sub_type)(tarval *a, tarval *b, ir_mode *mode);
n = new_rd_Sub(
get_irn_dbg_info(n),
current_ir_graph,
- get_irn_n(n, -1),
+ get_nodes_block(n),
b,
get_Minus_op(a),
mode);
n = new_rd_Sub(
get_irn_dbg_info(n),
current_ir_graph,
- get_irn_n(n, -1),
+ get_nodes_block(n),
a,
get_Minus_op(b),
mode);
if (is_Const(b) && is_Const_one(b)) {
/* ~x + 1 = -x */
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, blk, op, mode);
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_NOT_PLUS_1);
return n;
}
if (op == b) {
/* ~x + x = -1 */
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_r_Const(current_ir_graph, blk, mode, get_mode_minus_one(mode));
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_ADD_X_NOT_X);
return n;
if (op == a) {
/* x + ~x = -1 */
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_r_Const(current_ir_graph, blk, mode, get_mode_minus_one(mode));
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_ADD_X_NOT_X);
return n;
if (is_Const(b) && is_Const_null(b) && mode_is_reference(lmode)) {
/* a Sub(a, NULL) is a hidden Conv */
dbg_info *dbg = get_irn_dbg_info(n);
- return new_rd_Conv(dbg, current_ir_graph, get_nodes_block(n), a, mode);
+ n = new_rd_Conv(dbg, current_ir_graph, get_nodes_block(n), a, mode);
+ DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_TO_CONV);
+ return n;
+ }
+
+ if (mode == lmode &&
+ get_mode_arithmetic(mode) == irma_twos_complement &&
+ is_Const(a) &&
+ get_Const_tarval(a) == get_mode_minus_one(mode)) {
+ /* -1 - x -> ~x */
+ dbg_info *dbg = get_irn_dbg_info(n);
+ n = new_rd_Not(dbg, current_ir_graph, get_nodes_block(n), b, mode);
+ DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_TO_NOT);
+ return n;
}
}
n = new_rd_Add(dbg, irg, block, a, right, mode);
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_MINUS);
return n;
- } else if (is_Sub(b)) { /* a - (b - c) -> a + (c - b) */
+ } else if (is_Sub(b)) {
+ /* a - (b - c) -> a + (c - b)
+ * -> (a - b) + c iff (b - c) is a pointer */
ir_graph *irg = current_ir_graph;
dbg_info *s_dbg = get_irn_dbg_info(b);
ir_node *s_block = get_nodes_block(b);
- ir_node *s_left = get_Sub_right(b);
- ir_node *s_right = get_Sub_left(b);
+ ir_node *s_left = get_Sub_left(b);
+ ir_node *s_right = get_Sub_right(b);
ir_mode *s_mode = get_irn_mode(b);
- ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, s_left, s_right, s_mode);
- dbg_info *a_dbg = get_irn_dbg_info(n);
- ir_node *a_block = get_nodes_block(n);
+ if (s_mode == mode_P) {
+ ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, a, s_left, mode);
+ dbg_info *a_dbg = get_irn_dbg_info(n);
+ ir_node *a_block = get_nodes_block(n);
+
+ if (s_mode != mode)
+ s_right = new_r_Conv(irg, a_block, s_right, mode);
+ n = new_rd_Add(a_dbg, irg, a_block, sub, s_right, mode);
+ } else {
+ ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, s_right, s_left, s_mode);
+ dbg_info *a_dbg = get_irn_dbg_info(n);
+ ir_node *a_block = get_nodes_block(n);
- n = new_rd_Add(a_dbg, irg, a_block, a, sub, mode);
+ n = new_rd_Add(a_dbg, irg, a_block, a, sub, mode);
+ }
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_TO_ADD);
return n;
} else if (is_Mul(b)) { /* a - (b * C) -> a + (b * -C) */
n = new_rd_Minus(
get_irn_dbg_info(n),
current_ir_graph,
- get_irn_n(n, -1),
+ get_nodes_block(n),
b,
mode);
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_0_A);
if (left == b) {
if (mode != get_irn_mode(right)) {
/* This Sub is an effective Cast */
- right = new_r_Conv(get_irn_irg(n), get_irn_n(n, -1), right, mode);
+ right = new_r_Conv(get_irn_irg(n), get_nodes_block(n), right, mode);
}
n = right;
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_ADD_SUB);
} else if (right == b) {
if (mode != get_irn_mode(left)) {
/* This Sub is an effective Cast */
- left = new_r_Conv(get_irn_irg(n), get_irn_n(n, -1), left, mode);
+ left = new_r_Conv(get_irn_irg(n), get_nodes_block(n), left, mode);
}
n = left;
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_ADD_SUB);
if (left == a) {
ir_mode *r_mode = get_irn_mode(right);
- n = new_r_Minus(get_irn_irg(n), get_irn_n(n, -1), right, r_mode);
+ n = new_r_Minus(get_irn_irg(n), get_nodes_block(n), right, r_mode);
if (mode != r_mode) {
/* This Sub is an effective Cast */
- n = new_r_Conv(get_irn_irg(n), get_irn_n(n, -1), n, mode);
+ n = new_r_Conv(get_irn_irg(n), get_nodes_block(n), n, mode);
}
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_ADD_SUB);
return n;
} else if (right == a) {
ir_mode *l_mode = get_irn_mode(left);
- n = new_r_Minus(get_irn_irg(n), get_irn_n(n, -1), left, l_mode);
+ n = new_r_Minus(get_irn_irg(n), get_nodes_block(n), left, l_mode);
if (mode != l_mode) {
/* This Sub is an effective Cast */
- n = new_r_Conv(get_irn_irg(n), get_irn_n(n, -1), n, mode);
+ n = new_r_Conv(get_irn_irg(n), get_nodes_block(n), n, mode);
}
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_ADD_SUB);
return n;
ir_node *mb = get_Mul_right(a);
if (ma == b) {
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_rd_Mul(
get_irn_dbg_info(n),
current_ir_graph, blk,
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_MUL_A_X_A);
return n;
} else if (mb == b) {
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_rd_Mul(
get_irn_dbg_info(n),
current_ir_graph, blk,
if (is_Sub(a)) { /* (x - y) - b -> x - (y + b) */
ir_node *x = get_Sub_left(a);
ir_node *y = get_Sub_right(a);
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
ir_mode *m_b = get_irn_mode(b);
ir_mode *m_y = get_irn_mode(y);
ir_mode *add_mode;
tv = tarval_add(tv, get_mode_one(mode));
if (tv != tarval_bad) {
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
ir_node *c = new_r_Const(current_ir_graph, blk, mode, tv);
n = new_rd_Add(get_irn_dbg_info(n), current_ir_graph, blk, get_Not_op(b), c, mode);
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_C_NOT_X);
if (ta == get_mode_one(smode)) {
/* (L)1 * (L)b = (L)b */
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_rd_Conv(get_irn_dbg_info(n), current_ir_graph, blk, b, mode);
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_NEUTRAL_1);
return n;
}
else if (ta == get_mode_minus_one(smode)) {
/* (L)-1 * (L)b = (L)b */
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, blk, b, smode);
n = new_rd_Conv(get_irn_dbg_info(n), current_ir_graph, blk, n, mode);
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_MUL_MINUS_1);
}
else if (tb == get_mode_minus_one(smode)) {
/* (L)a * (L)-1 = (L)-a */
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, blk, a, smode);
n = new_rd_Conv(get_irn_dbg_info(n), current_ir_graph, blk, n, mode);
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_MUL_MINUS_1);
else if (value_of(b) == get_mode_minus_one(mode))
r = a;
if (r) {
- n = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, get_irn_n(n, -1), r, mode);
+ n = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), r, mode);
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_MUL_MINUS_1);
return n;
}
if (get_mode_arithmetic(mode) == irma_ieee754) {
if (is_Const(a)) {
tarval *tv = get_Const_tarval(a);
- if (tarval_ieee754_get_exponent(tv) == 1 && tarval_ieee754_zero_mantissa(tv)) {
+ if (tarval_ieee754_get_exponent(tv) == 1 && tarval_ieee754_zero_mantissa(tv)
+ && !tarval_is_negative(tv)) {
/* 2.0 * b = b + b */
n = new_rd_Add(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), b, b, mode);
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_ADD_A_A);
}
else if (is_Const(b)) {
tarval *tv = get_Const_tarval(b);
- if (tarval_ieee754_get_exponent(tv) == 1 && tarval_ieee754_zero_mantissa(tv)) {
+ if (tarval_ieee754_get_exponent(tv) == 1 && tarval_ieee754_zero_mantissa(tv)
+ && !tarval_is_negative(tv)) {
/* a * 2.0 = a + a */
n = new_rd_Add(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), a, a, mode);
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_ADD_A_A);
if (tv == get_mode_minus_one(mode)) {
/* a / -1 */
- value = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, get_irn_n(n, -1), a, mode);
+ value = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), a, mode);
DBG_OPT_CSTEVAL(n, value);
goto make_tuple;
}
make_tuple:
/* Turn Div into a tuple (mem, jmp, bad, value) */
mem = get_Div_mem(n);
- blk = get_irn_n(n, -1);
+ blk = get_nodes_block(n);
/* skip a potential Pin */
- if (is_Pin(mem))
- mem = get_Pin_op(mem);
+ mem = skip_Pin(mem);
turn_into_tuple(n, pn_Div_max);
set_Tuple_pred(n, pn_Div_M, mem);
set_Tuple_pred(n, pn_Div_X_regular, new_r_Jmp(current_ir_graph, blk));
make_tuple:
/* Turn Mod into a tuple (mem, jmp, bad, value) */
mem = get_Mod_mem(n);
- blk = get_irn_n(n, -1);
+ blk = get_nodes_block(n);
/* skip a potential Pin */
- if (is_Pin(mem))
- mem = get_Pin_op(mem);
+ mem = skip_Pin(mem);
turn_into_tuple(n, pn_Mod_max);
set_Tuple_pred(n, pn_Mod_M, mem);
set_Tuple_pred(n, pn_Mod_X_regular, new_r_Jmp(current_ir_graph, blk));
DBG_OPT_CSTEVAL(n, vb);
goto make_tuple;
} else if (mode_is_signed(mode) && tb == get_mode_minus_one(mode)) {
- va = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, get_irn_n(n, -1), a, mode);
+ va = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), a, mode);
vb = new_Const(mode, get_mode_null(mode));
DBG_OPT_CSTEVAL(n, va);
DBG_OPT_CSTEVAL(n, vb);
make_tuple:
mem = get_DivMod_mem(n);
/* skip a potential Pin */
- if (is_Pin(mem))
- mem = get_Pin_op(mem);
+ mem = skip_Pin(mem);
- blk = get_irn_n(n, -1);
+ blk = get_nodes_block(n);
turn_into_tuple(n, pn_DivMod_max);
set_Tuple_pred(n, pn_DivMod_M, mem);
set_Tuple_pred(n, pn_DivMod_X_regular, new_r_Jmp(current_ir_graph, blk));
if (get_mode_arithmetic(mode) == irma_ieee754) {
ir_node *b = get_Quot_right(n);
+ tarval *tv = value_of(b);
- if (is_Const(b)) {
- tarval *tv = get_Const_tarval(b);
+ if (tv != tarval_bad) {
int rem;
/*
using strict rules. */
if (tv != tarval_bad &&
(tarval_ieee754_get_exact() || (get_irg_fp_model(current_ir_graph) & fp_strict_algebraic) == 0)) {
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
ir_node *c = new_r_Const(current_ir_graph, blk, mode, tv);
ir_node *a = get_Quot_left(n);
ir_node *m = new_rd_Mul(get_irn_dbg_info(n), current_ir_graph, blk, a, c, mode);
ir_node *mem = get_Quot_mem(n);
/* skip a potential Pin */
- if (is_Pin(mem))
- mem = get_Pin_op(mem);
+ mem = skip_Pin(mem);
turn_into_tuple(n, pn_Quot_max);
set_Tuple_pred(n, pn_Quot_M, mem);
set_Tuple_pred(n, pn_Quot_X_regular, new_r_Jmp(current_ir_graph, blk));
if (is_Minus(left) && is_Minus(right) &&
!mode_overflow_on_unary_Minus(get_irn_mode(left))) {
- left = get_Minus_op(left);
- right = get_Minus_op(right);
+ ir_node *const new_left = get_Minus_op(right);
+ ir_node *const new_right = get_Minus_op(left);
n = new_rd_Cmp(get_irn_dbg_info(n), current_ir_graph,
- get_nodes_block(n), left, right);
+ get_nodes_block(n), new_left, new_right);
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_CMP_OP_OP);
}
return n;
ir_mode *a_mode = get_irn_mode(a_op);
ir_mode *b_mode = get_irn_mode(b_op);
if(a_mode == b_mode && (mode_is_int(a_mode) || a_mode == mode_b)) {
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = exact_copy(n);
set_binop_left(n, a_op);
if (c != NULL) {
/* (a sop c) & (b sop c) => (a & b) sop c */
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
ir_node *new_n = exact_copy(n);
set_binop_left(new_n, op1);
if (a == b) {
/* a ^ a = 0 */
- n = new_rd_Const(get_irn_dbg_info(n), current_ir_graph, get_irn_n(n, -1),
+ n = new_rd_Const(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n),
mode, get_mode_null(mode));
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_EOR_A_A);
} else if (mode == mode_b &&
is_Const(b) && is_Const_one(b) &&
is_Cmp(get_Proj_pred(a))) {
/* The Eor negates a Cmp. The Cmp has the negated result anyways! */
- n = new_r_Proj(current_ir_graph, get_irn_n(n, -1), get_Proj_pred(a),
+ n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
mode_b, get_negated_pnc(get_Proj_proj(a), mode));
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_EOR_TO_NOT_BOOL);
is_Proj(a) &&
is_Cmp(get_Proj_pred(a))) {
/* We negate a Cmp. The Cmp has the negated result anyways! */
- n = new_r_Proj(current_ir_graph, get_irn_n(n, -1), get_Proj_pred(a),
+ n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
mode_b, get_negated_pnc(get_Proj_proj(a), mode_b));
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_NOT_CMP);
return n;
if (is_Const(add_r) && is_Const_all_one(add_r)) {
/* ~(x + -1) = -x */
ir_node *op = get_Add_left(a);
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph, blk, op, get_irn_mode(n));
DBG_OPT_ALGSIM0(oldn, n, FS_OPT_NOT_MINUS_1);
}
/* -(~x) = x + 1 */
ir_node *op = get_Not_op(a);
tarval *tv = get_mode_one(mode);
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
ir_node *c = new_r_Const(current_ir_graph, blk, mode, tv);
n = new_rd_Add(get_irn_dbg_info(n), current_ir_graph, blk, op, c, mode);
DBG_OPT_ALGSIM2(oldn, a, n, FS_OPT_MINUS_NOT);
/* -(a >>u (size-1)) = a >>s (size-1) */
ir_node *v = get_Shr_left(a);
- n = new_rd_Shrs(get_irn_dbg_info(n), current_ir_graph, get_irn_n(n, -1), v, c, mode);
+ n = new_rd_Shrs(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), v, c, mode);
DBG_OPT_ALGSIM2(oldn, a, n, FS_OPT_PREDICATE);
return n;
}
/* -(a >>s (size-1)) = a >>u (size-1) */
ir_node *v = get_Shrs_left(a);
- n = new_rd_Shr(get_irn_dbg_info(n), current_ir_graph, get_irn_n(n, -1), v, c, mode);
+ n = new_rd_Shr(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), v, c, mode);
DBG_OPT_ALGSIM2(oldn, a, n, FS_OPT_PREDICATE);
return n;
}
/* - (a-b) = b - a */
ir_node *la = get_Sub_left(a);
ir_node *ra = get_Sub_right(a);
- ir_node *blk = get_irn_n(n, -1);
+ ir_node *blk = get_nodes_block(n);
n = new_rd_Sub(get_irn_dbg_info(n), current_ir_graph, blk, ra, la, mode);
DBG_OPT_ALGSIM2(oldn, a, n, FS_OPT_MINUS_SUB);
if (is_Mul(a)) { /* -(a * const) -> a * -const */
ir_node *mul_l = get_Mul_left(a);
ir_node *mul_r = get_Mul_right(a);
- if (is_Const(mul_r)) {
- tarval *tv = tarval_neg(get_Const_tarval(mul_r));
- if(tv != tarval_bad) {
+ tarval *tv = value_of(mul_r);
+ if (tv != tarval_bad) {
+ tv = tarval_neg(tv);
+ if (tv != tarval_bad) {
ir_node *cnst = new_Const(mode, tv);
dbg_info *dbg = get_irn_dbg_info(a);
ir_graph *irg = current_ir_graph;
if (confirm == NULL) {
/* we are sure we have a Const != 0 */
new_mem = get_Div_mem(div);
- if (is_Pin(new_mem))
- new_mem = get_Pin_op(new_mem);
+ new_mem = skip_Pin(new_mem);
set_Div_mem(div, new_mem);
set_irn_pinned(div, op_pin_state_floats);
}
if (confirm == NULL) {
/* we are sure we have a Const != 0 */
new_mem = get_Mod_mem(mod);
- if (is_Pin(new_mem))
- new_mem = get_Pin_op(new_mem);
+ new_mem = skip_Pin(new_mem);
set_Mod_mem(mod, new_mem);
set_irn_pinned(mod, op_pin_state_floats);
}
if (confirm == NULL) {
/* we are sure we have a Const != 0 */
new_mem = get_DivMod_mem(divmod);
- if (is_Pin(new_mem))
- new_mem = get_Pin_op(new_mem);
+ new_mem = skip_Pin(new_mem);
set_DivMod_mem(divmod, new_mem);
set_irn_pinned(divmod, op_pin_state_floats);
}
* later and may help to normalize more compares.
* Of course this is only possible for integer values.
*/
- if (is_Const(right)) {
+ tv = value_of(right);
+ if (tv != tarval_bad) {
mode = get_irn_mode(right);
- tv = get_Const_tarval(right);
/* TODO extend to arbitrary constants */
if (is_Conv(left) && tarval_is_null(tv)) {
else if (proj_nr == pn_Cmp_Le || proj_nr == pn_Cmp_Lt) {
if (tv != tarval_bad) {
/* c >= 0 : Abs(a) <= c ==> (unsigned)(a + c) <= 2*c */
- if (get_irn_op(left) == op_Abs) { // TODO something is missing here
+ if (is_Abs(left)) { // TODO something is missing here
}
}
}
}
if (changed) {
- ir_node *block = get_irn_n(n, -1); /* Beware of get_nodes_Block() */
+ ir_node *block = get_nodes_block(n);
/* create a new compare */
n = new_rd_Cmp(get_irn_dbg_info(n), current_ir_graph, block, left, right);
ir_node *c, *oldn = n;
ir_node *a = get_Conv_op(n);
- if (is_const_Phi(a)) {
+ if (get_irn_mode(n) != mode_b && is_const_Phi(a)) {
+ /* Do NOT optimize mode_b Conv's, this leads to remaining
+ * Phib nodes later, because the conv_b_lower operation
+ * is instantly reverted, when it tries to insert a Convb.
+ */
c = apply_conv_on_phi(a, get_irn_mode(n));
if (c) {
DBG_OPT_ALGSIM0(oldn, c, FS_OPT_CONST_PHI);
} else if (is_irn_pinned_in_irg(ka) && is_Block_dead(get_nodes_block(ka))) {
continue;
}
- /* FIXME: beabi need to keep a Proj(M) */
- if (is_Phi(ka) || is_irn_keep(ka) || is_Proj(ka))
- in[j++] = ka;
+ in[j++] = ka;
}
if (j != n_keepalives)
set_End_keepalives(n, j, in);
ir_node *t = get_Mux_true(n);
ir_node *f = get_Mux_false(n);
ir_graph *irg = current_ir_graph;
- ir_node *conds[1], *vals[2];
/* first normalization step: move a possible zero to the false case */
if (is_Proj(sel)) {
if (is_Cmp(cmp)) {
if (is_Const(t) && is_Const_null(t)) {
- /* Psi(x, 0, y) => Psi(x, y, 0) */
+ ir_node *tmp;
+
+ /* Mux(x, 0, y) => Mux(x, y, 0) */
pn_Cmp pnc = get_Proj_proj(sel);
sel = new_r_Proj(irg, get_nodes_block(cmp), cmp, mode_b,
get_negated_pnc(pnc, get_irn_mode(get_Cmp_left(cmp))));
- conds[0] = sel;
- vals[0] = f;
- vals[1] = t;
- n = new_rd_Psi(get_irn_dbg_info(n), irg, get_nodes_block(n), 1, conds, vals, mode);
- t = vals[0];
- f = vals[1];
+ n = new_rd_Mux(get_irn_dbg_info(n), irg, get_nodes_block(n), sel, t, f, mode);
+ tmp = t;
+ t = f;
+ f = tmp;
}
}
}
dbg_info *dbg = get_irn_dbg_info(n);
ir_node *block = get_nodes_block(n);
ir_graph *irg = current_ir_graph;
-
-
- conds[0] = sel;
- vals[0] = new_Const(mode, tarval_sub(a, min, NULL));
- vals[1] = new_Const(mode, tarval_sub(b, min, NULL));
- n = new_rd_Psi(dbg, irg, block, 1, conds, vals, mode);
+ ir_node *t = new_Const(mode, tarval_sub(a, min, NULL));
+ ir_node *f = new_Const(mode, tarval_sub(b, min, NULL));
+ n = new_rd_Mux(dbg, irg, block, sel, f, t, mode);
n = new_rd_Add(dbg, irg, block, n, new_Const(mode, min), mode);
return n;
}
if ( (cmp_l == t && (pn == pn_Cmp_Ge || pn == pn_Cmp_Gt))
|| (cmp_l == f && (pn == pn_Cmp_Le || pn == pn_Cmp_Lt)))
{
- /* Psi(a >/>= 0, a, -a) = Psi(a </<= 0, -a, a) ==> Abs(a) */
+ /* Mux(a >/>= 0, a, -a) = Mux(a </<= 0, -a, a) ==> Abs(a) */
n = new_rd_Abs(get_irn_dbg_info(n), current_ir_graph, block,
cmp_l, mode);
DBG_OPT_ALGSIM1(oldn, cmp, sel, n, FS_OPT_MUX_TO_ABS);
} else if ((cmp_l == t && (pn == pn_Cmp_Le || pn == pn_Cmp_Lt))
|| (cmp_l == f && (pn == pn_Cmp_Ge || pn == pn_Cmp_Gt)))
{
- /* Psi(a </<= 0, a, -a) = Psi(a >/>= 0, -a, a) ==> -Abs(a) */
+ /* Mux(a </<= 0, a, -a) = Mux(a >/>= 0, -a, a) ==> -Abs(a) */
n = new_rd_Abs(get_irn_dbg_info(n), current_ir_graph, block,
cmp_l, mode);
n = new_rd_Minus(get_irn_dbg_info(n), current_ir_graph,
if (mode_is_int(mode)) {
/* integer only */
if ((pn == pn_Cmp_Lg || pn == pn_Cmp_Eq) && is_And(cmp_l)) {
- /* Psi((a & b) != 0, c, 0) */
+ /* Mux((a & b) != 0, c, 0) */
ir_node *and_r = get_And_right(cmp_l);
ir_node *and_l;
if (and_r == t && f == cmp_r) {
if (is_Const(t) && tarval_is_single_bit(get_Const_tarval(t))) {
if (pn == pn_Cmp_Lg) {
- /* Psi((a & 2^C) != 0, 2^C, 0) */
+ /* Mux((a & 2^C) != 0, 2^C, 0) */
n = cmp_l;
+ DBG_OPT_ALGSIM1(oldn, cmp, sel, n, FS_OPT_MUX_TO_BITOP);
} else {
- /* Psi((a & 2^C) == 0, 2^C, 0) */
+ /* Mux((a & 2^C) == 0, 2^C, 0) */
n = new_rd_Eor(get_irn_dbg_info(n), current_ir_graph,
block, cmp_l, t, mode);
+ DBG_OPT_ALGSIM1(oldn, cmp, sel, n, FS_OPT_MUX_TO_BITOP);
}
return n;
}
if (pn == pn_Cmp_Lg) {
/* (a & (1 << n)) != 0, (1 << n), 0) */
n = cmp_l;
+ DBG_OPT_ALGSIM1(oldn, cmp, sel, n, FS_OPT_MUX_TO_BITOP);
} else {
/* (a & (1 << n)) == 0, (1 << n), 0) */
n = new_rd_Eor(get_irn_dbg_info(n), current_ir_graph,
block, cmp_l, t, mode);
+ DBG_OPT_ALGSIM1(oldn, cmp, sel, n, FS_OPT_MUX_TO_BITOP);
}
return n;
}
if (pn == pn_Cmp_Lg) {
/* ((1 << n) & a) != 0, (1 << n), 0) */
n = cmp_l;
+ DBG_OPT_ALGSIM1(oldn, cmp, sel, n, FS_OPT_MUX_TO_BITOP);
} else {
/* ((1 << n) & a) == 0, (1 << n), 0) */
n = new_rd_Eor(get_irn_dbg_info(n), current_ir_graph,
block, cmp_l, t, mode);
+ DBG_OPT_ALGSIM1(oldn, cmp, sel, n, FS_OPT_MUX_TO_BITOP);
}
return n;
}
return arch_transform_node_Mux(n);
} /* transform_node_Mux */
-/**
- * Optimize a Psi into some simpler cases.
- */
-static ir_node *transform_node_Psi(ir_node *n) {
- if (is_Mux(n))
- return transform_node_Mux(n);
-
- return n;
-} /* transform_node_Psi */
-
/**
* optimize Sync nodes that have other syncs as input we simply add the inputs
* of the other sync to our own inputs
CASE(Conv);
CASE(End);
CASE(Mux);
- CASE(Psi);
CASE(Sync);
default:
/* leave NULL */;
static int node_cmp_attr_Sel(ir_node *a, ir_node *b) {
const ir_entity *a_ent = get_Sel_entity(a);
const ir_entity *b_ent = get_Sel_entity(b);
+#if 0
return
(a_ent->kind != b_ent->kind) ||
(a_ent->name != b_ent->name) ||
(a_ent->owner != b_ent->owner) ||
(a_ent->ld_name != b_ent->ld_name) ||
(a_ent->type != b_ent->type);
+#endif
+ /* Matze: inlining of functions can produce 2 entities with same type,
+ * name, etc. */
+ return a_ent != b_ent;
} /* node_cmp_attr_Sel */
/** Compares the attributes of two Phi nodes. */
if (o != n) {
update_known_irn(o, n);
- DBG_OPT_CSE(n, o);
}
return o;
/* Now we have a legal, useful node. Enter it in hash table for CSE */
if (get_opt_cse() && (get_irn_opcode(n) != iro_Block)) {
- n = identify_remember(current_ir_graph->value_table, n);
+ ir_node *o = n;
+ n = identify_remember(current_ir_graph->value_table, o);
+ if (o != n)
+ DBG_OPT_CSE(o, n);
}
return n;
now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
subexpressions within a block. */
if (get_opt_cse()) {
- n = identify_remember(current_ir_graph->value_table, n);
+ ir_node *o = n;
+ n = identify_remember(current_ir_graph->value_table, o);
+ if (o != n)
+ DBG_OPT_CSE(o, n);
}
/* Some more constant expression evaluation. */
/* Now we have a legal, useful node. Enter it in hash table for cse.
Blocks should be unique anyways. (Except the successor of start:
is cse with the start block!) */
- if (get_opt_cse() && (get_irn_opcode(n) != iro_Block))
- n = identify_remember(current_ir_graph->value_table, n);
+ if (get_opt_cse() && (get_irn_opcode(n) != iro_Block)) {
+ ir_node *o = n;
+ n = identify_remember(current_ir_graph->value_table, o);
+ if (o != n)
+ DBG_OPT_CSE(o, n);
+ }
return n;
} /* optimize_in_place_2 */