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] PR71060


The PR shows that data-dependence analysis is too strict when making sure
that dr_indices of two DRs are compatible enough to be fed into the
dependence machinery.  The important part is that the structure of the
object needs to be the same which is ensured by type equality.  Then
of course they need to be based on the same address.  Things like whether
the object was referenced via a restrict pointer or with special
alignment doesn't matter for the dependence analysis step using 
dr_indices.

Thus the following patch improves this bit in dependence analysis,
not yet fixing the underlying issue of the "miscompare" which is
if-conversion dropping restrict info when building masked load/stores.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2016-05-12  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/71060
	* tree-data-ref.c (initialize_data_dependence_relation): Do not
	require exact match of DR_BASE_OBJECT but only matching address and
	type.

Index: gcc/tree-data-ref.c
===================================================================
*** gcc/tree-data-ref.c	(revision 236158)
--- gcc/tree-data-ref.c	(working copy)
*************** initialize_data_dependence_relation (str
*** 1538,1545 ****
      }
  
    /* If the references do not access the same object, we do not know
!      whether they alias or not.  */
!   if (!operand_equal_p (DR_BASE_OBJECT (a), DR_BASE_OBJECT (b), 0))
      {
        DDR_ARE_DEPENDENT (res) = chrec_dont_know;
        return res;
--- 1538,1550 ----
      }
  
    /* If the references do not access the same object, we do not know
!      whether they alias or not.  We do not care about TBAA or alignment
!      info so we can use OEP_ADDRESS_OF to avoid false negatives.
!      But the accesses have to use compatible types as otherwise the
!      built indices would not match.  */
!   if (!operand_equal_p (DR_BASE_OBJECT (a), DR_BASE_OBJECT (b), OEP_ADDRESS_OF)
!       || !types_compatible_p (TREE_TYPE (DR_BASE_OBJECT (a)),
! 			      TREE_TYPE (DR_BASE_OBJECT (b))))
      {
        DDR_ARE_DEPENDENT (res) = chrec_dont_know;
        return res;


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