Message ID | 9eb88215-8d5c-c39d-7aae-d2f8aa2d8795@arm.com |
---|---|
State | New |
Headers | show |
Series | [middle-end] PR104498: Fix comparing symbol reference | expand |
On Wed, 16 Feb 2022, Andre Vieira (lists) wrote: > Hi, > > As reported on PR104498, the issue here is that when compare_base_symbol_refs > swaps x and y but doesn't take that into account when computing the distance. > This patch makes sure that if x and y are swapped, we correct the distance > computation by multiplying it by -1 to end up with the correct expected result > of the original Y_BASE - X_BASE. > > Bootstrapped and regression tested on aarch64-none-linux. > > OK for trunk? OK. Thanks, Richard. > gcc/ChangeLog: > > PR middle-end/104498 > * alias.cc (compare_base_symbol_refs): Correct distance > computation when > swapping x and y. >
diff --git a/gcc/alias.cc b/gcc/alias.cc index 3fd71cff2e2b488bc39fcf7d937e118b96f491ab..8c08452e0acfcbf1bfd8fd2e8cd420b5b929d6b4 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