On Tue, Oct 15, 2013 at 03:57:23PM +0800, Zhenqiang Chen wrote: > Is it OK?
Ok, except two comments apparently still need updating. +/* Optimize X == CST1 || X == CST2 + if popcount (CST1 ^ CST2) == 1 into + (X & ~(CST1 ^ CST2)) == (CST1 & ~(CST1 ^ CST2)). + Similarly for ranges. E.g. + X != 2 && X != 3 && X != 10 && X != 11 + will be transformed by the previous optimization into + (X - 2U) <= 1U && (X - 10U) <= 1U + and this loop can transform that into + ((X & ~8) - 2U) <= 1U. */ Here the example is using != and &&, so it is transformed into: !((X - 2U) <= 1U || (X - 10U) <= 1U) (everything is negated at the end, and note || instead of &&, with && it could fold into !(0)) and finally into: !(((X & ~8) - 2U) <= 1U) Or alternatively change the first expression into: X == 2 || X == 3 || X == 10 || X == 11 and the second to: (X - 2U) <= 1U || (X - 10U) <= 1U and the third keep as is. +/* Optimize X == CST1 || X == CST2 + if popcount (CST2 - CST1) == 1 into + ((X - CST1) & ~(CST2 - CST1)) == 0. + Similarly for ranges. E.g. + X == 43 || X == 76 || X == 44 || X == 78 || X == 77 || X == 46 + || X == 75 || X == 45 + will be transformed by the previous optimization into + (X - 43U) <= 3U && (X - 75U) <= 3U + and this loop can transform that into + ((X - 43U) & ~(75U - 43U)) <= 3U. */ Here the example is using == and ||, so the only wrong thing in there is that the second expression should be (X - 43U) <= 3U || (X - 75U) <= 3U Ok with those changes. Jakub