http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45416
--- Comment #11 from Andrew Pinski <pinskia at gcc dot gnu.org> 2011-12-05 
20:51:58 UTC ---
I have a patch:
Index: expr.c
===================================================================
--- expr.c    (revision 182017)
+++ expr.c    (working copy)
@@ -10563,15 +10563,24 @@ do_store_flag (sepops ops, rtx target, e
      so we just call into the folder and expand its result.  */

   if ((code == NE || code == EQ)
-      && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
-      && integer_pow2p (TREE_OPERAND (arg0, 1))
+      && TREE_CODE (arg0) == SSA_NAME && integer_zerop (arg1)
       && (TYPE_PRECISION (ops->type) != 1 || TYPE_UNSIGNED (ops->type)))
     {
-      tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
-      return expand_expr (fold_single_bit_test (loc,
-                        code == NE ? NE_EXPR : EQ_EXPR,
-                        arg0, arg1, type),
-              target, VOIDmode, EXPAND_NORMAL);
+      gimple srcstmt = get_gimple_for_ssa_name (arg0);
+      if (srcstmt
+      && TREE_CODE (gimple_assign_rhs_code (srcstmt)) == BIT_AND_EXPR
+      && integer_pow2p (gimple_assign_rhs2 (srcstmt))
+    {
+      enum tree_code tcode = code == NE ? NE_EXPR : EQ_EXPR;
+      tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
+      tree temp = fold_build2 (loc, BIT_AND_EXPR, type,
+                   gimple_assign_rhs1 (srcstmt),
+                   gimple_assign_rhs2 (srcstmt));
+      return expand_expr (fold_single_bit_test (loc,
+                                  tcode,
+                                  arg0, arg1, type),
+                  target, VOIDmode, EXPAND_NORMAL);
+    }
     }

   if (! get_subtarget (target)

Reply via email to