"Replace locked IO with unlocked IO" optimizations


Please check this patch:

as Eli noted, other opinions are highly welcomed…


It's probably worth going into a little more detail... a lot of people read llvmdev, and most of them won't click the link or follow the whole discussion.

The transform in question is replacing "fputc(...)" with "fputc_unlocked(...)" when we can prove the FILE* doesn't escape. The question is whether it's safe for the compiler to emit a call to fputc_unlocked() on Linux, given it's a non-standard extension. The bit I'm most worried about is some user defining a function named fputc_unlocked; it isn't a reserved name according to the C standard, so there's no way to ensure we're actually calling the glibc fputc_unlocked.

Suggestions welcome.


Don’t we generally assume the availability of glibc extensions when -gnu is in the triple? -Hal

So make them available in TLI under the condition T.isGNUEnvironment() would be quite enough?

Currently the patch contains the condition
“if (T.isOSLinux() || (T.isAndroid() && !T.isAndroidVersionLT(28))) {”

Android P’s bionic has them too. But not sure how the ideal condition would like.