Hi, I find which_alternative can't really be used in preparation-statements of define_insn_and_split, so can this be fixed like below?
For example, I want to use which_alternative in the pattern below, (define_insn_and_split "*thumb2_movsicc_insn" [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r") (if_then_else:SI (match_operator 3 "arm_comparison_operator" [(match_operand 4 "cc_register" "") (const_int 0)]) (match_operand:SI 1 "arm_not_operand" "0,0,rI,K,rI,rI,K,K") (match_operand:SI 2 "arm_not_operand" "rI,K,0,0,rI,K,rI,K")))] "TARGET_THUMB2" "@ it\\t%D3\;mov%D3\\t%0, %2 it\\t%D3\;mvn%D3\\t%0, #%B2 it\\t%d3\;mov%d3\\t%0, %1 it\\t%d3\;mvn%d3\\t%0, #%B1 ite\\t%d3\;mov%d3\\t%0, %1\;mov%D3\\t%0, %2 ite\\t%d3\;mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2 ite\\t%d3\;mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2 ite\\t%d3\;mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" "&& reload_completed" [(cond_exec (match_dup 5) (set (match_dup 0) (match_dup 6)))] " { if (which_alternative >= 2 && which_alternative < 4) { ... } else if (which_alternative >= 4) { ... } }" [(set_attr "length" "6,6,6,6,10,10,10,10") (set_attr "conds" "use")] ) Thanks, -Jiangning Patch: diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index c94e743..df6a3df --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -3502,6 +3502,10 @@ try_split (rtx pat, rtx trial, int last) split_branch_probability = INTVAL (XEXP (note, 0)); probability = split_branch_probability; + extract_insn (trial); + if (!constrain_operands (reload_completed)) + return trial; + seq = split_insns (pat, trial); split_branch_probability = -1;