Hi There, The thumb1_reorg function use macro INSN_CODE to find expected instructions. But the macro INSN_CODE doesn’t work for label type instruction. The INSN_CODE(label_insn) will return the label number. When we have a lot of labels and current label_insn is the first insn of basic block, the INSN_CODE(label_insn) could accidentally equal to CODE_FOR_cbranchsi4_insn in this case. This leads to ICE due to SET_SRC(label_insn) in subsequent code. In general we should skip all such improper insns. This is the purpose of attached small patch.
Some failures in recent gcc regression test on thumb1 target are caused by this reason. So with this patch, all of them passed and no new failures. Is it ok to trunk? BR, Terry 2014-06-10 Terry Guo <terry....@arm.com> * config/arm/arm.c (thumb1_reorg): Move to next basic block if the head of current basic block isn’t a proper insn.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index ccad548..3ebe424 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -16939,7 +16939,8 @@ thumb1_reorg (void) insn = PREV_INSN (insn); /* Find the last cbranchsi4_insn in basic block BB. */ - if (INSN_CODE (insn) != CODE_FOR_cbranchsi4_insn) + if (!NONDEBUG_INSN_P (insn) + || INSN_CODE (insn) != CODE_FOR_cbranchsi4_insn) continue; /* Get the register with which we are comparing. */