On 01/11/2016 03:32 AM, Richard Biener wrote:


Yeah, reassoc is largely about canonicalization.

Plus doing it in TER is almost certainly more complex than getting it right
in reassoc to begin with.

I guess canonicalizing differently is ok but you'll still create
((a & b) & 1) & c then if you only change the above place.
What's best for that expression would depend on factors like whether or not the target can exploit ILP. ie (a & b) & (1 & c) exposes more parallelism while (((a & b) & c) & 1) is not good for parallelism, but does expose the bit test.

reassoc currently generates ((a & 1) & b) & c which is dreadful as there's no ILP or chance of creating a bit test. My patch shuffles things around, but still doesn't expose the ILP or bit test in the 4 operand case. Based on the comments in reassoc, it didn't seem like the author thought anything beyond the 3-operand case was worth handling. So my patch just handles the 3-operand case.




So I'm not sure what pattern the backend is looking for?
It just wants the constant last in the sequence. That exposes bit clear, set, flip, test, etc idioms.



Jeff

Reply via email to