@@ -39,8 +39,13 @@ STATISTIC(NumInaccessibleMemOnly,
39
39
STATISTIC (NumReadOnly, " Number of functions inferred as readonly" );
40
40
STATISTIC (NumWriteOnly, " Number of functions inferred as writeonly" );
41
41
STATISTIC (NumArgMemOnly, " Number of functions inferred as argmemonly" );
42
+ STATISTIC (NumWriteErrnoMemOnly,
43
+ " Number of functions inferred as memory(errnomem: write)" );
42
44
STATISTIC (NumInaccessibleMemOrArgMemOnly,
43
45
" Number of functions inferred as inaccessiblemem_or_argmemonly" );
46
+ STATISTIC (
47
+ NumWriteArgumentMemOrErrnoMemOnly,
48
+ " Number of functions inferred as memory(argmem: write, errnomem: write)" );
44
49
STATISTIC (NumNoUnwind, " Number of functions inferred as nounwind" );
45
50
STATISTIC (NumNoCapture, " Number of arguments inferred as nocapture" );
46
51
STATISTIC (NumWriteOnlyArg, " Number of arguments inferred as writeonly" );
@@ -120,6 +125,21 @@ static bool setOnlyAccessesInaccessibleMemOrArgMem(Function &F) {
120
125
return true ;
121
126
}
122
127
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
+
123
143
static bool setDoesNotThrow (Function &F) {
124
144
if (F.doesNotThrow ())
125
145
return false ;
@@ -1149,14 +1169,9 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
1149
1169
case LibFunc_ldexp:
1150
1170
case LibFunc_ldexpf:
1151
1171
case LibFunc_ldexpl:
1172
+ Changed |= setOnlyWritesErrnoMemory (F);
1152
1173
Changed |= setWillReturn (F);
1153
1174
break ;
1154
- case LibFunc_remquo:
1155
- case LibFunc_remquof:
1156
- case LibFunc_remquol:
1157
- Changed |= setDoesNotCapture (F, 2 );
1158
- [[fallthrough]];
1159
- case LibFunc_abs:
1160
1175
case LibFunc_acos:
1161
1176
case LibFunc_acosf:
1162
1177
case LibFunc_acosh:
@@ -1178,15 +1193,9 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
1178
1193
case LibFunc_atanhf:
1179
1194
case LibFunc_atanhl:
1180
1195
case LibFunc_atanl:
1181
- case LibFunc_cbrt:
1182
- case LibFunc_cbrtf:
1183
- case LibFunc_cbrtl:
1184
1196
case LibFunc_ceil:
1185
1197
case LibFunc_ceilf:
1186
1198
case LibFunc_ceill:
1187
- case LibFunc_copysign:
1188
- case LibFunc_copysignf:
1189
- case LibFunc_copysignl:
1190
1199
case LibFunc_cos:
1191
1200
case LibFunc_cosh:
1192
1201
case LibFunc_coshf:
@@ -1210,37 +1219,15 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
1210
1219
case LibFunc_expm1:
1211
1220
case LibFunc_expm1f:
1212
1221
case LibFunc_expm1l:
1213
- case LibFunc_fabs:
1214
- case LibFunc_fabsf:
1215
- case LibFunc_fabsl:
1216
1222
case LibFunc_fdim:
1217
1223
case LibFunc_fdiml:
1218
1224
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:
1234
1225
case LibFunc_fmod:
1235
1226
case LibFunc_fmodf:
1236
1227
case LibFunc_fmodl:
1237
1228
case LibFunc_hypot:
1238
1229
case LibFunc_hypotf:
1239
1230
case LibFunc_hypotl:
1240
- case LibFunc_isascii:
1241
- case LibFunc_isdigit:
1242
- case LibFunc_labs:
1243
- case LibFunc_llabs:
1244
1231
case LibFunc_log:
1245
1232
case LibFunc_log10:
1246
1233
case LibFunc_log10f:
@@ -1259,9 +1246,6 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
1259
1246
case LibFunc_ilogbl:
1260
1247
case LibFunc_logf:
1261
1248
case LibFunc_logl:
1262
- case LibFunc_nearbyint:
1263
- case LibFunc_nearbyintf:
1264
- case LibFunc_nearbyintl:
1265
1249
case LibFunc_pow:
1266
1250
case LibFunc_powf:
1267
1251
case LibFunc_powl:
@@ -1298,26 +1282,68 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
1298
1282
case LibFunc_tanhf:
1299
1283
case LibFunc_tanhl:
1300
1284
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:
1301
1320
case LibFunc_toascii:
1302
1321
case LibFunc_trunc:
1303
1322
case LibFunc_truncf:
1304
1323
case LibFunc_truncl:
1324
+ Changed |= setDoesNotAccessMemory (F);
1325
+ [[fallthrough]];
1326
+ case LibFunc_isascii:
1327
+ case LibFunc_isdigit:
1305
1328
Changed |= setDoesNotThrow (F);
1306
1329
Changed |= setDoesNotFreeMemory (F);
1307
- Changed |= setOnlyWritesMemory (F);
1308
1330
Changed |= setWillReturn (F);
1309
1331
break ;
1310
1332
case LibFunc_sincos:
1311
1333
case LibFunc_sincosf:
1312
1334
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:
1313
1341
Changed |= setDoesNotThrow (F);
1314
1342
Changed |= setDoesNotFreeMemory (F);
1315
- Changed |= setOnlyWritesMemory (F);
1316
- Changed |= setOnlyWritesMemory (F, 1 );
1317
1343
Changed |= setOnlyWritesMemory (F, 2 );
1318
- Changed |= setDoesNotCapture (F, 1 );
1319
1344
Changed |= setDoesNotCapture (F, 2 );
1320
1345
Changed |= setWillReturn (F);
1346
+ Changed |= setOnlyWritesArgMemOrErrnoMem (F);
1321
1347
break ;
1322
1348
default :
1323
1349
// FIXME: It'd be really nice to cover all the library functions we're
0 commit comments