Patchwork canonical condition branch

login
register
mail settings
Submitter Mike Stump
Date Sept. 29, 2010, 1:36 a.m.
Message ID <93FB9EB0-77DA-4DF2-B25F-2CE73CE30D8E@comcast.net>
Download mbox | patch
Permalink /patch/66034/
State New
Headers show

Comments

Mike Stump - Sept. 29, 2010, 1:36 a.m.
I have a port with a pattern like:

(define_insn "*branch_if_bit_set"
  [(set (pc)
        (if_then_else
         (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
                          (const_int 1)
                          (match_operand 1 "immediate" ""))
         (label_ref (match_operand 2 "" ""))
         (pc)))]
  ""
  "branch_if_bit_set\t%0,%1,%2")

I used that pattern as that is what I saw combine looking for and failing to find...  but, in rtlanal.c (canonicalize_condition), we have:

which drops op2 because zero_extract is a 3 operand code, not a 2 operand code.  So, then question is, should we add the above patch to avoid building bad rtl code?
Eric Botcazou - Oct. 3, 2010, 9:29 a.m.
> I used that pattern as that is what I saw combine looking for and failing
> to find...  but, in rtlanal.c (canonicalize_condition), we have:
>
> Index: gcc/gcc/rtlanal.c
> ===================================================================
> --- gcc/gcc/rtlanal.c	(revision 850)
> +++ gcc/gcc/rtlanal.c	(working copy)
> @@ -4933,6 +4933,9 @@
>    if (CC0_P (op0))
>      return 0;
>
> +  if (GET_RTX_LENGTH (code) != 2)
> +    return 0;
> +
>    return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
>  }
>
> which drops op2 because zero_extract is a 3 operand code, not a 2 operand
> code.  So, then question is, should we add the above patch to avoid
> building bad rtl code?

I think other places could expect the first operand of if_then_else to be a 
condition.  You should try and rewrite the pattern to make it use a condition 
operator, see *jcc_bt in the i386 port for example.

Patch

Index: gcc/gcc/rtlanal.c
===================================================================
--- gcc/gcc/rtlanal.c	(revision 850)
+++ gcc/gcc/rtlanal.c	(working copy)
@@ -4933,6 +4933,9 @@ 
   if (CC0_P (op0))
     return 0;
 
+  if (GET_RTX_LENGTH (code) != 2)
+    return 0;
+
   return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
 }