[Bug rtl-optimization/95859] New: Statically true asserts not recognized as such with -O2, but with -O1, -Og, -O3
tobi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Jun 24 07:28:39 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95859
Bug ID: 95859
Summary: Statically true asserts not recognized as such with
-O2, but with -O1, -Og, -O3
Product: gcc
Version: 10.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: tobi at gcc dot gnu.org
Target Milestone: ---
With -O2 compiling for x86-64, the compiler doesn't recognize that a number of
assertions in the code are true and they end up as function calls in the
assembly output. They are removed with -O1, -Og, -O3 but not with -O2 or -O2 +
"all the additional compiler flags for -O3 given in the documentation" (that's
a documentation bug on top of this misoptimization).
The asserts look something like this in the assembled form:
template <N>
assertion(int n) {
assert(n == N);
}
and are only called with compile-time constant arguments, i.e. assertion<3>(3)
and the like.
The final output from the tree passes contains the assertion calls at all
optimization levels, so the rtl optimizers appear to perform worst in -O2 in
this particular case. I don't see why the calls couldn't be removed before
lowering to RTL.
I'm not sure how to extract preprocessed output form the compiler explorer, but
will provide it once I can put my hands on a recent gcc.
Source code reproduced below, the compiler explorer link is here:
https://godbolt.org/z/REJDhy
#include <Eigen/Geometry>
struct m34 {
float m[3][4];
};
typedef Eigen::Transform<double, 3, Eigen::AffineCompact, Eigen::DontAlign>
unalignedTrafo3d;
using Trafo3d = unalignedTrafo3d;
Trafo3d func34(m34 mat)
{
using mapType = Eigen::Map<Eigen::Matrix<float, 3, 4, Eigen::RowMajor>>;
// should compile to a conversion of 12 floats to double.
auto mR = Trafo3d{ mapType{ (float*)mat.m }.cast<double>() };
return mR;
}
More information about the Gcc-bugs
mailing list