------- Comment #7 from dberlin at gcc dot gnu dot org 2006-12-12 16:49 ------- Subject: Re: reassoc can sometimes get in the way of PRE
> > Here is a slightly modified example that shows that there's still a PRE > opportunity > > void motion_test22(int * data, int i) > { > int j; > if (data[1]) { > data[data[2]] = 2; > j = data[0] * data[3]; > i = i * j; > } > data[4] = data[0] * data[3]; > data[5] = i; > } > > <L0>:; > *((int *) ((unsigned int) *(data + 8B) * 4) + data) = 2; > prephitmp.26 = *data; > prephitmp.31 = *(data + 12B); > i = prephitmp.26 * i * prephitmp.31; > > <L1>:; > *(data + 16B) = prephitmp.31 * prephitmp.26; > *(data + 20B) = i; > return; > > There are 3 multiplications on the L0-L1 path. It should be possible > to only have 2 multiplications on that path. now *this* is a reassoc (or VN) problem. It's not easy to see how to fix it, we can't always guess the right ordering. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30105