I'm doing a bit of a crazy project where I compile an IR to
'Clang-flavored C99'. The IR guarantees sane overflow/underflow
semantics for signed arithmetic, but as far as I can tell, Clang
doesn't (which is in line with the standard). Does Clang provide any
intrinsics to achieve this, which the optimizers in LLVM will respect?
What exactly does "sane" mean, in your context? If you want wrapping,
you can just write (int)((unsigned)x+(unsigned)y).
-fwrapv should permit signed overflow as well, just like in GCC. Not sure if we pass this flag all the way down, but a quick look at CodeGen does look like we're using the same Add as unsigned integers when -fwrapv is passed.
Wrapping is indeed the behavior I'd like.
It does look like -fwrapv will do the job without any casts, so I'll
try with that.