On Tue, Jan 26, 2021 at 7:45 PM Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> wrote: > > This series fixes and improves the simplification and the > canonicalization of signed compares. Hmm. Sorry for not replying earlier, but I just checked the most common simplification of signed compares, and it didn't work. This: _Bool test(int a) { return a >=0 && a < 16; } should simplify to be the same as _Bool test(int a) { return (unsigned)a < 16; } but it doesn't. It generates the silly - but straightforward - "two comparisons and a 'and' of the result". In fact, the recent canonicalizations means that the compare against zero is actually pessimised, and ">= 0" becomes "> 0xffffffff", which is often a much more expensive operation. This came up because I was looking at some kernel code that did exactly that "check that a signed value is within proper bounds", and the zero check is a very common bound. Linus