On 2019-02-13 5:54 a.m., Andre Vieira (lists) wrote:
PING.

Since Jeff is away can another maintainer have a look at this please?


I see the following patch

diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 
c061093ed699620afe2dfda60d58066d6967523a..736b084acc552b75ff4d369b6584bc9ab422e21b
 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -1761,11 +1761,21 @@ uses_hard_regs_p (rtx x, HARD_REG_SET set)
     return false;
   code = GET_CODE (x);
   mode = GET_MODE (x);
+
   if (code == SUBREG)
     {
+      /* For all SUBREGs we want to check whether the full multi-register
+        overlaps the set.  For normal SUBREGs this means 'get_hard_regno' of
+        the inner register, for paradoxical SUBREGs this means the
+        'get_hard_regno' of the full SUBREG and for complete SUBREGs either is
+        fine.  Use the wider mode for all cases.  */
+      rtx subreg = SUBREG_REG (x);
       mode = wider_subreg_mode (x);
-      x = SUBREG_REG (x);
-      code = GET_CODE (x);
+      if (mode == GET_MODE (subreg))
+       {
+         x = subreg;
+         code = GET_CODE (x);
+       }
     }
if (REG_P (x))

In your case, x will be SUBREG and be processed recursively only as a register 
of subreg.

I think you need to change the last line on

  if (REG_P (x) || code == SUBREG)

then the subreg will processed by get_hard_regno as subreg.

Reply via email to