On Sat, 2 Nov 2024, Alexander Monakov wrote: > > On Sat, 2 Nov 2024, Sam James wrote: > > > Some references to feed discussion which I had in my logs from > > discussing it with someone the other week after that interaction we > > had with alanc: > > * https://github.com/llvm/llvm-project/issues/28790 (not very > > insightful, other than to show it has a history of confusing people, but > > one might argue that for other (definitely-valid) optimisations) > > * https://github.com/llvm/llvm-project/issues/49826 > > * https://github.com/llvm/llvm-project/issues/51476 > > Thank you. > > I believe in this situation the onus is on us to prove that such transforms > are correct. > > Exhibit A: > > POSIX semantics for malloc involve errno.
I'll note there's the open PR that -fno-math-errno makes us assume malloc doesn't set errno (it helps alias analysis). > Exhibit B: > > malloc is supposed to give unique pointers (without any intervening free's). > However, the proposed patch should be powerful enough to transform > > void f() > { > void *p = __builtin_malloc(1); > if (p) { > asm(""); > f(); > } > __builtin_free(p); > } > > to an infinite loop, but infinite amout of unique pointers is impossible. Heh. I think the f() call will keep the controlling predicate live though so the optimization will break in this case. > In a similar vein, five mallocs, each allocating a quarter of address space, > also seems impossible. > > I am reminded that we take a pretty strict stance against enabling > -fno-math-errno -fno-trapping-math, even though they gate a lot of useful > vectorization. So it's a bit weird we're going so gung-ho with this malloc > elimination. I do hope we re-consider on -fno-trapping-math (given -fno-rounding-math). I also hope we can add a "no-errno" function attribute so lib[cm] can decorate their declarations to indicate whether they chose to set errno or not ... maybe even have a "no-errno(alias)" so you can have double sin(double) __attribute__((no-errno("__ieee754_sin"))); and with -fno-math-errno we could redirect calls to the no-errno alias instead. But I'm veering off-topic here. Richard.