Skip to content

Commit bb2e304

Browse files
committed
wip: add target test cases
1 parent f6d1f0b commit bb2e304

File tree

1 file changed

+83
-63
lines changed

1 file changed

+83
-63
lines changed

test/compiler/inline.jl

Lines changed: 83 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,14 @@ mutable struct DoAllocWithField
13611361
end
13621362
end
13631363
end
1364+
mutable struct DoAllocWithFieldInter
1365+
x::Int
1366+
end
1367+
function register_finalizer!(obj::DoAllocWithFieldInter)
1368+
finalizer(obj) do this
1369+
add_finalization_count!(this.x)
1370+
end
1371+
end
13641372

13651373
function const_finalization(io)
13661374
for i = 1:1000
@@ -1378,86 +1386,98 @@ let
13781386
end
13791387

13801388
# tests finalizer inlining when def/uses involve control flow
1381-
Base.@assume_effects :nothrow safeprint(@nospecialize x...) = print(x...)
1382-
mutable struct DoAllocWithField
1383-
x
1384-
function DoAllocWithField(x)
1385-
finalizer(new(x)) do this
1386-
nothrow_side_effect(nothing)
1389+
function cfg_finalization1(io)
1390+
for i = -999:1000
1391+
o = DoAllocWithField(i)
1392+
if i == 1000
1393+
safeprint(io, o.x, '\n')
1394+
elseif i > 0
1395+
safeprint(io, o.x)
13871396
end
13881397
end
13891398
end
1390-
mutable struct DoAllocWithFieldInter
1391-
x
1399+
let src = code_typed1(cfg_finalization1, (IO,))
1400+
@test count(isinvoke(:add_finalization_count!), src.code) == 1
13921401
end
1393-
function register_finalizer!(obj::DoAllocWithFieldInter)
1394-
finalizer(obj) do this
1395-
nothrow_side_effect(nothing)
1396-
end
1402+
let
1403+
init_finalization_count!()
1404+
cfg_finalization1(IOBuffer())
1405+
@test get_finalization_count() == 1000
13971406
end
1398-
let src = code_typed1() do
1399-
for i = -1000:1000
1400-
o = DoAllocWithField(i)
1401-
if i == 1000
1402-
safeprint(o.x, '\n')
1403-
elseif i > 0
1404-
safeprint(o.x)
1405-
end
1407+
1408+
function cfg_finalization2(io)
1409+
for i = -999:1000
1410+
o = DoAllocWithField(0)
1411+
o.x = i # with `setfield!`
1412+
if i == 1000
1413+
safeprint(io, o.x, '\n')
1414+
elseif i > 0
1415+
safeprint(io, o.x)
14061416
end
14071417
end
1408-
@test count(isinvoke(:nothrow_side_effect), src.code) == 1
14091418
end
1410-
let src = code_typed1() do
1411-
for i = -1000:1000
1412-
o = DoAllocWithField(0)
1413-
o.x = i # with `setfield!`
1414-
if i == 1000
1415-
safeprint(o.x, '\n')
1416-
elseif i > 0
1417-
safeprint(o.x)
1418-
end
1419-
end
1420-
end
1421-
@test count(isinvoke(:nothrow_side_effect), src.code) == 1
1419+
let src = code_typed1(cfg_finalization2, (IO,))
1420+
@test count(isinvoke(:add_finalization_count!), src.code) == 1
14221421
end
1423-
let src = code_typed1() do
1424-
for i = -1000:1000
1425-
o = DoAllocWithFieldInter(i)
1426-
register_finalizer!(o)
1427-
if i == 1000
1428-
safeprint(o.x, '\n')
1429-
elseif i > 0
1430-
safeprint(o.x)
1431-
end
1422+
let
1423+
init_finalization_count!()
1424+
cfg_finalization2(IOBuffer())
1425+
@test get_finalization_count() == 1000
1426+
end
1427+
1428+
function cfg_finalization3(io)
1429+
for i = -999:1000
1430+
o = DoAllocWithFieldInter(i)
1431+
register_finalizer!(o)
1432+
if i == 1000
1433+
safeprint(io, o.x, '\n')
1434+
elseif i > 0
1435+
safeprint(io, o.x)
14321436
end
14331437
end
1434-
@test count(isinvoke(:nothrow_side_effect), src.code) == 1
14351438
end
1436-
let src = code_typed1() do
1437-
for i = -1000:1000
1438-
o = DoAllocWithFieldInter(0)
1439-
o.x = i # with `setfield!``
1440-
register_finalizer!(o)
1441-
if i == 1000
1442-
safeprint(o.x, '\n')
1443-
elseif i > 0
1444-
safeprint(o.x)
1445-
end
1439+
let src = code_typed1(cfg_finalization3, (IO,))
1440+
@test count(isinvoke(:add_finalization_count!), src.code) == 1
1441+
end
1442+
let
1443+
init_finalization_count!()
1444+
cfg_finalization3(IOBuffer())
1445+
@test get_finalization_count() == 1000
1446+
end
1447+
1448+
function cfg_finalization4(io)
1449+
for i = -999:1000
1450+
o = DoAllocWithFieldInter(0)
1451+
o.x = i # with `setfield!`
1452+
register_finalizer!(o)
1453+
if i == 1000
1454+
safeprint(io, o.x, '\n')
1455+
elseif i > 0
1456+
safeprint(io, o.x)
14461457
end
14471458
end
1448-
@test count(isinvoke(:nothrow_side_effect), src.code) == 1
14491459
end
1450-
let src = code_typed1() do
1451-
for i = -1000:1000
1452-
o = DoAllocWithFieldInter(i)
1453-
if i == 1000
1454-
safeprint(o.x, '\n')
1455-
elseif i > 0
1456-
safeprint(o.x)
1457-
end
1458-
register_finalizer!(o)
1460+
let src = code_typed1(cfg_finalization4, (IO,))
1461+
@test count(isinvoke(:add_finalization_count!), src.code) == 1
1462+
end
1463+
let
1464+
init_finalization_count!()
1465+
cfg_finalization4(IOBuffer())
1466+
@test get_finalization_count() == 1000
1467+
end
1468+
1469+
function cfg_finalization5(io)
1470+
for i = -999:1000
1471+
o = DoAllocWithFieldInter(i)
1472+
if i == 1000
1473+
safeprint(io, o.x, '\n')
1474+
elseif i > 0
1475+
safeprint(io, o.x)
14591476
end
1477+
register_finalizer!(o)
14601478
end
1479+
end
1480+
let src = code_typed1(cfg_finalization5, (IO,))
14611481
# TODO we can fix this case by checking a case when a finalizer block is post-dominated by all the def/uses
14621482
@test_broken count(isinvoke(:nothrow_side_effect), src.code) == 1
14631483
end

0 commit comments

Comments
 (0)