@@ -1401,3 +1401,37 @@ end == Compiler.EFFECTS_UNKNOWN
1401
1401
@test ! Compiler. intrinsic_nothrow (Core. Intrinsics. fpext, Any[Type{Float32}, Float64])
1402
1402
@test ! Compiler. intrinsic_nothrow (Core. Intrinsics. fpext, Any[Type{Int32}, Float16])
1403
1403
@test ! Compiler. intrinsic_nothrow (Core. Intrinsics. fpext, Any[Type{Float32}, Int16])
1404
+
1405
+ # effects modeling for pointer-related intrinsics
1406
+ let effects = Base. infer_effects (Core. Intrinsics. pointerref, Tuple{Vararg{Any}})
1407
+ @test ! Compiler. is_consistent (effects)
1408
+ @test Compiler. is_effect_free (effects)
1409
+ @test ! Compiler. is_inaccessiblememonly (effects)
1410
+ end
1411
+ let effects = Base. infer_effects (Core. Intrinsics. pointerset, Tuple{Vararg{Any}})
1412
+ @test Compiler. is_consistent (effects)
1413
+ @test ! Compiler. is_effect_free (effects)
1414
+ end
1415
+ # effects modeling for atomic intrinsics
1416
+ # these functions especially need to be marked !effect_free since they imply synchronization
1417
+ for atomicfunc = Any[
1418
+ Core. Intrinsics. atomic_pointerref,
1419
+ Core. Intrinsics. atomic_pointerset,
1420
+ Core. Intrinsics. atomic_pointerswap,
1421
+ Core. Intrinsics. atomic_pointerreplace,
1422
+ Core. Intrinsics. atomic_fence]
1423
+ @test ! Compiler. is_effect_free (Base. infer_effects (atomicfunc, Tuple{Vararg{Any}}))
1424
+ end
1425
+
1426
+ # effects modeling for intrinsics that can do arbitrary things
1427
+ let effects = Base. infer_effects (Core. Intrinsics. llvmcall, Tuple{Vararg{Any}})
1428
+ @test effects == Compiler. Effects ()
1429
+ end
1430
+ let effects = Base. infer_effects (Core. Intrinsics. atomic_pointermodify, Tuple{Vararg{Any}})
1431
+ @test effects == Compiler. Effects ()
1432
+ end
1433
+
1434
+ # JuliaLang/julia#57780
1435
+ let effects = Base. infer_effects (Base. _unsetindex!, (MemoryRef{String},))
1436
+ @test ! Compiler. is_effect_free (effects)
1437
+ end
0 commit comments