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

--- Comment #13 from dave.anglin at bell dot net ---
On 2018-09-05 8:50 AM, jamborm at gcc dot gnu.org wrote:
> Then I believe SRA is not the culprit, you probably need to trace what
> happens to SR.13 afterwards and whether it is correctly expanded to
> RTL.
I did some more investigation.  It looks like the ifcombine pass does a 
bad transformation:

   <bb 4> [local count: 1014686024]:
   SR.13_1 = MEM[(const struct  &)itCO_2 + 8];
   SR.14_7 = MEM[(const struct  &)itCO_2 + 12];
   if (SR.13_1 == operator!=)
     goto <bb 5>; [30.00%]
   else
     goto <bb 6>; [70.00%]

   <bb 5> [local count: 304405807]:
   if (SR.14_7 == 0)
     goto <bb 7>; [5.50%]
   else
     goto <bb 6>; [94.50%]

transforms to

   <bb 4> [local count: 1014686024]:
   SR.13_1 = MEM[(const struct  &)itCO_2 + 8];
   SR.14_7 = MEM[(const struct  &)itCO_2 + 12];
   _13 = SR.14_7 == 0;
   _12 = SR.13_1 == operator!=;
   _14 = _12 & _13;
   if (_14 != 0)
     goto <bb 6>; [1.65%]
   else
     goto <bb 5>; [98.35%]

Doing a "&" operation on a function pointer looks bad.

Reply via email to