@@ -48,9 +48,9 @@ const IR_FLAG_INACCESSIBLEMEM_OR_ARGMEM = one(UInt32) << 11
48
48
const NUM_IR_FLAGS = 12 # sync with julia.h
49
49
50
50
const 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
52
52
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
54
54
55
55
const IR_FLAGS_NEEDS_EA = IR_FLAG_EFIIMO | IR_FLAG_INACCESSIBLEMEM_OR_ARGMEM
56
56
@@ -69,6 +69,9 @@ function flags_for_effects(effects::Effects)
69
69
if is_nothrow (effects)
70
70
flags |= IR_FLAG_NOTHROW
71
71
end
72
+ if is_terminates (effects)
73
+ flags |= IR_FLAG_TERMINATES
74
+ end
72
75
if is_inaccessiblemem_or_argmemonly (effects)
73
76
flags |= IR_FLAG_INACCESSIBLEMEM_OR_ARGMEM
74
77
end
@@ -338,7 +341,8 @@ function stmt_effect_flags(𝕃ₒ::AbstractLattice, @nospecialize(stmt), @nospe
338
341
consistent = is_consistent (effects)
339
342
effect_free = is_effect_free (effects)
340
343
nothrow = is_nothrow (effects)
341
- removable = effect_free & nothrow
344
+ terminates = is_terminates (effects)
345
+ removable = effect_free & nothrow & terminates
342
346
return (consistent, removable, nothrow)
343
347
elseif head === :new
344
348
return new_expr_effect_flags (𝕃ₒ, args, src)
@@ -349,7 +353,8 @@ function stmt_effect_flags(𝕃ₒ::AbstractLattice, @nospecialize(stmt), @nospe
349
353
consistent = is_consistent (effects)
350
354
effect_free = is_effect_free (effects)
351
355
nothrow = is_nothrow (effects)
352
- removable = effect_free & nothrow
356
+ terminates = is_terminates (effects)
357
+ removable = effect_free & nothrow & terminates
353
358
return (consistent, removable, nothrow)
354
359
elseif head === :new_opaque_closure
355
360
length (args) < 4 && return (false , false , false )
0 commit comments