@@ -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
0 commit comments