On 10/06/14 12:42, Terry Guo wrote:
> 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.   
> 

I think you should just test that "insn != BB_HEAD (bb)".  The loop
immediately above this deals with the !NON-DEBUG insns, so the logic is
confusing the way you've written it.

R.

> 
> thumb1-reorg-v2.txt
> 
> 
> 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