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

Reply via email to