IIRC '-Ofast' enables a variety of more aggressive optimizations that gcc nonetheless also offers fine-grained control over. Worth digging into, perhaps?
FWIW, removing both '-Ofast' and '-flto' caused gcc to issue a number of warnings:
Code: Select all
$ ./recompile.sh --rule B2k37/S1e2an3-k6n78
Skipping updates; use --update to update apgluxe automatically.
Ensuring lifelib is up-to-date...
Symmetry unspecified; assuming C1.
Configuring rule B2k37/S1e2an3-k6n78; symmetry C1
Warning: B2k37/S1e2an3-k6n78 interpreted as b2k37s1e2an3-k6n78
Valid symmetry: C1
Compressing 512-bit lookup table for rule b2k37s1e2an3-k6n78...
Creating magic sauce for rule b2k37s1e2an3-k6n78...
...completed.
Success!
g++ -c -Wall -Wextra -pedantic -O3 -funsafe-loop-optimizations -Wunsafe-loop-optimizations -frename-registers -march=native --std=c++11 main.cpp -o main.o
In file included from lifelib/upattern.h:13:0,
from main.cpp:12:
lifelib/bitworld.h: In function ‘std::string apg::canonise_orientation(std::vector<apg::bitworld>&, int, int, int, int, int, int, int, int)’:
lifelib/bitworld.h:104:31: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (int v = 0; v < ((breadth-1)/5)+1; v++) {
~~^~~~~~~~~~~~~~~~~~~
lifelib/bitworld.h: In function ‘std::string apg::canonise_orientation(std::vector<apg::bitworld>&, int, int, int, int, int, int, int, int)’:
lifelib/bitworld.h:104:31: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (int v = 0; v < ((breadth-1)/5)+1; v++) {
~~^~~~~~~~~~~~~~~~~~~
lifelib/bitworld.h: In function ‘std::string apg::canonise_orientation(std::vector<apg::bitworld>&, int, int, int, int, int, int, int, int)’:
lifelib/bitworld.h:104:31: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (int v = 0; v < ((breadth-1)/5)+1; v++) {
~~^~~~~~~~~~~~~~~~~~~
lifelib/bitworld.h: In function ‘std::string apg::canonise_orientation(std::vector<apg::bitworld>&, int, int, int, int, int, int, int, int)’:
lifelib/bitworld.h:104:31: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (int v = 0; v < ((breadth-1)/5)+1; v++) {
~~^~~~~~~~~~~~~~~~~~~
In file included from main.cpp:13:0:
lifelib/classifier.h: In member function ‘std::vector<std::basic_string<char> > apg::base_classifier<M>::pbbosc(apg::pattern, uint64_t, uint64_t) [with int M = 1]’:
lifelib/classifier.h:112:52: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (uint64_t i = 0; i <= period; i++) {
~~^~~~~~~~~
lifelib/classifier.h: In member function ‘std::vector<std::basic_string<char> > apg::base_classifier<M>::pseudoBangBang(apg::pattern, std::vector<apg::bitworld>*) [with int M = 1]’:
lifelib/classifier.h:239:36: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (uint64_t l = 1; l <= label; l++) {
~~^~~~~~~~
In file included from lifelib/pattern2.h:2:0,
from lifelib/classifier.h:2,
from main.cpp:13:
lifelib/lifetree.h: In member function ‘uint64_t apg::lifetree_generic<I, N, J>::bound_recurse(apg::hypernode<I>, int, std::map<std::pair<I, unsigned int>, long unsigned int>*, uint32_t) [with I = unsigned int; int N = 1; J = apg::lifemeta<unsigned int>]’:
lifelib/lifetree.h:723:43: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (int64_t x = 0; x <= nexp; x++) {
~~^~~~~~~
lifelib/lifetree.h:739:43: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (int64_t y = 0; y <= nexp; y++) {
~~^~~~~~~
lifelib/lifetree.h: In member function ‘uint64_t apg::lifetree_generic<I, N, J>::bound_recurse(apg::hypernode<I>, int, std::map<std::pair<I, unsigned int>, long unsigned int>*, uint32_t) [with I = unsigned int; int N = 2; J = apg::lifemeta<unsigned int>]’:
lifelib/lifetree.h:723:43: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (int64_t x = 0; x <= nexp; x++) {
~~^~~~~~~
lifelib/lifetree.h:739:43: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (int64_t y = 0; y <= nexp; y++) {
~~^~~~~~~
g++ -c -Wall -Wextra -pedantic -O3 -funsafe-loop-optimizations -Wunsafe-loop-optimizations -frename-registers -march=native --std=c++11 includes/md5.cpp -o includes/md5.o
includes/md5.cpp: In static member function ‘static void MD5::decode(MD5::uint4*, const uint1*, MD5::size_type)’:
includes/md5.cpp:139:37: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (unsigned int i = 0, j = 0; j < len; i++, j += 4)
~~^~~~~
includes/md5.cpp: In static member function ‘static void MD5::encode(MD5::uint1*, const uint4*, MD5::size_type)’:
includes/md5.cpp:150:34: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (size_type i = 0, j = 0; j < len; i++, j += 4) {
~~^~~~~
includes/md5.cpp: In constructor ‘MD5::MD5(const string&)’:
includes/md5.cpp:274:39: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (i = firstpart; i + blocksize <= length; i += blocksize)
~~~~~~~~~~~~~~^~~~~~~~~
includes/md5.cpp: In member function ‘void MD5::update(const unsigned char*, MD5::size_type)’:
includes/md5.cpp:274:39: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (i = firstpart; i + blocksize <= length; i += blocksize)
~~~~~~~~~~~~~~^~~~~~~~~
includes/md5.cpp: In member function ‘void MD5::update(const char*, MD5::size_type)’:
includes/md5.cpp:274:39: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (i = firstpart; i + blocksize <= length; i += blocksize)
~~~~~~~~~~~~~~^~~~~~~~~
includes/md5.cpp: In function ‘std::string md5(std::string)’:
includes/md5.cpp:274:39: warning: missed loop optimization, the loop counter may overflow [-Wunsafe-loop-optimizations]
for (i = firstpart; i + blocksize <= length; i += blocksize)
~~~~~~~~~~~~~~^~~~~~~~~
g++ -c -Wall -Wextra -pedantic -O3 -funsafe-loop-optimizations -Wunsafe-loop-optimizations -frename-registers -march=native --std=c++11 includes/happyhttp.cpp -o includes/happyhttp.o
g++ -flto -pthread main.o includes/md5.o includes/happyhttp.o -o apgluxe
rm -f main.op includes/md5.op includes/happyhttp.op apgluxe-profile *.gcda */*.gcda
true
true oo o
true oo ooo
true o
true oo ooo
true o o
true o o
true o
apgluxe v4.86-ll2.1.11: Rule b2k37s1e2an3-k6n78 is correctly configured.
Putting in '-flto' again made those disappear.