[Bug tree-optimization/86062] New: Missed redundancy elimination with struct and array
glisse at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Jun 5 23:24:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86062
Bug ID: 86062
Summary: Missed redundancy elimination with struct and array
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: glisse at gcc dot gnu.org
Target Milestone: ---
#include <array>
struct I { double i,s; I(double d):i(d),s(d){} };
typedef std::array<double,3> P;
typedef std::array<I,3> AP;
static AP c(P const&p){
return {p[0],p[1],p[2]};
}
template<class T> auto const& ac(T const&p, int n){return p[n];}
static double g(P const&p, int n)
{
I res = ac(c(p),n);
return res.s-res.i;
}
__attribute__((flatten)) double fff(P p){ return g(p,1); }
compiles at -O2 to the following
double res$8;
struct AP D.30336;
struct I res;
double _2;
double _3;
<bb 2> [local count: 1073741825]:
_2 = MEM[(const value_type &)&p + 8];
MEM[(const struct I &)&D.30336 + 16] = _2;
MEM[(const struct I &)&D.30336 + 24] = _2;
res = MEM[(const struct I &)&D.30336][1];
res$8_13 = MEM[(struct I *)&res + 8B];
D.30336 ={v} {CLOBBER};
_3 = res$8_13 - _2;
return _3;
Or with -O3
double res$8;
struct AP D.30336;
struct I res;
double _2;
double _3;
vector(2) double _9;
<bb 2> [local count: 1073741825]:
_2 = MEM[(const value_type &)&p + 8];
_9 = {_2, _2};
MEM[(const struct I &)&D.30336 + 16] = _9;
res = MEM[(const struct I &)&D.30336][1];
res$8_13 = MEM[(struct I *)&res + 8B];
D.30336 ={v} {CLOBBER};
_3 = res$8_13 - _2;
return _3;
While we should be able to notice that res$8_13 and 2 are the same (and thus
simplify to 0 with -ffast-math).
More information about the Gcc-bugs
mailing list