diff mbox series

[v2] combine.cc (make_more_copies): Copy attributes from the original pseudo, PR115883

Message ID 20240821144817.868AA20432@pchp3.se.axis.com
State New
Headers show
Series [v2] combine.cc (make_more_copies): Copy attributes from the original pseudo, PR115883 | expand

Commit Message

Hans-Peter Nilsson Aug. 21, 2024, 2:48 p.m. UTC
The only thing that's changed with the patch in v2 since the
first version (pinged once) is the commit message.  CC to
the nexts-of-kin as a heads-up.

Regtested cross to cris-elf and native x86_64-linux-gnu at
r15-3043-g64028d626a50.  The gcc.dg/guality/pr54200.c
magically being fixed was also noticed at an earlier
test-run, at r15-1880-gce34fcc572a0.  I see on
gcc-testresults that this test fails for several targets.

Ok to commit?

-- >8 --
The first of the late-combine passes, propagates some of the copies
made during the (in-time-)combine pass in make_more_copies into the
users of the "original" pseudo registers and removes the "old"
pseudos.  That effectively removes attributes such as REG_POINTER,
which matter to LRA.  The quoted PR is for an ICE-manifesting bug that
was exposed by the late-combine pass and went back to hiding with this
patch until commit r15-2937-g3673b7054ec2, the fix for PR116236, when
it was actually fixed.  To wit, this patch is only incidentally
related to that bug.

In other words, the REG_POINTER attribute should not be required for
LRA to work correctly.  This patch merely corrects state for those
propagated register-uses to ante late-combine.

For reasons not investigated, this fixes a failing test
"FAIL: gcc.dg/guality/pr54200.c -Og -DPREVENT_OPTIMIZATION line 20 z == 3"
for x86_64-linux-gnu.

	PR middle-end/115883
	* combine.cc (make_more_copies): Copy attributes from the original
	pseudo to the new copy.
---
 gcc/combine.cc | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Jeff Law Aug. 25, 2024, 3:01 p.m. UTC | #1
On 8/21/24 8:48 AM, Hans-Peter Nilsson wrote:
> The only thing that's changed with the patch in v2 since the
> first version (pinged once) is the commit message.  CC to
> the nexts-of-kin as a heads-up.
> 
> Regtested cross to cris-elf and native x86_64-linux-gnu at
> r15-3043-g64028d626a50.  The gcc.dg/guality/pr54200.c
> magically being fixed was also noticed at an earlier
> test-run, at r15-1880-gce34fcc572a0.  I see on
> gcc-testresults that this test fails for several targets.
> 
> Ok to commit?
> 
> -- >8 --
> The first of the late-combine passes, propagates some of the copies
> made during the (in-time-)combine pass in make_more_copies into the
> users of the "original" pseudo registers and removes the "old"
> pseudos.  That effectively removes attributes such as REG_POINTER,
> which matter to LRA.  The quoted PR is for an ICE-manifesting bug that
> was exposed by the late-combine pass and went back to hiding with this
> patch until commit r15-2937-g3673b7054ec2, the fix for PR116236, when
> it was actually fixed.  To wit, this patch is only incidentally
> related to that bug.
> 
> In other words, the REG_POINTER attribute should not be required for
> LRA to work correctly.  This patch merely corrects state for those
> propagated register-uses to ante late-combine.
> 
> For reasons not investigated, this fixes a failing test
> "FAIL: gcc.dg/guality/pr54200.c -Og -DPREVENT_OPTIMIZATION line 20 z == 3"
> for x86_64-linux-gnu.
> 
> 	PR middle-end/115883
> 	* combine.cc (make_more_copies): Copy attributes from the original
> 	pseudo to the new copy.
OK, though please use old fashioned C comment style since that's the 
style used everywhere else is combine.cc.  No need to wait for review on 
the comment style change ;-)

jeff
diff mbox series

Patch

diff --git a/gcc/combine.cc b/gcc/combine.cc
index 3b50bc3529c4..6e6e710aae08 100644
--- a/gcc/combine.cc
+++ b/gcc/combine.cc
@@ -15102,6 +15102,12 @@  make_more_copies (void)
 	    continue;
 
 	  rtx new_reg = gen_reg_rtx (GET_MODE (dest));
+
+	  // The "original" pseudo copies have important attributes
+	  // attached, like pointerness.  We want that for these copies
+	  // too, for use by insn recognition and later passes.
+	  set_reg_attrs_from_value (new_reg, dest);
+
 	  rtx_insn *new_insn = gen_move_insn (new_reg, src);
 	  SET_SRC (set) = new_reg;
 	  emit_insn_before (new_insn, insn);