https://gcc.gnu.org/g:ed2d5ffc7ed4fe2fd17c9993ad498e8fac03a211

commit ed2d5ffc7ed4fe2fd17c9993ad498e8fac03a211
Author: Alexandre Oliva <[email protected]>
Date:   Tue Dec 16 21:31:07 2025 -0300

    vartrack: fix skipping of unsuitable locs
    
    When the last loc in a chain happens to be an unsuitable_loc(), we
    record VAR_LOC_FROM as if the empty location had been derived from
    that unsuitable loc, instead of leaving it empty, which ends up
    preventing the VAR loc from being recomputed when other related locs
    are usefully expanded.
    
    Adjust the code that skips an unsuitable_loc() to take the same
    preparation steps we take for exiting the loop as when an expansion
    attempt yields NULL_RTX.
    
    
    for  gcc/ChangeLog
    
            * var-tracking.cc (vt_expand_var_loc_chain): Prepare to exit
            the loop after unsuitable_loc.

Diff:
---
 gcc/var-tracking.cc | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gcc/var-tracking.cc b/gcc/var-tracking.cc
index 21cde6b0a7b6..e0b9364a3d9e 100644
--- a/gcc/var-tracking.cc
+++ b/gcc/var-tracking.cc
@@ -8398,7 +8398,7 @@ vt_expand_var_loc_chain (variable *var, bitmap regs, void 
*data,
          next = loc;
          cloc = cloc->next;
          if (unsuitable_loc (loc_from))
-           continue;
+           goto try_next_loc;
        }
       else
        {
@@ -8438,6 +8438,7 @@ vt_expand_var_loc_chain (variable *var, bitmap regs, void 
*data,
          result = NULL;
        }
 
+    try_next_loc:
       /* Set it up in case we leave the loop.  */
       depth.complexity = depth.entryvals = 0;
       loc_from = NULL;

Reply via email to