Bug ID: 84747
           Summary: alias analysis  reports may-conflict for references to
                    disjoint address spaces
           Product: gcc
           Version: 7.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot
          Reporter: stefan at reservoir dot com
  Target Milestone: ---

Created attachment 43584
patch to improve alias analysis for disjoint address spaces

For an out-of-tree target that supports address spaces the aliaser does not
report that references to distinct non-overlapping address spaces don’t
conflict. The following program shows this failure when compiled with gcc 7.3
and ‘–O’:

typedef int v4si __attribute__((__vector_size__(16)));

foo (__seg_gs v4si* ap, v4si* gp)
  *gp += (v4si){1,1,1,1};
  *ap = (v4si){1,2,3,4};
  return *gp;

To wit, the store ‘*ap =’ should not kill the available value of ‘*gp +=’ of
the preceding line, hence no reload of ‘*gp’ should be needed for the return.

The attached patch eliminates the load for the return, both in tree-ssa-alias.c
(ME) and alias.c (BE). The latter is included for completeness.

This target also supports some references to a special address space with some
side effects that cannot be described by the IR. We use intrinsics to perform
these operations. These intrinsics should not kill references to the generic
address space. To accomplish this, the attached patch also provides target
hooks to leave it to the target specific code to decide whether these
intrinsics conflict with other references. These hooks are not yet documented
since I wasn’t sure in which section they should be documented.

Finally, the patch includes a warning for conversions between pointers to
non-overlapping address spaces that are not known to be null pointers, as such
conversions are ill defined.

Reply via email to