@@ -48,9 +48,9 @@ const IR_FLAG_INACCESSIBLEMEM_OR_ARGMEM = one(UInt32) << 11
4848const NUM_IR_FLAGS = 12 # sync with julia.h
4949
5050const IR_FLAGS_EFFECTS =
51- IR_FLAG_CONSISTENT | IR_FLAG_EFFECT_FREE | IR_FLAG_NOTHROW | IR_FLAG_NOUB
51+ IR_FLAG_CONSISTENT | IR_FLAG_EFFECT_FREE | IR_FLAG_NOTHROW | IR_FLAG_TERMINATES | IR_FLAG_NOUB
5252
53- const IR_FLAGS_REMOVABLE = IR_FLAG_EFFECT_FREE | IR_FLAG_NOTHROW
53+ const IR_FLAGS_REMOVABLE = IR_FLAG_EFFECT_FREE | IR_FLAG_NOTHROW | IR_FLAG_TERMINATES
5454
5555const IR_FLAGS_NEEDS_EA = IR_FLAG_EFIIMO | IR_FLAG_INACCESSIBLEMEM_OR_ARGMEM
5656
@@ -69,6 +69,9 @@ function flags_for_effects(effects::Effects)
6969 if is_nothrow (effects)
7070 flags |= IR_FLAG_NOTHROW
7171 end
72+ if is_terminates (effects)
73+ flags |= IR_FLAG_TERMINATES
74+ end
7275 if is_inaccessiblemem_or_argmemonly (effects)
7376 flags |= IR_FLAG_INACCESSIBLEMEM_OR_ARGMEM
7477 end
@@ -338,7 +341,8 @@ function stmt_effect_flags(𝕃ₒ::AbstractLattice, @nospecialize(stmt), @nospe
338341 consistent = is_consistent (effects)
339342 effect_free = is_effect_free (effects)
340343 nothrow = is_nothrow (effects)
341- removable = effect_free & nothrow
344+ terminates = is_terminates (effects)
345+ removable = effect_free & nothrow & terminates
342346 return (consistent, removable, nothrow)
343347 elseif head === :new
344348 return new_expr_effect_flags (𝕃ₒ, args, src)
@@ -349,7 +353,8 @@ function stmt_effect_flags(𝕃ₒ::AbstractLattice, @nospecialize(stmt), @nospe
349353 consistent = is_consistent (effects)
350354 effect_free = is_effect_free (effects)
351355 nothrow = is_nothrow (effects)
352- removable = effect_free & nothrow
356+ terminates = is_terminates (effects)
357+ removable = effect_free & nothrow & terminates
353358 return (consistent, removable, nothrow)
354359 elseif head === :new_opaque_closure
355360 length (args) < 4 && return (false , false , false )
0 commit comments