From patchwork Wed Sep 29 01:36:06 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: canonical condition branch Date: Tue, 28 Sep 2010 15:36:06 -0000 From: Mike Stump X-Patchwork-Id: 66034 Message-Id: <93FB9EB0-77DA-4DF2-B25F-2CE73CE30D8E@comcast.net> To: GCC Patches 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? 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); }