https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88854
--- Comment #6 from Matthias Kretz <kretz at kde dot org> --- Regarding gcc.dg/tree-ssa/ssa-pre-30.c I'd argue that for `bar`, GCC may assume b == 0, because otherwise f would be read both via int and float pointer, which is UB. So bar can be optimized to `foo` shows a case I forgot in my "General rule". Pointers to integers that only differ in signedness can do aliasing loads without UB and thus can't trigger the optimization. And all the other aliasing exceptions listed in http://eel.is/c++draft/basic.lval#11.