https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95199

            Bug ID: 95199
           Summary: Remove extra variable created for memory reference in
                    loop vectorization.
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zhoukaipeng3 at huawei dot com
  Target Milestone: ---

The function vect_create_data_ref_ptr created two equal variable for two equal
memory references.

gcc version 11.0.0 20200515 (experimental) (GCC)
Target: aarch64-unknown-linux-gnu
Configured with: ../configure
Command: gcc -O2 -march=armv8.2-a+fp+sve -ftree-vectorize test.c -S

Testcase:
void
foo (double *a, double *b, double m, int inc_x, int inc_y) {
  int ix = 0, iy = 0;
  for (int i = 0; i < 1000; ++i)
    {
      a[ix] += m * b[iy];
      ix += inc_x;
      iy += inc_y;
    }
  return ;
}

Assembly code
.L5:
  ld1d         z3.d, p0/z, [x5, z2.d, lsl 3]
  ld1d         z1.d, p0/z, [x3, z4.d, lsl 3]
  fmad         z1.d, p1/m, z0.d, z3.d
  st1d         z1.d, p0, [x2, z2.d, lsl 3]
  incd         x1
  add          x5, x5, x6
  add          x3, x3, x4
  add          x2, x2, x6
  whilelo      p0.d, x1, x0
  b.any        .L5

x2 is the same as x5.
vectorizable_load and vectorizable_store called vect_create_data_ref_ptr twice
for a[ix].

Dump Log in test.c.161.vect
test.c:4:2: note:  create real_type-pointer variable to type: double 
vectorizing a pointer ref: *a_16(D)
test.c:4:2: note:  created a_16(D)
test.c:4:2: note:  add new stmt: vect__4.5_94 = .MASK_GATHER_LOAD
(vectp_a.3_91, _90, 8, { 0.0, ... }, loop_mask_93);
...
test.c:4:2: note:  create real_type-pointer variable to type: double 
vectorizing a pointer ref: *a_16(D)
test.c:4:2: note:  created a_16(D)
test.c:4:2: note:  add new stmt: .MASK_SCATTER_STORE (vectp_a.11_117, _116, 8,
vect__10.10_108, loop_mask_93);

I plan to add a hash_map to loop_vec_info for dr and the corresponding pointer
created by vect_create_data_ref_ptr. If the dr->ref has been handled, return
the corresponding pointer.

Optimized assembly code
.L3:
  ld1d    z2.d, p0/z, [x0, z1.d, lsl 3]
  ld1d    z0.d, p0/z, [x1, z4.d, lsl 3]
  fmad    z0.d, p1/m, z3.d, z2.d
  st1d    z0.d, p0, [x0, z1.d, lsl 3]
  incd    x2
  add     x0, x0, x5
  add     x1, x1, x4
  whilelo p0.d, w2, w3
  b.any   .L3
  ret

Reply via email to