Skip to content
Snippets Groups Projects
Commit c0e54ce1 authored by Alex Coplan's avatar Alex Coplan
Browse files

pair-fusion: Assume alias conflict if common address reg changes [PR116783]

As the PR shows, pair-fusion was tricking memory_modified_in_insn_p into
returning false when a common base register (in this case, x1) was
modified between the mem and the store insn.  This lead to wrong code as
the accesses really did alias.

To avoid this sort of problem, this patch avoids invoking RTL alias
analysis altogether (and assume an alias conflict) if the two insns to
be compared share a common address register R, and the insns see different
definitions of R (i.e. it was modified in between).

gcc/ChangeLog:

	PR rtl-optimization/116783
	* pair-fusion.cc (def_walker::cand_addr_uses): New.
	(def_walker::def_walker): Add parameter for candidate address
	uses.
	(def_walker::alias_conflict_p): Declare.
	(def_walker::addr_reg_conflict_p): New.
	(def_walker::conflict_p): New.
	(store_walker::store_walker): Add parameter for candidate
	address uses and pass to base ctor.
	(store_walker::conflict_p): Rename to ...
	(store_walker::alias_conflict_p): ... this.
	(load_walker::load_walker): Add parameter for candidate
	address uses and pass to base ctor.
	(load_walker::conflict_p): Rename to ...
	(load_walker::alias_conflict_p): ... this.
	(pair_fusion_bb_info::try_fuse_pair): Collect address register
	uses for candidate insns and pass down to alias walkers.

gcc/testsuite/ChangeLog:

	PR rtl-optimization/116783
	* g++.dg/torture/pr116783.C: New test.
parent d0d99fc6
No related branches found
No related tags found
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment