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.  */

Reply via email to