Wrong ordering of memory objects for conditionals that may have side effects
Closed this issue · 0 comments
stlemme commented
Impala segfaults on windows for the following code:
fn @scalar(f: f32) -> f32 { f }
fn main() -> i32 {
let mut value = 1.f;
if 1.f < scalar(0.01f) || 0.2f < scalar(0.01f) || 0.3f < scalar(0.01f) {
value = 0.7f;
}
if value == 1.0f { 0 } else { 1 }
}
Generated thorin code:
main_10(mem mem_11, fn(mem, qs32) return_12) extern @(bool 0, bool 0)
(mem, frame) _20 = enter mem_11
mem _21 = extract _20, qu32 0
frame _22 = extract _20, qu32 1
pf32* value_24 = slot _22
mem value_25 = store _21, value_24, pf32 1
scalar_6(value_25, pf32 0.01, scalar_cont_42)
scalar_cont_42(mem mem_43, pf32 scalar_44)
bool _45 = lt pf32 1, scalar_44
br_1(_45, or_lhs_t_36, or_lhs_f_37)
or_lhs_f_37()
scalar_6(mem_43, pf32 0.01, scalar_cont_47)
scalar_cont_47(mem mem_48, pf32 scalar_49)
bool _50 = lt pf32 0.2, scalar_49
or_result_38(mem_48, _50)
or_lhs_t_36()
or_result_38(mem_48, bool 1)
or_result_38(mem mem_39, bool or_result_40)
br_1(or_result_40, or_lhs_t_31, or_lhs_f_32)
or_lhs_f_32()
scalar_6(mem_39, pf32 0.01, scalar_cont_52)
scalar_cont_52(mem mem_53, pf32 scalar_54)
bool _55 = lt pf32 0.3, scalar_54
or_result_33(mem_53, _55)
or_lhs_t_31()
or_result_33(mem_53, bool 1)
or_result_33(mem mem_34, bool or_result_35)
br_1(or_result_35, if_then_26, if_else_27)
if_else_27()
if_join_28(mem_34, tuple ())
if_then_26()
mem _57 = store mem_34, value_24, pf32 0.7
if_join_28(_57, tuple ())
if_join_28(mem mem_29, () if_join_30)
(mem, pf32) _64 = load mem_29, value_24
mem _65 = extract _64, qu32 0
pf32 _66 = extract _64, qu32 1
bool _67 = eq _66, pf32 1
br_1(_67, if_then_59, if_else_60)
if_else_60()
if_join_61(_65, qs32 1)
if_then_59()
if_join_61(_65, qs32 0)
if_join_61(mem mem_62, qs32 if_join_63)
return_12(mem_62, if_join_63)
br_1(bool br_2, fn() br_3, fn() br_4)
scalar_6(mem mem_7, pf32 f_8, fn(mem, pf32) return_9) @(bool 1, bool 1, bool 1)
(mem, frame) _13 = enter mem_7
mem _15 = extract _13, qu32 0
return_9(_15, f_8)