This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH GCC]Remove duplciated alias check in vectorizer


Hi,
GCC now generates duplicated alias check in vectorizer when versioning loops.  In current implementation, DR_OFFSET and DR_INIT are added together too early when creating structure dr_with_seg_len.  This has two disadvantages: A) structure dr_with_seg_len_pair_t is only canonicalized against DR_BASE_ADDRESS in function vect_prune_runtime_alias_test_list, while it should be against DR_OFFSET too; B) When function vect_prune_runtime_alias_test_list tries to merge aias checks with consecutive memory references, it can only handle DRs with constant DR_OFFSET + DR_INIT, as in below code:
	  /* We consider the case that DR_B1 and DR_B2 are same memrefs,
	     and DR_A1 and DR_A2 are two consecutive memrefs.  */
	  //... ...
	  if (!operand_equal_p (DR_BASE_ADDRESS (dr_a1->dr),
				DR_BASE_ADDRESS (dr_a2->dr),
				0)
	      || !tree_fits_shwi_p (dr_a1->offset)
	      || !tree_fits_shwi_p (dr_a2->offset))
	    continue;

Both disadvantages result in duplicated/unnecessary alias checks, as well as bloated condition basic block of loop versioning.  
This patch fixes the issue.  Bootstrap and test on x86_64 and AArch64.  Is it OK?
Test gfortran.dg/vect/vect-8.f90 failed now.  It scans for "vectorized 20 loops" but with this patch there are more than 20 loops vectorized.  The additional loop wasn't vectorized because # of alias checks exceeded parameter bound "vect-max-version-for-alias-checks" w/o this patch.

There are other issues in vectorizer alias checking, I will tackle them in follow up patches.

Thanks,
bin

2016-06-03  Bin Cheng  <bin.cheng@arm.com>

	* tree-vectorizer.h (struct dr_with_seg_len): Remove class
	member OFFSET.
	* tree-vect-data-refs.c (operator ==): Handle DR_OFFSET directly,
	rather than OFFSET.
	(comp_dr_with_seg_len_pair, comp_dr_with_seg_len_pair): Ditto.
	(vect_create_cond_for_alias_checks): Ditto.
	(vect_prune_runtime_alias_test_list): Also canonicalize pairs
	against DR_OFFSET.  Handle DR_OFFSET directly when prune alias
	checks.

gcc/testsuite/ChangeLog
2016-06-03  Bin Cheng  <bin.cheng@arm.com>

	* gcc.dg/vect/vect-alias-check-1.c: New test.

Attachment: merge-alias-checks-20160520.txt
Description: merge-alias-checks-20160520.txt


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]