Skip to content

Commit dd692a8

Browse files
committed
apply Jameson' suggestion
1 parent 57c8033 commit dd692a8

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

base/compiler/typeinfer.jl

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,15 +236,21 @@ function _typeinf(interp::AbstractInterpreter, frame::InferenceState)
236236
# with no active ip's, frame is done
237237
frames = frame.callers_in_cycle
238238
isempty(frames) && push!(frames, frame)
239-
valid_worlds = WorldRange()
239+
cycle_valid_worlds = WorldRange()
240+
cycle_effects = EFFECTS_TOTAL
240241
for caller in frames
241242
@assert !(caller.dont_work_on_me)
242243
caller.dont_work_on_me = true
243-
# might might not fully intersect these earlier, so do that now
244-
valid_worlds = intersect(caller.valid_worlds, valid_worlds)
244+
# converge the world age range and effects for this cycle here:
245+
# all frames in the cycle should have the same bits of `valid_worlds` and `effects`
246+
# that are simply the intersection of each partial computation, without having
247+
# dependencies on each other (unlike rt and exct)
248+
cycle_valid_worlds = intersect(cycle_valid_worlds, caller.valid_worlds)
249+
cycle_effects = merge_effects(cycle_effects, caller.ipo_effects)
245250
end
246251
for caller in frames
247-
caller.valid_worlds = valid_worlds
252+
caller.valid_worlds = cycle_valid_worlds
253+
caller.ipo_effects = cycle_effects
248254
finish(caller, caller.interp)
249255
end
250256
for caller in frames

test/compiler/effects.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,7 @@ unknown_sparam_nothrow2(x::Ref{Ref{T}}) where T = (T; nothing)
921921
abstractly_recursive1() = abstractly_recursive2()
922922
abstractly_recursive2() = (Core.Compiler._return_type(abstractly_recursive1, Tuple{}); 1)
923923
abstractly_recursive3() = abstractly_recursive2()
924-
@test Core.Compiler.is_terminates(Base.infer_effects(abstractly_recursive3, ()))
924+
@test_broken Core.Compiler.is_terminates(Base.infer_effects(abstractly_recursive3, ()))
925925
actually_recursive1(x) = actually_recursive2(x)
926926
actually_recursive2(x) = (x <= 0) ? 1 : actually_recursive1(x - 1)
927927
actually_recursive3(x) = actually_recursive2(x)

0 commit comments

Comments
 (0)