| 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
> 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); }
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?