]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
optabs.c (can_compare_p): Test the predicate of a cbranch and cstore pattern.
authorPaolo Bonzini <bonzini@gnu.org>
Tue, 7 Apr 2009 12:39:37 +0000 (12:39 +0000)
committerPaolo Bonzini <bonzini@gcc.gnu.org>
Tue, 7 Apr 2009 12:39:37 +0000 (12:39 +0000)
2009-04-07  Paolo Bonzini  <bonzini@gnu.org>

        * optabs.c (can_compare_p): Test the predicate of a
        cbranch and cstore pattern.

From-SVN: r145667

gcc/ChangeLog
gcc/optabs.c

index 8c946ebe3071a00904750199bc3881dcce8afb06..120dfc1b03b67d977d05b22c1a072c43a39a0113 100644 (file)
@@ -1,3 +1,8 @@
+2009-04-07  Paolo Bonzini  <bonzini@gnu.org>
+
+        * optabs.c (can_compare_p): Test the predicate of a
+        cbranch and cstore pattern.
+
 2009-04-07  Paolo Bonzini  <bonzini@gnu.org>
 
         * expr.c (convert_move): Use emit_store_flag instead of
index f7e44db48c2b4ddcdc9c8fb0df46ce31d6ba7f8e..7057d9ffa31336153135991123bfca9cadb8b85a 100644 (file)
@@ -3980,8 +3980,12 @@ int
 can_compare_p (enum rtx_code code, enum machine_mode mode,
               enum can_compare_purpose purpose)
 {
+  rtx test;
+  test = gen_rtx_fmt_ee (code, mode, const0_rtx, const0_rtx);
   do
     {
+      int icode;
+
       if (optab_handler (cmp_optab, mode)->insn_code != CODE_FOR_nothing)
        {
          if (purpose == ccp_jump)
@@ -3993,15 +3997,19 @@ can_compare_p (enum rtx_code code, enum machine_mode mode,
            return 1;
        }
       if (purpose == ccp_jump
-         && optab_handler (cbranch_optab, mode)->insn_code != CODE_FOR_nothing)
-       return 1;
+          && (icode = optab_handler (cbranch_optab, mode)->insn_code) != CODE_FOR_nothing
+          && insn_data[icode].operand[0].predicate (test, mode))
+        return 1;
+      if (purpose == ccp_store_flag
+          && (icode = optab_handler (cstore_optab, mode)->insn_code) != CODE_FOR_nothing
+          && insn_data[icode].operand[1].predicate (test, mode))
+        return 1;
       if (purpose == ccp_cmov
          && optab_handler (cmov_optab, mode)->insn_code != CODE_FOR_nothing)
        return 1;
-      if (purpose == ccp_store_flag
-         && optab_handler (cstore_optab, mode)->insn_code != CODE_FOR_nothing)
-       return 1;
+
       mode = GET_MODE_WIDER_MODE (mode);
+      PUT_MODE (test, mode);
     }
   while (mode != VOIDmode);