From: Moritz Kroll Date: Wed, 14 Jan 2009 00:31:40 +0000 (+0000) Subject: Conv(X) & all_one(mode(X)) = Conv(X) X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=ac007947cfda21b5c40f722e79fcc5baf81a2102;p=libfirm Conv(X) & all_one(mode(X)) = Conv(X) [r25185] --- diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 054541dc9..d21081057 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -1168,13 +1168,28 @@ static ir_node *equivalent_node_And(ir_node *n) { DBG_OPT_ALGSIM0(oldn, n, FS_OPT_AND); return n; } - /* constants are cormalized to right, check this site first */ + /* constants are normalized to right, check this site first */ tv = value_of(b); if (tarval_is_all_one(tv)) { n = a; DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_AND); return n; } + if (tv != get_tarval_bad()) { + ir_mode *mode = get_irn_mode(n); + if (!mode_is_signed(mode) && is_Conv(a)) { + ir_node *convop = get_Conv_op(a); + ir_mode *convopmode = get_irn_mode(convop); + if (!mode_is_signed(convopmode)) { + if (new_tarval_from_long(get_tarval_long(tv), convopmode) == get_mode_all_one(convopmode)) { + /* Conv(X) & all_one(mode(X)) = Conv(X) */ + n = a; + DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_AND); + return n; + } + } + } + } tv = value_of(a); if (tarval_is_all_one(tv)) { n = b;