[RFH] ME optimizes variable assignment away / Fortran bind(C) descriptor conversion

Tobias Burnus tobias@codesourcery.com
Fri Aug 27 16:08:17 GMT 2021


On 27.08.21 17:47, Tobias Burnus wrote at
https://gcc.gnu.org/pipermail/gcc-patches/2021-August/578271.html :

> PS: Current GCC (mainline w/o patch) generates the following.
> [-> with patch, see a-test.f90.*.original.]

I accidentally attached the original dump created by mainline GCC.

For the patched compiler, I did attach the optimized dumps. For
reference, this email now contains the original dump generated with my
patch applied.

Tobias

-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
-------------- next part --------------
__attribute__((fn spec (". . ")))
integer(kind=4) rank_p (struct CFI_cdesc_t & _this)
{
  struct array15_integer(kind=4) this.0;
  struct array15_integer(kind=4) * this;
  signed char idx.1;
  integer(kind=4) rnk;

  this = &this.0;
  this.0.dtype = {.elem_len=4, .type=1};
  this.0.data = _this->base_addr;
  this.0.dtype.rank = _this->rank;
  if (_this->base_addr != 0B)
    {
      this.0.span = _this->dim[0].sm % (integer(kind=8)) _this->elem_len != 0 ? _this->dim[0].sm : (integer(kind=8)) _this->elem_len;
      this.0.offset = 0;
      idx.1 = 0;
      L.1:;
      if (_this->rank <= idx.1) goto L.2;
      this.0.dim[idx.1].lbound = _this->dim[idx.1].lower_bound;
      this.0.dim[idx.1].ubound = _this->dim[idx.1].extent + (this.0.dim[idx.1].lbound + -1);
      this.0.dim[idx.1].stride = _this->dim[idx.1].sm / (integer(kind=8)) _this->elem_len;
      this.0.offset = this.0.offset - this.0.dim[idx.1].stride * this.0.dim[idx.1].lbound;
      idx.1 = idx.1 + 1;
      goto L.1;
      L.2:;
    }
  rnk = (integer(kind=4)) this->dtype.rank;
  return rnk;
}


__attribute__((fn spec (". ")))
void selr_p ()
{
  struct array01_integer(kind=4) intp;
  integer(kind=4) irnk;
  static integer(kind=4) rnk = 1;

  intp.dtype = {.elem_len=4, .rank=1, .type=1};
  intp.span = 0;
  intp.data = 0B;
  {
    struct CFI_cdesc_t01 cfi.2;
    signed char idx.3;

    cfi.2.version = 1;
    cfi.2.rank = 1;
    cfi.2.type = 1025;
    cfi.2.attribute = 0;
    cfi.2.base_addr = intp.data;
    cfi.2.elem_len = 4;
    if (cfi.2.base_addr != 0B)
      {
        idx.3 = 0;
        L.3:;
        if (idx.3 > 0) goto L.4;
        cfi.2.dim[idx.3].lower_bound = intp.dim[idx.3].lbound;
        cfi.2.dim[idx.3].extent = (intp.dim[idx.3].ubound - intp.dim[idx.3].lbound) + 1;
        cfi.2.dim[idx.3].sm = intp.dim[idx.3].stride * intp.span;
        idx.3 = idx.3 + 1;
        goto L.3;
        L.4:;
      }
    irnk = rank_p (&cfi.2);
  }
  if (irnk != rnk)
    {
      _gfortran_stop_numeric (1, 0);
    }
  L.5:;
  if (irnk != 1)
    {
      _gfortran_stop_numeric (2, 0);
    }
  L.6:;
}


__attribute__((externally_visible))
integer(kind=4) main (integer(kind=4) argc, character(kind=1) * * argv)
{
  static integer(kind=4) options.4[7] = {2116, 4095, 0, 1, 1, 0, 31};

  _gfortran_set_args (argc, argv);
  _gfortran_set_options (7, &options.4[0]);
  selr_p ();
  return 0;
}




More information about the Gcc-patches mailing list