AnyDSL/impala

Wrong ordering of memory objects for conditionals that may have side effects

Closed this issue · 0 comments

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)