ir_node *a = get_Minus_op(n);
tarval *ta = value_of(a);
- if ((ta != tarval_bad) && mode_is_signed(get_irn_mode(a)))
+ if (ta != tarval_bad)
return tarval_neg(ta);
return tarval_bad;
n = b; /* Convb(Conv*(xxxb(...))) == xxxb(...) */
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_CONV);
} else if (mode_is_int(n_mode)) {
- if (smaller_mode(b_mode, a_mode)){
+ if (get_mode_size_bits(b_mode) <= get_mode_size_bits(a_mode)) {
n = b; /* ConvS(ConvL(xxxS(...))) == xxxS(...) */
DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_CONV);
}
* Optimize:
* -(~x) = x + 1
* -(a-b) = b - a
+ * -(a >>u (size-1)) = a >>s (size-1)
+ * -(a >>s (size-1)) = a >>u (size-1)
+ * -(a * const) -> a * -const
*/
static ir_node *transform_node_Minus(ir_node *n) {
ir_node *c, *oldn = n;
ir_graph *irg = current_ir_graph;
ir_node *block = get_nodes_block(a);
n = new_rd_Mul(dbg, irg, block, mul_l, cnst, mode);
+ DBG_OPT_ALGSIM2(oldn, a, n, FS_OPT_MINUS_MUL_C);
return n;
}
}
*/
if (is_Const(right)) {
c = right;
- } else if (is_Const(left)) {
+ } else if (is_irn_constlike(left)) {
c = left;
left = right;
right = c;
+ if(!is_Const(c))
+ c = NULL;
proj_nr = get_inversed_pnc(proj_nr);
changed |= 1;