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

Re: gcc 4.4.1/linux 64bit: code crashes with -O3, works with -O2


On Sat, Feb 20, 2010 at 1:38 PM, Christoph Rupp <chris@crupp.de> wrote:
> Hi Jonathan & list,
>
> this is a follow-up on an email from mid-january - i had crashes when
> compiling my library with -O3. I fixed all warnings "dereferencing
> type-punned pointer will break
>> strict-aliasing rules" and got it running.
>
> (at least i thought so - now i experience crashes again so maybe i
> just messed up my makefile and falsely thought that everything would
> work)...
>
> I fixed all warnings regarding dereferencing type-punned pointers and
> I compile with -O3 AND -fno-strict-aliasing.
>
> and i still get the same crash as earlier. it does not crash with -O2.
>
> From what i understand the -fno-strict-aliasing should solve the
> problem, but it doesn't.
>
> The function which crashes basically is searching a bitmap for a
> pattern. When the search starts, it uses two pointers to the same
> memory location (u64 ptr for searching in 8byte-steps, char* ptr for
> searching byte-wise). If i understand the aliasing correctly then this
> might cause the problems. I just don't know how to rewrite the
> function - I want to use those two pointers for performance reasons. I
> don't even know if the problem is in this function or if it's
> somewhere else and the crash is just a side-effect of a completely
> different problem.

With -fno-strict-aliasing this is perfectly valid so the problem must be
elsewhere.  It might be alignment related if you do not make sure
that the u64 accesses are properly aligned.  Try -O3 -fno-tree-vectorize
or analyze the crash.

Richard.

> To reproduce:
> wget http://crupp.de/hamsterdb-1.1.3.tar.gz
> tar -zxvf hamsterdb-1.1.3.tar.gz
> cd hamsterdb-1.1.3
> ./configure
> make
> cd unittests
> ./test # <-- will segfault with a bad pointer
>
> Here's my gcc version:
> Using built-in specs.
> Target: x86_64-linux-gnu
> Configured with: ../src/configure -v --with-pkgversion='Ubuntu
> 4.4.1-4ubuntu9'
> --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
> --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
> --enable-shared --enable-multiarch --enable-linker-build-id
> --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
> --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4
> --program-suffix=-4.4 --enable-nls --enable-clocale=gnu
> --enable-libstdcxx-debug --enable-objc-gc --disable-werror
> --with-arch-32=i486 --with-tune=generic --enable-checking=release
> --build=x86_64-linux-gnu --host=x86_64-linux-gnu
> --target=x86_64-linux-gnu
> Thread model: posix
> gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
>
> Thanks for any help,
> Christoph
>
>
> 2010/1/14 Jonathan Wakely <jwakely.gcc@gmail.com>:
>> 2010/1/14 Christoph Rupp:
>>>
>>> To reproduce, these steps are necessary:
>>>
>>> wget http://crupp.de/dl/hamsterdb-1.1.1.tar.gz
>>> tar -zxvf hamsterdb-1.1.1.tar.gz
>>> cd hamsterdb-1.1.1
>>> ./configure --enable-internal
>>> make
>>
>> There are lots of these warnings, which you ignore at your peril:
>>
>> freelist.c:3326: warning: dereferencing type-punned pointer will break
>> strict-aliasing rules
>>
>> ham_info.c:80: warning: dereferencing type-punned pointer will break
>> strict-aliasing rules
>>
>> env.cpp:1804: warning: dereferencing type-punned pointer will break
>> strict-aliasing rules
>>
>> You should probably either fix those warnings, avoid compiling at high
>> optimisation levels, or use -fno-strict-aliasing (which allows the
>> tests to run successfully.)
>>
>


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