>> This patch is to handle simplification of plusminus-mult-with-convert >> expression >> as ((T) X) +- ((T) Y), in which at least one of (X, Y) is result of >> multiplication. >> This is done in forwprop pass. We try to transform it to (T) (X +- Y), and >> resort >> to gimple-matcher to fold (X +- Y) instead of manually code pattern >> recognition. > >I still don't like the complete new function with all its correctness >issues - the existing >fold_plusminus_mult_expr was difficult enough to get correct for >corner cases and >we do have a set of match.pd patterns (partly?) implementing its transforms. > >Looking at > >+unsigned goo (unsigned m_param, unsigned n_param) >+{ >+ unsigned b1 = m_param * (n_param + 2); >+ unsigned b2 = m_param * (n_param + 1); >+ int r = (int)(b1) - (int)(b2); > >it seems we want to simplify (signed)A - (signed)B to >(signed)(A - B) if A - B "simplifies"? I guess > >(simplify > (plusminus (nop_convert @0) (nop_convert? @1)) > (convert (plusminus! @0 @1))) > >probably needs a swapped pattern or not iterate over plus/minus >to handle at least one converted operand and avoid adding >a (plus @0 @1) -> (convert (plus! @0 @1)) rule. > >Even > >(simplify > (minus (nop_convert @0) (nop_convert @1)) > (convert (minus! @0 @1))) > >seems to handle all your testcases already (which means >they are all the same and not very exhaustive...) Yes. This is much simpler.
Thanks, Feng >Richard. > > >> Regards, >> Feng >> --- >> 2020-09-03 Feng Xue <f...@os.amperecomputing.com> >> >> gcc/ >> PR tree-optimization/94234 >> * tree-ssa-forwprop.c (simplify_plusminus_mult_with_convert): New >> function. >> (fwprop_ssa_val): Move it before its new caller. >> (pass_forwprop::execute): Add call to >> simplify_plusminus_mult_with_convert. >> >> gcc/testsuite/ >> PR tree-optimization/94234 >> * gcc.dg/pr94234-3.c: New test. >