Skip to content

Commit 3bd2764

Browse files
committed
Introducing basic_free_stack_if_not_null
1 parent 760c898 commit 3bd2764

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

src/libasr/pass/replace_symbolic.cpp

+15-2
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,19 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
148148
return SubroutineCall(loc, basic_free_stack_sym, {x});
149149
}
150150

151+
ASR::stmt_t *basic_free_stack_if_not_null(const Location &loc, ASR::expr_t *x) {
152+
Vec<ASR::stmt_t*> func_body;
153+
func_body.reserve(al, 1);
154+
func_body.push_back(al, basic_free_stack(loc, x));
155+
ASR::ttype_t *CPtr_type = ASRUtils::TYPE(ASR::make_CPtr_t(al, loc));
156+
ASR::ttype_t *Logical_type = ASRUtils::TYPE(ASR::make_Logical_t(al, loc, 4));
157+
ASR::expr_t* null = ASRUtils::EXPR(ASR::make_PointerNullConstant_t(al, loc, CPtr_type));
158+
ASR::expr_t* cond = ASRUtils::EXPR(ASR::make_CPtrCompare_t(al, loc, x, ASR::cmpopType::NotEq,
159+
null, Logical_type, nullptr));
160+
return ASRUtils::STMT(ASR::make_If_t(al, loc, cond,
161+
func_body.p, func_body.size(), nullptr, 0));
162+
}
163+
151164
ASR::expr_t *basic_new_heap(const Location& loc) {
152165
ASR::symbol_t* basic_new_heap_sym = create_bindc_function(loc,
153166
"basic_new_heap", {}, ASRUtils::TYPE((ASR::make_CPtr_t(al, loc))));
@@ -324,7 +337,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
324337
func_body.from_pointer_n_copy(al, xx.m_body, xx.n_body);
325338

326339
for (ASR::symbol_t* symbol : symbolic_vars_to_free) {
327-
func_body.push_back(al, basic_free_stack(x.base.base.loc,
340+
func_body.push_back(al, basic_free_stack_if_not_null(x.base.base.loc,
328341
ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, symbol))));
329342
}
330343

@@ -1027,7 +1040,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
10271040
// freeing out variables
10281041
if (!symbolic_vars_to_free.empty()){
10291042
for (ASR::symbol_t* symbol : symbolic_vars_to_free) {
1030-
pass_result.push_back(al, basic_free_stack(x.base.base.loc,
1043+
pass_result.push_back(al, basic_free_stack_if_not_null(x.base.base.loc,
10311044
ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, symbol))));
10321045
}
10331046
pass_result.push_back(al, ASRUtils::STMT(ASR::make_Return_t(al, x.base.base.loc)));

0 commit comments

Comments
 (0)