On Thu, 2014-10-09 at 19:50 +0000, Joseph S. Myers wrote: > On Thu, 9 Oct 2014, Steve Ellcey wrote: > > > Do you know which pass does the simple > > '(float)function((double)float_val)' demotion? Maybe that would be a > > good place to extend things. > > convert.c does such transformations. Maybe the transformations in there > could move to the match-and-simplify infrastructure - convert.c is not a > particularly good place for optimization, and having similar > transformations scattered around (fold-const, convert.c, front ends, SSA > optimizers) isn't helpful; hopefully match-and-simplify will allow some > unification of this sort of optimization.
I did a quick and dirty experiment with the match-and-simplify branch just to get an idea of what it might be like. The branch built for MIPS right out of the box so that was great and I added a couple of rules (see below) just to see if it would trigger the optimization I wanted and it did. I was impressed with the match-and-simplify infrastructure, it seemed to work quite well. Will this branch be included in GCC 5.0? Steve Ellcey sell...@mips.com Code added to match-builtin.pd: (if (flag_unsafe_math_optimizations) /* Optimize "(float) expN(x)" [where x is type double] to "expNf((float) x)", i.e. call the 'f' single precision func */ (simplify (convert (BUILT_IN_LOG @0)) (if ((TYPE_MODE (type) == SFmode) && (TYPE_MODE (TREE_TYPE (@0)) == DFmode)) (BUILT_IN_LOGF (convert @0)))) ) (if (flag_unsafe_math_optimizations) /* Optimize "(float) expN(x)" [where x is type double] to "expNf((float) x)", i.e. call the 'f' single precision func */ (simplify (convert (BUILT_IN_SIN @0)) (if ((TYPE_MODE (type) == SFmode) && (TYPE_MODE (TREE_TYPE (@0)) == DFmode)) (BUILT_IN_SINF (convert @0)))) )