Index: llvm/lib/Transforms/Utils/BuildLibCalls.cpp =================================================================== --- llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -37,6 +37,7 @@ STATISTIC(NumArgMemOnly, "Number of functions inferred as argmemonly"); STATISTIC(NumInaccessibleMemOrArgMemOnly, "Number of functions inferred as inaccessiblemem_or_argmemonly"); +STATISTIC(NumGlobalMemOnly, "Number of functions inferred as globalmemonly"); STATISTIC(NumNoUnwind, "Number of functions inferred as nounwind"); STATISTIC(NumNoCapture, "Number of arguments inferred as nocapture"); STATISTIC(NumWriteOnlyArg, "Number of arguments inferred as writeonly"); @@ -87,6 +88,14 @@ return true; } +static bool setOnlyAccessesGlobalMemory(Function &F) { + if (F.onlyAccessesGlobalMemory()) + return false; + F.setOnlyAccessesGlobalMemory(); + ++NumGlobalMemOnly; + return true; +} + static bool setDoesNotThrow(Function &F) { if (F.doesNotThrow()) return false; @@ -1045,26 +1054,68 @@ return Changed; case LibFunc_abs: case LibFunc_acos: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_acosf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_acosh: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_acoshf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_acoshl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_acosl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_asin: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_asinf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_asinh: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_asinhf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_asinhl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_asinl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atan: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atan2: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atan2f: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atan2l: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atanf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atanh: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atanhf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atanhl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_atanl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_cbrt: case LibFunc_cbrtf: case LibFunc_cbrtl: @@ -1075,19 +1126,43 @@ case LibFunc_copysignf: case LibFunc_copysignl: case LibFunc_cos: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_cosh: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_coshf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_coshl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_cosf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_cosl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_cospi: case LibFunc_cospif: case LibFunc_exp: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_expf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_expl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_exp2: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_exp2f: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_exp2l: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_expm1: case LibFunc_expm1f: case LibFunc_expm1l: @@ -1110,33 +1185,75 @@ case LibFunc_fminf: case LibFunc_fminl: case LibFunc_fmod: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_fmodf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_fmodl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_isascii: case LibFunc_isdigit: case LibFunc_labs: case LibFunc_llabs: case LibFunc_log: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log10: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log10f: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log10l: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log1p: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log1pf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log1pl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log2: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log2f: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_log2l: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_logb: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_logbf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_logbl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_logf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_logl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_nearbyint: case LibFunc_nearbyintf: case LibFunc_nearbyintl: case LibFunc_pow: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_powf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_powl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_rint: case LibFunc_rintf: case LibFunc_rintl: @@ -1144,24 +1261,54 @@ case LibFunc_roundf: case LibFunc_roundl: case LibFunc_sin: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_sincospif_stret: case LibFunc_sinf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_sinh: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_sinhf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_sinhl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_sinl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_sinpi: case LibFunc_sinpif: case LibFunc_sqrt: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_sqrtf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_sqrtl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_strnlen: case LibFunc_tan: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_tanf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_tanh: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_tanhf: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_tanhl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_tanl: + Changed |= setOnlyAccessesGlobalMemory(F); + return Changed; case LibFunc_toascii: case LibFunc_trunc: case LibFunc_truncf: