I'm testing the attached fix.
>From 6de0603f3a5c86396d44250cb34d4451528681b1 Mon Sep 17 00:00:00 2001 From: Andrea Corallo <andrea.cora...@arm.com> Date: Wed, 3 Feb 2021 15:21:54 +0100 Subject: [PATCH] arm: Add low overhead loop address range check [PR98931]
2021-02-03 Andrea Corallo <andrea.cora...@arm.com> * config/arm/arm.c (arm_target_insn_ok_for_lob): Add address range check. --- gcc/config/arm/arm.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index e22396dbcd5..85c96cdb156 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -33769,10 +33769,22 @@ arm_target_insn_ok_for_lob (rtx insn) supported for 'low over head loop' making sure that LE target is above LE itself in the generated code. */ - return single_succ_p (bb) - && single_pred_p (bb) - && single_succ_edge (bb)->dest == single_pred_edge (bb)->src - && contains_no_active_insn_p (bb); + if (!single_succ_p (bb) + || !single_pred_p (bb) + || single_succ_edge (bb)->dest != single_pred_edge (bb)->src + || !contains_no_active_insn_p (bb)) + return false; + + unsigned int distance = 0; + rtx_insn *curr_insn = BB_HEAD (single_succ_edge (bb)->dest); + while ((curr_insn = NEXT_INSN (curr_insn))) + distance += get_attr_length (curr_insn); + + /* LE encodes the PC relative jump address in 12 bits. */ + if (distance >= (1 << 11)) + return false; + + return true; } #if CHECKING_P -- 2.20.1