From d34cdec56728ddbdfacabd9f80598b17d1c6ff54 Mon Sep 17 00:00:00 2001 From: Andre Vieira Date: Mon, 21 Feb 2022 09:41:53 +0000 Subject: [PATCH] rtl-optimization/104498: Fix comparing symbol reference gcc/ChangeLog: PR rtl-optimization/104498 * alias.cc (compare_base_symbol_refs): Correct distance computation when swapping x and y. --- gcc/alias.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gcc/alias.cc b/gcc/alias.cc index 3fd71cf..8c08452 100644 --- a/gcc/alias.cc +++ b/gcc/alias.cc @@ -2195,6 +2195,7 @@ compare_base_symbol_refs (const_rtx x_base, const_rtx y_base, tree x_decl = SYMBOL_REF_DECL (x_base); tree y_decl = SYMBOL_REF_DECL (y_base); bool binds_def = true; + bool swap = false; if (XSTR (x_base, 0) == XSTR (y_base, 0)) return 1; @@ -2204,6 +2205,7 @@ compare_base_symbol_refs (const_rtx x_base, const_rtx y_base, { if (!x_decl) { + swap = true; std::swap (x_decl, y_decl); std::swap (x_base, y_base); } @@ -2238,8 +2240,8 @@ compare_base_symbol_refs (const_rtx x_base, const_rtx y_base, if (SYMBOL_REF_BLOCK (x_base) != SYMBOL_REF_BLOCK (y_base)) return 0; if (distance) - *distance += (SYMBOL_REF_BLOCK_OFFSET (y_base) - - SYMBOL_REF_BLOCK_OFFSET (x_base)); + *distance += (swap ? -1 : 1) * (SYMBOL_REF_BLOCK_OFFSET (y_base) + - SYMBOL_REF_BLOCK_OFFSET (x_base)); return binds_def ? 1 : -1; } /* Either the symbols are equal (via aliasing) or they refer to -- 2.7.4