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

            Bug ID: 87325
           Summary: determine_base_object does not consider consider
                    address space of base expr
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: saaadhu at gcc dot gnu.org
  Target Milestone: ---

determine_base_object fold_converts the result of build_fold_addr_expr to
ptr_type_node, and this causes wrong code if the addr expr is not in the
generic address space.

struct tagT {
  float x, y, z;
};

const __memx struct tagT ts [3] = { {-1.0, 0.0, -1.0}, {-1.0, 0.0, -1.0},
{-1.0, 0.0, -1.0}};

volatile int n;
extern int foo(const float *a, const float *b);
extern float bar(float x, float y);

int main() {
  float r;
  for (int i = 0; i<n; ++i) {
    r = bar(ts[i].x, ts[i].y);
    if (foo (&r, &ts[i].z))
      abort();
  }
}

For the AVR target, the above code at -O2 causes induction variables to be
created for &ts + 12 and &ts + 16. Because of the above code, neither of them
is a const __memx float * though, which is what they should be.

Snip of *.ivopts

Selected IV set for loop 1 at float.c:14, 4 IVs:
candidate 4 (important)
  var_before i_20
  var_after i_14
  original biv
  type int
  base 0
  step 1
candidate 5
  var_before ivtmp.9_22
  var_after ivtmp.9_6
  incremented before exit test
  type <unnamed-unsigned:24>
  base (<unnamed-unsigned:24>) ((const <address-space-7> float *) &ts + 8)
  step 12
  base object (void *) (&ts)
candidate 12
  var_before ivtmp.16_25
  var_after ivtmp.16_26
  incremented at end
  type unsigned short
  base (unsigned short) (float *) (&ts + 16)
  step 12
  base object (void *) (float *) (&ts + 16)
candidate 14
  var_before ivtmp.18_30
  var_after ivtmp.18_31
  incremented at end
  type unsigned short
  base (unsigned short) (float *) (&ts + 12)
  step 12
  base object (void *) (float *) (&ts + 12)

Reply via email to