This is the mail archive of the gcc-bugs@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]

[Bug target/77728] New: Miscompilation multiple vector iteration on ARM


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

            Bug ID: 77728
           Summary: Miscompilation multiple vector iteration on ARM
           Product: gcc
           Version: 6.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: yyc1992 at gmail dot com
  Target Milestone: ---

Code to reproduce is at
https://gist.github.com/yuyichao/a66edb9d05d18755fb7587b12e021a8a. The two cpp
files are

```c++
#include <stdint.h>
#include <vector>

typedef std::vector<std::pair<uint64_t, uint64_t>> DWARFAddressRangesVector;

void dumpRanges(const DWARFAddressRangesVector& Ranges) {
    for (const auto &Range: Ranges) {
        (void)Range;
    }
}

void collectChildrenAddressRanges(DWARFAddressRangesVector& Ranges)
{
    const DWARFAddressRangesVector &DIERanges = DWARFAddressRangesVector();
    Ranges.insert(Ranges.end(), DIERanges.begin(), DIERanges.end());
}
```

```c++
#include <stdint.h>
#include <vector>

typedef std::vector<std::pair<uint64_t, uint64_t>> DWARFAddressRangesVector;

void collectAddressRanges(DWARFAddressRangesVector &CURanges,
                          const DWARFAddressRangesVector &CUDIERanges)
{
    CURanges.insert(CURanges.end(), CUDIERanges.begin(), CUDIERanges.end());
}

int main()
{
    std::vector<std::pair<uint64_t, uint64_t>> CURanges;
    std::vector<std::pair<uint64_t, uint64_t>> CUDIERanges{{1, 2}};
    collectAddressRanges(CURanges, CUDIERanges);
    return 0;
}
```

Both compiled with `g++ -O2` and linked together. When running the compiled
program, it raises an exception in the `insert`

```
terminate called after throwing an instance of 'std::length_error'
  what():  vector::_M_range_insert
```

which shouldn't happen. The issue seems to be related to merging duplicated
code since it is important to put the code into two files and the present of
the second .o file is important even though none of the code in it is used. The
iterations also have to be all on the const reference of vector. Removing one
of the const also makes the issue go away.

The g++ is version 6.2.1 from the ArchLinuxARM armv7h repository. This might be
a regression in gcc 5 since other devs using gcc <=4.9 doesn't seem to have
this issue and I was able to reproduce this on archlinux on 4-5 different
systems with gcc >=5.

This causes https://github.com/JuliaLang/julia/issues/14550

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