On 2017-07-25 18:04 +0200, Astor Piaz wrote: > Hi Alexander, > > Thank you, your answer is pretty clear and your example is much better. > > Could I ask you though, why wouldn't this be allowed once the user has > requested -fassociative-math ? Alexander said this is not implemented, but it should be allowed. For integer operands, this is allowed by ISO C/C++ standards. For floating- point operands, this should be allowed by -fassociative-math. > Is there a fundamental problem to provide this optimization or it is > just too difficult? I don't know, but it seems no existing compilers has implemented it yet. > Thanks a lot. > > Best, > -- > Astor > > On Tue, Jul 25, 2017 at 5:11 PM, Alexander Monakov <amonakov@xxxxxxxxx> wrote: > > Hi, > > > > I think what you're asking is not the "usual" loop invariant motion, but rather > > applying distributive law to reductions. In your example you want the optimizer > > to replace > > > > R = 0; > > for ( ... ) > > R += X * C; > > > > by > > > > R = 0; > > for ( ... ) > > R += X; > > R *= C; > > > > We don't do that even for integer operands, the following isn't optimized either: > > (neither do Clang and ICC according to my experiments on gcc.godbolt.org) > > > > int f(int *a) > > { > > int r = 0; > > for (int i = 0; i < 1024; i++) > > r += a[i] * 5; > > return r; > > } > > > > Alexander -- Xi Ruoyao <ryxi@xxxxxxxxxxxxxxxxx> School of Aerospace Science and Technology, Xidian University