Conv(X) & all_one(mode(X)) = Conv(X)
authorMoritz Kroll <Moritz.Kroll@gmx.de>
Wed, 14 Jan 2009 00:31:40 +0000 (00:31 +0000)
committerMoritz Kroll <Moritz.Kroll@gmx.de>
Wed, 14 Jan 2009 00:31:40 +0000 (00:31 +0000)
[r25185]

ir/ir/iropt.c

index 054541d..d210810 100644 (file)
@@ -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;