@@ -236,15 +236,21 @@ function _typeinf(interp::AbstractInterpreter, frame::InferenceState)
236
236
# with no active ip's, frame is done
237
237
frames = frame. callers_in_cycle
238
238
isempty (frames) && push! (frames, frame)
239
- valid_worlds = WorldRange ()
239
+ cycle_valid_worlds = WorldRange ()
240
+ cycle_effects = EFFECTS_TOTAL
240
241
for caller in frames
241
242
@assert ! (caller. dont_work_on_me)
242
243
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)
245
250
end
246
251
for caller in frames
247
- caller. valid_worlds = valid_worlds
252
+ caller. valid_worlds = cycle_valid_worlds
253
+ caller. ipo_effects = cycle_effects
248
254
finish (caller, caller. interp)
249
255
end
250
256
for caller in frames
0 commit comments