On Mon, Feb 29, 2016 at 11:53 AM, kugan <kugan.vivekanandara...@linaro.org> wrote: >> >> Err. I think the way you implement that in reassoc is ad-hoc and not >> related to reassoc at all. >> >> In fact what reassoc is missing is to handle >> >> -y * z * (-w) * x -> y * x * w * x >> >> thus optimize negates as if they were additional * -1 entries in a >> multiplication chain. And >> then optimize a single remaining * -1 in the result chain to a negate. >> >> Then match.pd handles x + (-y) -> x - y (independent of -frounding-math >> btw). >> >> So no, this isn't ok as-is, IMHO you want to expand the multiplication ops >> chain >> pulling in the * -1 ops (if single-use, of course). >> > > I agree. Here is the updated patch along what you suggested. Does this look > better ?
It looks better but I think you want to do factor_out_negate_expr before the first qsort/optimize_ops_list call to catch -1. * z * (-w) which also means you want to simply append a -1. to the ops list rather than adjusting the result with a negate stmt. You also need to guard all this with ! HONOR_SNANS (type) && (! HONOR_SIGNED_ZEROS (type) || ! COMPLEX_FLOAT_TYPE_P (type)) (see match.pd pattern transforming x * -1. to -x). Richard. > Thanks, > Kugan