@@ -39,8 +39,13 @@ STATISTIC(NumInaccessibleMemOnly,
3939STATISTIC (NumReadOnly, " Number of functions inferred as readonly" );
4040STATISTIC (NumWriteOnly, " Number of functions inferred as writeonly" );
4141STATISTIC (NumArgMemOnly, " Number of functions inferred as argmemonly" );
42+ STATISTIC (NumWriteErrnoMemOnly,
43+ " Number of functions inferred as memory(errnomem: write)" );
4244STATISTIC (NumInaccessibleMemOrArgMemOnly,
4345 " Number of functions inferred as inaccessiblemem_or_argmemonly" );
46+ STATISTIC (
47+ NumWriteArgumentMemOrErrnoMemOnly,
48+ " Number of functions inferred as memory(argmem: write, errnomem: write)" );
4449STATISTIC (NumNoUnwind, " Number of functions inferred as nounwind" );
4550STATISTIC (NumNoCapture, " Number of arguments inferred as nocapture" );
4651STATISTIC (NumWriteOnlyArg, " Number of arguments inferred as writeonly" );
@@ -120,6 +125,21 @@ static bool setOnlyAccessesInaccessibleMemOrArgMem(Function &F) {
120125 return true ;
121126}
122127
128+ static bool setOnlyWritesErrnoMemory (Function &F) {
129+ if (!setMemoryEffects (F, MemoryEffects::errnoMemOnly (ModRefInfo::Mod)))
130+ return false ;
131+ ++NumWriteErrnoMemOnly;
132+ return true ;
133+ }
134+
135+ static bool setOnlyWritesArgMemOrErrnoMem (Function &F) {
136+ if (!setMemoryEffects (F, MemoryEffects::argumentOrErrnoMemOnly (
137+ ModRefInfo::Mod, ModRefInfo::Mod)))
138+ return false ;
139+ ++NumWriteArgumentMemOrErrnoMemOnly;
140+ return true ;
141+ }
142+
123143static bool setDoesNotThrow (Function &F) {
124144 if (F.doesNotThrow ())
125145 return false ;
@@ -1149,14 +1169,9 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
11491169 case LibFunc_ldexp:
11501170 case LibFunc_ldexpf:
11511171 case LibFunc_ldexpl:
1172+ Changed |= setOnlyWritesErrnoMemory (F);
11521173 Changed |= setWillReturn (F);
11531174 break ;
1154- case LibFunc_remquo:
1155- case LibFunc_remquof:
1156- case LibFunc_remquol:
1157- Changed |= setDoesNotCapture (F, 2 );
1158- [[fallthrough]];
1159- case LibFunc_abs:
11601175 case LibFunc_acos:
11611176 case LibFunc_acosf:
11621177 case LibFunc_acosh:
@@ -1178,15 +1193,9 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
11781193 case LibFunc_atanhf:
11791194 case LibFunc_atanhl:
11801195 case LibFunc_atanl:
1181- case LibFunc_cbrt:
1182- case LibFunc_cbrtf:
1183- case LibFunc_cbrtl:
11841196 case LibFunc_ceil:
11851197 case LibFunc_ceilf:
11861198 case LibFunc_ceill:
1187- case LibFunc_copysign:
1188- case LibFunc_copysignf:
1189- case LibFunc_copysignl:
11901199 case LibFunc_cos:
11911200 case LibFunc_cosh:
11921201 case LibFunc_coshf:
@@ -1210,37 +1219,15 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
12101219 case LibFunc_expm1:
12111220 case LibFunc_expm1f:
12121221 case LibFunc_expm1l:
1213- case LibFunc_fabs:
1214- case LibFunc_fabsf:
1215- case LibFunc_fabsl:
12161222 case LibFunc_fdim:
12171223 case LibFunc_fdiml:
12181224 case LibFunc_fdimf:
1219- case LibFunc_ffs:
1220- case LibFunc_ffsl:
1221- case LibFunc_ffsll:
1222- case LibFunc_floor:
1223- case LibFunc_floorf:
1224- case LibFunc_floorl:
1225- case LibFunc_fls:
1226- case LibFunc_flsl:
1227- case LibFunc_flsll:
1228- case LibFunc_fmax:
1229- case LibFunc_fmaxf:
1230- case LibFunc_fmaxl:
1231- case LibFunc_fmin:
1232- case LibFunc_fminf:
1233- case LibFunc_fminl:
12341225 case LibFunc_fmod:
12351226 case LibFunc_fmodf:
12361227 case LibFunc_fmodl:
12371228 case LibFunc_hypot:
12381229 case LibFunc_hypotf:
12391230 case LibFunc_hypotl:
1240- case LibFunc_isascii:
1241- case LibFunc_isdigit:
1242- case LibFunc_labs:
1243- case LibFunc_llabs:
12441231 case LibFunc_log:
12451232 case LibFunc_log10:
12461233 case LibFunc_log10f:
@@ -1259,9 +1246,6 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
12591246 case LibFunc_ilogbl:
12601247 case LibFunc_logf:
12611248 case LibFunc_logl:
1262- case LibFunc_nearbyint:
1263- case LibFunc_nearbyintf:
1264- case LibFunc_nearbyintl:
12651249 case LibFunc_pow:
12661250 case LibFunc_powf:
12671251 case LibFunc_powl:
@@ -1298,26 +1282,68 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
12981282 case LibFunc_tanhf:
12991283 case LibFunc_tanhl:
13001284 case LibFunc_tanl:
1285+ Changed |= setDoesNotThrow (F);
1286+ Changed |= setDoesNotFreeMemory (F);
1287+ Changed |= setWillReturn (F);
1288+ Changed |= setOnlyWritesErrnoMemory (F);
1289+ break ;
1290+ case LibFunc_abs:
1291+ case LibFunc_cbrt:
1292+ case LibFunc_cbrtf:
1293+ case LibFunc_cbrtl:
1294+ case LibFunc_copysign:
1295+ case LibFunc_copysignf:
1296+ case LibFunc_copysignl:
1297+ case LibFunc_fabs:
1298+ case LibFunc_fabsf:
1299+ case LibFunc_fabsl:
1300+ case LibFunc_ffs:
1301+ case LibFunc_ffsl:
1302+ case LibFunc_ffsll:
1303+ case LibFunc_floor:
1304+ case LibFunc_floorf:
1305+ case LibFunc_floorl:
1306+ case LibFunc_fls:
1307+ case LibFunc_flsl:
1308+ case LibFunc_flsll:
1309+ case LibFunc_fmax:
1310+ case LibFunc_fmaxf:
1311+ case LibFunc_fmaxl:
1312+ case LibFunc_fmin:
1313+ case LibFunc_fminf:
1314+ case LibFunc_fminl:
1315+ case LibFunc_labs:
1316+ case LibFunc_llabs:
1317+ case LibFunc_nearbyint:
1318+ case LibFunc_nearbyintf:
1319+ case LibFunc_nearbyintl:
13011320 case LibFunc_toascii:
13021321 case LibFunc_trunc:
13031322 case LibFunc_truncf:
13041323 case LibFunc_truncl:
1324+ Changed |= setDoesNotAccessMemory (F);
1325+ [[fallthrough]];
1326+ case LibFunc_isascii:
1327+ case LibFunc_isdigit:
13051328 Changed |= setDoesNotThrow (F);
13061329 Changed |= setDoesNotFreeMemory (F);
1307- Changed |= setOnlyWritesMemory (F);
13081330 Changed |= setWillReturn (F);
13091331 break ;
13101332 case LibFunc_sincos:
13111333 case LibFunc_sincosf:
13121334 case LibFunc_sincosl:
1335+ Changed |= setDoesNotCapture (F, 1 );
1336+ Changed |= setOnlyWritesMemory (F, 1 );
1337+ [[fallthrough]];
1338+ case LibFunc_remquo:
1339+ case LibFunc_remquof:
1340+ case LibFunc_remquol:
13131341 Changed |= setDoesNotThrow (F);
13141342 Changed |= setDoesNotFreeMemory (F);
1315- Changed |= setOnlyWritesMemory (F);
1316- Changed |= setOnlyWritesMemory (F, 1 );
13171343 Changed |= setOnlyWritesMemory (F, 2 );
1318- Changed |= setDoesNotCapture (F, 1 );
13191344 Changed |= setDoesNotCapture (F, 2 );
13201345 Changed |= setWillReturn (F);
1346+ Changed |= setOnlyWritesArgMemOrErrnoMem (F);
13211347 break ;
13221348 default :
13231349 // FIXME: It'd be really nice to cover all the library functions we're
0 commit comments