From 42192ff41b3b649c7eba560ad44682e29d535d4a Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Sat, 22 Jul 2023 11:43:30 +0530 Subject: [PATCH 01/11] WIP: Implementing Symbolic ASR pass --- src/libasr/CMakeLists.txt | 1 + src/libasr/gen_pass.py | 1 + src/libasr/pass/pass_manager.h | 3 +++ src/libasr/pass/replace_symbolic.cpp | 33 ++++++++++++++++++++++++++++ src/libasr/pass/replace_symbolic.h | 14 ++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 src/libasr/pass/replace_symbolic.cpp create mode 100644 src/libasr/pass/replace_symbolic.h diff --git a/src/libasr/CMakeLists.txt b/src/libasr/CMakeLists.txt index fe702eca7d..d5e41e9b0c 100644 --- a/src/libasr/CMakeLists.txt +++ b/src/libasr/CMakeLists.txt @@ -48,6 +48,7 @@ set(SRC pass/unused_functions.cpp pass/flip_sign.cpp pass/div_to_mul.cpp + pass/replace_symbolic.cpp pass/intrinsic_function.cpp pass/fma.cpp pass/loop_vectorise.cpp diff --git a/src/libasr/gen_pass.py b/src/libasr/gen_pass.py index 42776bdf9c..c77e4c29fd 100644 --- a/src/libasr/gen_pass.py +++ b/src/libasr/gen_pass.py @@ -12,6 +12,7 @@ "replace_implied_do_loops", "replace_init_expr", "inline_function_calls", + "replace_symbolic", "replace_intrinsic_function", "loop_unroll", "loop_vectorise", diff --git a/src/libasr/pass/pass_manager.h b/src/libasr/pass/pass_manager.h index 80f21c2c21..7913cb7891 100644 --- a/src/libasr/pass/pass_manager.h +++ b/src/libasr/pass/pass_manager.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -71,6 +72,7 @@ namespace LCompilers { {"global_stmts", &pass_wrap_global_stmts}, {"implied_do_loops", &pass_replace_implied_do_loops}, {"array_op", &pass_replace_array_op}, + {"symbolic", &pass_replace_symbolic}, {"intrinsic_function", &pass_replace_intrinsic_function}, {"arr_slice", &pass_replace_arr_slice}, {"print_arr", &pass_replace_print_arr}, @@ -203,6 +205,7 @@ namespace LCompilers { "subroutine_from_function", "where", "array_op", + "symbolic", "intrinsic_function", "array_op", "pass_array_by_data", diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp new file mode 100644 index 0000000000..5bbb7d54af --- /dev/null +++ b/src/libasr/pass/replace_symbolic.cpp @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + + +namespace LCompilers { + +using ASR::down_cast; +using ASR::is_a; + + +class ReplaceSymbolicVisitor : public PassUtils::PassVisitor +{ +public: + ReplaceSymbolicVisitor(Allocator &al_) : + PassVisitor(al_, nullptr) { + pass_result.reserve(al, 1); + } +}; + +void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, + const LCompilers::PassOptions& /*pass_options*/) { + ReplaceSymbolicVisitor v(al); + v.visit_TranslationUnit(unit); +} + +} // namespace LCompilers \ No newline at end of file diff --git a/src/libasr/pass/replace_symbolic.h b/src/libasr/pass/replace_symbolic.h new file mode 100644 index 0000000000..7e32aefffc --- /dev/null +++ b/src/libasr/pass/replace_symbolic.h @@ -0,0 +1,14 @@ +#ifndef LIBASR_PASS_REPLACE_SYMBOLIC_H +#define LIBASR_PASS_REPLACE_SYMBOLIC_H + +#include +#include + +namespace LCompilers { + + void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, + const PassOptions &pass_options); + +} // namespace LCompilers + +#endif // LIBASR_PASS_REPLACE_SYMBOLIC_H \ No newline at end of file From a27044c7c2e45f29daa45af66e69dfcc7602a837 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Wed, 26 Jul 2023 10:08:49 +0530 Subject: [PATCH 02/11] Added code for visit_Module, visit_Function and visit_Variable --- src/libasr/pass/replace_symbolic.cpp | 145 +++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index 5bbb7d54af..daf270824f 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -22,6 +22,151 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitorget_scope()) { + this->visit_symbol(*a.second); + if(symbolic_replaces_with_CPtr_Module){ + std::string new_name = current_scope->get_unique_name("basic_new_stack"); + if(current_scope->get_symbol(new_name)) return; + std::string header = "symengine/cwrapper.h"; + SymbolTable *fn_symtab = al.make_new(current_scope); + + Vec args; + { + args.reserve(al, 1); + ASR::ttype_t *arg_type = ASRUtils::TYPE(ASR::make_CPtr_t(al, x.base.base.loc)); + ASR::symbol_t *arg = ASR::down_cast(ASR::make_Variable_t( + al, x.base.base.loc, fn_symtab, s2c(al, "x"), nullptr, 0, ASR::intentType::In, + nullptr, nullptr, ASR::storage_typeType::Default, arg_type, nullptr, + ASR::abiType::BindC, ASR::Public, ASR::presenceType::Required, true)); + fn_symtab->add_symbol(s2c(al, "x"), arg); + args.push_back(al, ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, arg))); + } + Vec body; + body.reserve(al, 1); + + Vec dep; + dep.reserve(al, 1); + + ASR::asr_t* new_subrout = ASRUtils::make_Function_t_util(al, x.base.base.loc, + fn_symtab, s2c(al, new_name), dep.p, dep.n, args.p, args.n, body.p, body.n, + nullptr, ASR::abiType::BindC, ASR::accessType::Public, + ASR::deftypeType::Interface, nullptr, false, false, false, + false, false, nullptr, 0, nullptr, 0, false, false, false, s2c(al, header)); + ASR::symbol_t *new_symbol = ASR::down_cast(new_subrout); + current_scope->add_symbol(new_name, new_symbol); + symbolic_replaces_with_CPtr_Module = false; + } + } + current_scope = current_scope_copy; + } + + void visit_Function(const ASR::Function_t& x) { + ASR::Function_t &xx = const_cast(x); + SymbolTable* current_scope_copy = current_scope; + current_scope = xx.m_symtab; + for (auto &item : current_scope->get_scope()) { + if (is_a(*item.second)) { + this->visit_symbol(*item.second); + if(symbolic_replaces_with_CPtr_Function){ + std::string var = std::string(item.first); + std::string placeholder = "_" + var; + ASR::symbol_t* var_sym = current_scope->get_symbol(var); + ASR::symbol_t* placeholder_sym = current_scope->get_symbol(placeholder); + ASR::expr_t* target1 = ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, placeholder_sym)); + ASR::expr_t* target2 = ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, var_sym)); + + // statement 1 + int cast_kind = ASR::cast_kindType::IntegerToInteger; + ASR::ttype_t *type1 = ASRUtils::TYPE(ASR::make_Integer_t(al, xx.base.base.loc, 4)); + ASR::ttype_t *type2 = ASRUtils::TYPE(ASR::make_Integer_t(al, xx.base.base.loc, 8)); + ASR::expr_t* cast_tar = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, xx.base.base.loc, 0, type1)); + ASR::expr_t* cast_val = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, xx.base.base.loc, 0, type2)); + ASR::expr_t* value1 = ASRUtils::EXPR(ASR::make_Cast_t(al, xx.base.base.loc, cast_tar, (ASR::cast_kindType)cast_kind, type2, cast_val)); + + // statement 2 + ASR::ttype_t *type3 = ASRUtils::TYPE(ASR::make_CPtr_t(al, xx.base.base.loc)); + ASR::expr_t* value2 = ASRUtils::EXPR(ASR::make_PointerNullConstant_t(al, xx.base.base.loc, type3)); + + // statement 3 + ASR::ttype_t *type4 = ASRUtils::TYPE(ASR::make_Pointer_t(al, xx.base.base.loc, type2)); + ASR::expr_t* get_pointer_node = ASRUtils::EXPR(ASR::make_GetPointer_t(al, xx.base.base.loc, target1, type4, nullptr)); + ASR::expr_t* value3 = ASRUtils::EXPR(ASR::make_PointerToCPtr_t(al, xx.base.base.loc, get_pointer_node, type3, nullptr)); + + // statement 4 + ASR::symbol_t* basic_new_stack_sym = current_scope->parent->get_symbol("basic_new_stack"); + Vec call_args; + call_args.reserve(al, 1); + ASR::call_arg_t call_arg; + call_arg.loc = xx.base.base.loc; + call_arg.m_value = target2; + call_args.push_back(al, call_arg); + + // defining the assignment statement + ASR::stmt_t* stmt1 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target1, value1, nullptr)); + ASR::stmt_t* stmt2 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target2, value2, nullptr)); + ASR::stmt_t* stmt3 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target2, value3, nullptr)); + //ASR::stmt_t* stmt4 = ASRUtils::STMT(ASR::make_SubroutineCall_t(al, xx.base.base.loc, basic_new_stack_sym, nullptr, call_args.p, call_args.n, nullptr)); + + // push stmt1 into the updated body vector + pass_result.push_back(al, stmt1); + pass_result.push_back(al, stmt2); + pass_result.push_back(al, stmt3); + //pass_result.push_back(al, stmt4); + + // updated x.m_body and x.n_bdoy with that of the updated vector + // x.m_body = updated_body.p; + // x.n_body = updated_body.size(); + transform_stmts(xx.m_body, xx.n_body); + symbolic_replaces_with_CPtr_Function = false; + } + } + } + current_scope = current_scope_copy; + } + + void visit_Variable(const ASR::Variable_t& x) { + SymbolTable* current_scope_copy = current_scope; + current_scope = x.m_parent_symtab; + if (x.m_type->type == ASR::ttypeType::SymbolicExpression) { + symbolic_replaces_with_CPtr_Module = true; + symbolic_replaces_with_CPtr_Function = true; + std::string var_name = x.m_name; + std::string placeholder = "_" + std::string(x.m_name); + + // defining CPtr variable + ASR::ttype_t *type1 = ASRUtils::TYPE(ASR::make_CPtr_t(al, x.base.base.loc)); + ASR::symbol_t* sym1 = ASR::down_cast( + ASR::make_Variable_t(al, x.base.base.loc, current_scope, + s2c(al, var_name), nullptr, 0, + x.m_intent, nullptr, + nullptr, x.m_storage, + type1, nullptr, x.m_abi, + x.m_access, x.m_presence, + x.m_value_attr)); + + ASR::ttype_t *type2 = ASRUtils::TYPE(ASR::make_Integer_t(al, x.base.base.loc, 8)); + ASR::symbol_t* sym2 = ASR::down_cast( + ASR::make_Variable_t(al, x.base.base.loc, current_scope, + s2c(al, placeholder), nullptr, 0, + x.m_intent, nullptr, + nullptr, x.m_storage, + type2, nullptr, x.m_abi, + x.m_access, x.m_presence, + x.m_value_attr)); + + current_scope->erase_symbol(s2c(al, var_name)); + current_scope->add_symbol(s2c(al, var_name), sym1); + current_scope->add_symbol(s2c(al, placeholder), sym2); + } + current_scope = current_scope_copy; + } }; void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, From 5903e8d503cda9a3f51b0967020c291281727a35 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Wed, 26 Jul 2023 10:35:05 +0530 Subject: [PATCH 03/11] Made some minor changes --- src/libasr/pass/replace_symbolic.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index daf270824f..d7004215b4 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -100,13 +100,13 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitorparent->get_symbol("basic_new_stack"); - Vec call_args; - call_args.reserve(al, 1); - ASR::call_arg_t call_arg; - call_arg.loc = xx.base.base.loc; - call_arg.m_value = target2; - call_args.push_back(al, call_arg); + // ASR::symbol_t* basic_new_stack_sym = current_scope->parent->get_symbol("basic_new_stack"); + // Vec call_args; + // call_args.reserve(al, 1); + // ASR::call_arg_t call_arg; + // call_arg.loc = xx.base.base.loc; + // call_arg.m_value = target2; + // call_args.push_back(al, call_arg); // defining the assignment statement ASR::stmt_t* stmt1 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target1, value1, nullptr)); @@ -132,8 +132,6 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitortype == ASR::ttypeType::SymbolicExpression) { symbolic_replaces_with_CPtr_Module = true; symbolic_replaces_with_CPtr_Function = true; @@ -165,7 +163,6 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitoradd_symbol(s2c(al, var_name), sym1); current_scope->add_symbol(s2c(al, placeholder), sym2); } - current_scope = current_scope_copy; } }; From e77ac838b62721b3cc49af94cc663bce5be81a03 Mon Sep 17 00:00:00 2001 From: Thirumalai-Shaktivel Date: Wed, 26 Jul 2023 18:21:57 +0530 Subject: [PATCH 04/11] debug CI --- src/libasr/pass/replace_symbolic.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index d7004215b4..54c578b4c3 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -57,8 +57,8 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor(new_subrout); current_scope->add_symbol(new_name, new_symbol); symbolic_replaces_with_CPtr_Module = false; @@ -172,4 +172,4 @@ void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, v.visit_TranslationUnit(unit); } -} // namespace LCompilers \ No newline at end of file +} // namespace LCompilers From af4b59e49416b3ceb5f3e67b0d271b6b25ad82e7 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Sat, 22 Jul 2023 11:43:30 +0530 Subject: [PATCH 05/11] WIP: Implementing Symbolic ASR pass --- src/libasr/CMakeLists.txt | 1 + src/libasr/gen_pass.py | 1 + src/libasr/pass/pass_manager.h | 3 +++ src/libasr/pass/replace_symbolic.cpp | 33 ++++++++++++++++++++++++++++ src/libasr/pass/replace_symbolic.h | 14 ++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 src/libasr/pass/replace_symbolic.cpp create mode 100644 src/libasr/pass/replace_symbolic.h diff --git a/src/libasr/CMakeLists.txt b/src/libasr/CMakeLists.txt index fe702eca7d..d5e41e9b0c 100644 --- a/src/libasr/CMakeLists.txt +++ b/src/libasr/CMakeLists.txt @@ -48,6 +48,7 @@ set(SRC pass/unused_functions.cpp pass/flip_sign.cpp pass/div_to_mul.cpp + pass/replace_symbolic.cpp pass/intrinsic_function.cpp pass/fma.cpp pass/loop_vectorise.cpp diff --git a/src/libasr/gen_pass.py b/src/libasr/gen_pass.py index 42776bdf9c..c77e4c29fd 100644 --- a/src/libasr/gen_pass.py +++ b/src/libasr/gen_pass.py @@ -12,6 +12,7 @@ "replace_implied_do_loops", "replace_init_expr", "inline_function_calls", + "replace_symbolic", "replace_intrinsic_function", "loop_unroll", "loop_vectorise", diff --git a/src/libasr/pass/pass_manager.h b/src/libasr/pass/pass_manager.h index 80f21c2c21..7913cb7891 100644 --- a/src/libasr/pass/pass_manager.h +++ b/src/libasr/pass/pass_manager.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -71,6 +72,7 @@ namespace LCompilers { {"global_stmts", &pass_wrap_global_stmts}, {"implied_do_loops", &pass_replace_implied_do_loops}, {"array_op", &pass_replace_array_op}, + {"symbolic", &pass_replace_symbolic}, {"intrinsic_function", &pass_replace_intrinsic_function}, {"arr_slice", &pass_replace_arr_slice}, {"print_arr", &pass_replace_print_arr}, @@ -203,6 +205,7 @@ namespace LCompilers { "subroutine_from_function", "where", "array_op", + "symbolic", "intrinsic_function", "array_op", "pass_array_by_data", diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp new file mode 100644 index 0000000000..5bbb7d54af --- /dev/null +++ b/src/libasr/pass/replace_symbolic.cpp @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + + +namespace LCompilers { + +using ASR::down_cast; +using ASR::is_a; + + +class ReplaceSymbolicVisitor : public PassUtils::PassVisitor +{ +public: + ReplaceSymbolicVisitor(Allocator &al_) : + PassVisitor(al_, nullptr) { + pass_result.reserve(al, 1); + } +}; + +void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, + const LCompilers::PassOptions& /*pass_options*/) { + ReplaceSymbolicVisitor v(al); + v.visit_TranslationUnit(unit); +} + +} // namespace LCompilers \ No newline at end of file diff --git a/src/libasr/pass/replace_symbolic.h b/src/libasr/pass/replace_symbolic.h new file mode 100644 index 0000000000..7e32aefffc --- /dev/null +++ b/src/libasr/pass/replace_symbolic.h @@ -0,0 +1,14 @@ +#ifndef LIBASR_PASS_REPLACE_SYMBOLIC_H +#define LIBASR_PASS_REPLACE_SYMBOLIC_H + +#include +#include + +namespace LCompilers { + + void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, + const PassOptions &pass_options); + +} // namespace LCompilers + +#endif // LIBASR_PASS_REPLACE_SYMBOLIC_H \ No newline at end of file From d8a7d97d45595281f9497828cc182e3dfd6d71fd Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Wed, 26 Jul 2023 10:08:49 +0530 Subject: [PATCH 06/11] Added code for visit_Module, visit_Function and visit_Variable --- src/libasr/pass/replace_symbolic.cpp | 145 +++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index 5bbb7d54af..daf270824f 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -22,6 +22,151 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitorget_scope()) { + this->visit_symbol(*a.second); + if(symbolic_replaces_with_CPtr_Module){ + std::string new_name = current_scope->get_unique_name("basic_new_stack"); + if(current_scope->get_symbol(new_name)) return; + std::string header = "symengine/cwrapper.h"; + SymbolTable *fn_symtab = al.make_new(current_scope); + + Vec args; + { + args.reserve(al, 1); + ASR::ttype_t *arg_type = ASRUtils::TYPE(ASR::make_CPtr_t(al, x.base.base.loc)); + ASR::symbol_t *arg = ASR::down_cast(ASR::make_Variable_t( + al, x.base.base.loc, fn_symtab, s2c(al, "x"), nullptr, 0, ASR::intentType::In, + nullptr, nullptr, ASR::storage_typeType::Default, arg_type, nullptr, + ASR::abiType::BindC, ASR::Public, ASR::presenceType::Required, true)); + fn_symtab->add_symbol(s2c(al, "x"), arg); + args.push_back(al, ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, arg))); + } + Vec body; + body.reserve(al, 1); + + Vec dep; + dep.reserve(al, 1); + + ASR::asr_t* new_subrout = ASRUtils::make_Function_t_util(al, x.base.base.loc, + fn_symtab, s2c(al, new_name), dep.p, dep.n, args.p, args.n, body.p, body.n, + nullptr, ASR::abiType::BindC, ASR::accessType::Public, + ASR::deftypeType::Interface, nullptr, false, false, false, + false, false, nullptr, 0, nullptr, 0, false, false, false, s2c(al, header)); + ASR::symbol_t *new_symbol = ASR::down_cast(new_subrout); + current_scope->add_symbol(new_name, new_symbol); + symbolic_replaces_with_CPtr_Module = false; + } + } + current_scope = current_scope_copy; + } + + void visit_Function(const ASR::Function_t& x) { + ASR::Function_t &xx = const_cast(x); + SymbolTable* current_scope_copy = current_scope; + current_scope = xx.m_symtab; + for (auto &item : current_scope->get_scope()) { + if (is_a(*item.second)) { + this->visit_symbol(*item.second); + if(symbolic_replaces_with_CPtr_Function){ + std::string var = std::string(item.first); + std::string placeholder = "_" + var; + ASR::symbol_t* var_sym = current_scope->get_symbol(var); + ASR::symbol_t* placeholder_sym = current_scope->get_symbol(placeholder); + ASR::expr_t* target1 = ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, placeholder_sym)); + ASR::expr_t* target2 = ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, var_sym)); + + // statement 1 + int cast_kind = ASR::cast_kindType::IntegerToInteger; + ASR::ttype_t *type1 = ASRUtils::TYPE(ASR::make_Integer_t(al, xx.base.base.loc, 4)); + ASR::ttype_t *type2 = ASRUtils::TYPE(ASR::make_Integer_t(al, xx.base.base.loc, 8)); + ASR::expr_t* cast_tar = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, xx.base.base.loc, 0, type1)); + ASR::expr_t* cast_val = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, xx.base.base.loc, 0, type2)); + ASR::expr_t* value1 = ASRUtils::EXPR(ASR::make_Cast_t(al, xx.base.base.loc, cast_tar, (ASR::cast_kindType)cast_kind, type2, cast_val)); + + // statement 2 + ASR::ttype_t *type3 = ASRUtils::TYPE(ASR::make_CPtr_t(al, xx.base.base.loc)); + ASR::expr_t* value2 = ASRUtils::EXPR(ASR::make_PointerNullConstant_t(al, xx.base.base.loc, type3)); + + // statement 3 + ASR::ttype_t *type4 = ASRUtils::TYPE(ASR::make_Pointer_t(al, xx.base.base.loc, type2)); + ASR::expr_t* get_pointer_node = ASRUtils::EXPR(ASR::make_GetPointer_t(al, xx.base.base.loc, target1, type4, nullptr)); + ASR::expr_t* value3 = ASRUtils::EXPR(ASR::make_PointerToCPtr_t(al, xx.base.base.loc, get_pointer_node, type3, nullptr)); + + // statement 4 + ASR::symbol_t* basic_new_stack_sym = current_scope->parent->get_symbol("basic_new_stack"); + Vec call_args; + call_args.reserve(al, 1); + ASR::call_arg_t call_arg; + call_arg.loc = xx.base.base.loc; + call_arg.m_value = target2; + call_args.push_back(al, call_arg); + + // defining the assignment statement + ASR::stmt_t* stmt1 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target1, value1, nullptr)); + ASR::stmt_t* stmt2 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target2, value2, nullptr)); + ASR::stmt_t* stmt3 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target2, value3, nullptr)); + //ASR::stmt_t* stmt4 = ASRUtils::STMT(ASR::make_SubroutineCall_t(al, xx.base.base.loc, basic_new_stack_sym, nullptr, call_args.p, call_args.n, nullptr)); + + // push stmt1 into the updated body vector + pass_result.push_back(al, stmt1); + pass_result.push_back(al, stmt2); + pass_result.push_back(al, stmt3); + //pass_result.push_back(al, stmt4); + + // updated x.m_body and x.n_bdoy with that of the updated vector + // x.m_body = updated_body.p; + // x.n_body = updated_body.size(); + transform_stmts(xx.m_body, xx.n_body); + symbolic_replaces_with_CPtr_Function = false; + } + } + } + current_scope = current_scope_copy; + } + + void visit_Variable(const ASR::Variable_t& x) { + SymbolTable* current_scope_copy = current_scope; + current_scope = x.m_parent_symtab; + if (x.m_type->type == ASR::ttypeType::SymbolicExpression) { + symbolic_replaces_with_CPtr_Module = true; + symbolic_replaces_with_CPtr_Function = true; + std::string var_name = x.m_name; + std::string placeholder = "_" + std::string(x.m_name); + + // defining CPtr variable + ASR::ttype_t *type1 = ASRUtils::TYPE(ASR::make_CPtr_t(al, x.base.base.loc)); + ASR::symbol_t* sym1 = ASR::down_cast( + ASR::make_Variable_t(al, x.base.base.loc, current_scope, + s2c(al, var_name), nullptr, 0, + x.m_intent, nullptr, + nullptr, x.m_storage, + type1, nullptr, x.m_abi, + x.m_access, x.m_presence, + x.m_value_attr)); + + ASR::ttype_t *type2 = ASRUtils::TYPE(ASR::make_Integer_t(al, x.base.base.loc, 8)); + ASR::symbol_t* sym2 = ASR::down_cast( + ASR::make_Variable_t(al, x.base.base.loc, current_scope, + s2c(al, placeholder), nullptr, 0, + x.m_intent, nullptr, + nullptr, x.m_storage, + type2, nullptr, x.m_abi, + x.m_access, x.m_presence, + x.m_value_attr)); + + current_scope->erase_symbol(s2c(al, var_name)); + current_scope->add_symbol(s2c(al, var_name), sym1); + current_scope->add_symbol(s2c(al, placeholder), sym2); + } + current_scope = current_scope_copy; + } }; void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, From f02f5f76bb84fee4be3127d224bfc573398e3333 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Wed, 26 Jul 2023 10:35:05 +0530 Subject: [PATCH 07/11] Made some minor changes --- src/libasr/pass/replace_symbolic.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index daf270824f..d7004215b4 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -100,13 +100,13 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitorparent->get_symbol("basic_new_stack"); - Vec call_args; - call_args.reserve(al, 1); - ASR::call_arg_t call_arg; - call_arg.loc = xx.base.base.loc; - call_arg.m_value = target2; - call_args.push_back(al, call_arg); + // ASR::symbol_t* basic_new_stack_sym = current_scope->parent->get_symbol("basic_new_stack"); + // Vec call_args; + // call_args.reserve(al, 1); + // ASR::call_arg_t call_arg; + // call_arg.loc = xx.base.base.loc; + // call_arg.m_value = target2; + // call_args.push_back(al, call_arg); // defining the assignment statement ASR::stmt_t* stmt1 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target1, value1, nullptr)); @@ -132,8 +132,6 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitortype == ASR::ttypeType::SymbolicExpression) { symbolic_replaces_with_CPtr_Module = true; symbolic_replaces_with_CPtr_Function = true; @@ -165,7 +163,6 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitoradd_symbol(s2c(al, var_name), sym1); current_scope->add_symbol(s2c(al, placeholder), sym2); } - current_scope = current_scope_copy; } }; From 6c2bf834e7406c60ef7c99dae8dbad3f5947d40c Mon Sep 17 00:00:00 2001 From: Thirumalai-Shaktivel Date: Wed, 26 Jul 2023 18:21:57 +0530 Subject: [PATCH 08/11] debug CI --- src/libasr/pass/replace_symbolic.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index d7004215b4..54c578b4c3 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -57,8 +57,8 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor(new_subrout); current_scope->add_symbol(new_name, new_symbol); symbolic_replaces_with_CPtr_Module = false; @@ -172,4 +172,4 @@ void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, v.visit_TranslationUnit(unit); } -} // namespace LCompilers \ No newline at end of file +} // namespace LCompilers From 0a3cd7e1d8c6396237b297c885f85b5ef38db819 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Mon, 31 Jul 2023 11:00:50 +0530 Subject: [PATCH 09/11] Removed visit_Module & visit_Function --- src/libasr/pass/pass_utils.h | 4 + src/libasr/pass/replace_symbolic.cpp | 197 +++++++++++---------------- 2 files changed, 83 insertions(+), 118 deletions(-) diff --git a/src/libasr/pass/pass_utils.h b/src/libasr/pass/pass_utils.h index e0f0cf0083..8fa1d14c66 100644 --- a/src/libasr/pass/pass_utils.h +++ b/src/libasr/pass/pass_utils.h @@ -221,6 +221,10 @@ namespace LCompilers { ASR::AssociateBlock_t *s = ASR::down_cast(item.second); self().visit_AssociateBlock(*s); } + if (ASR::is_a(*item.second)) { + ASR::Variable_t *s = ASR::down_cast(item.second); + self().visit_Variable(*s); + } } this->current_scope = current_scope_copy; } diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index 54c578b4c3..fdb8900698 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -23,147 +23,109 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor(x); SymbolTable* current_scope_copy = current_scope; - current_scope = x.m_symtab; - for (auto &a : x.m_symtab->get_scope()) { - this->visit_symbol(*a.second); - if(symbolic_replaces_with_CPtr_Module){ - std::string new_name = current_scope->get_unique_name("basic_new_stack"); - if(current_scope->get_symbol(new_name)) return; + current_scope = xx.m_parent_symtab; + if (xx.m_type->type == ASR::ttypeType::SymbolicExpression) { + SymbolTable* module_scope = current_scope->parent; + symbolic_replaces_with_CPtr_Function = true; + std::string var_name = xx.m_name; + std::string placeholder = "_" + std::string(var_name); + + // defining CPtr variable + ASR::ttype_t *type1 = ASRUtils::TYPE(ASR::make_CPtr_t(al, xx.base.base.loc)); + xx.m_type = type1; + + ASR::ttype_t *type2 = ASRUtils::TYPE(ASR::make_Integer_t(al, xx.base.base.loc, 8)); + ASR::symbol_t* sym2 = ASR::down_cast( + ASR::make_Variable_t(al, xx.base.base.loc, current_scope, + s2c(al, placeholder), nullptr, 0, + xx.m_intent, nullptr, + nullptr, xx.m_storage, + type2, nullptr, xx.m_abi, + xx.m_access, xx.m_presence, + xx.m_value_attr)); + + current_scope->add_symbol(s2c(al, placeholder), sym2); + + std::string new_name = "basic_new_stack"; + if (!module_scope->get_symbol(new_name)) { std::string header = "symengine/cwrapper.h"; - SymbolTable *fn_symtab = al.make_new(current_scope); + SymbolTable *fn_symtab = al.make_new(module_scope); Vec args; { args.reserve(al, 1); - ASR::ttype_t *arg_type = ASRUtils::TYPE(ASR::make_CPtr_t(al, x.base.base.loc)); ASR::symbol_t *arg = ASR::down_cast(ASR::make_Variable_t( - al, x.base.base.loc, fn_symtab, s2c(al, "x"), nullptr, 0, ASR::intentType::In, - nullptr, nullptr, ASR::storage_typeType::Default, arg_type, nullptr, + al, xx.base.base.loc, fn_symtab, s2c(al, "x"), nullptr, 0, ASR::intentType::In, + nullptr, nullptr, ASR::storage_typeType::Default, type1, nullptr, ASR::abiType::BindC, ASR::Public, ASR::presenceType::Required, true)); fn_symtab->add_symbol(s2c(al, "x"), arg); - args.push_back(al, ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, arg))); + args.push_back(al, ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, arg))); } + Vec body; body.reserve(al, 1); Vec dep; dep.reserve(al, 1); - ASR::asr_t* new_subrout = ASRUtils::make_Function_t_util(al, x.base.base.loc, + ASR::asr_t* new_subrout = ASRUtils::make_Function_t_util(al, xx.base.base.loc, fn_symtab, s2c(al, new_name), dep.p, dep.n, args.p, args.n, body.p, body.n, nullptr, ASR::abiType::BindC, ASR::accessType::Public, ASR::deftypeType::Interface, s2c(al, new_name), false, false, false, - false, false, nullptr, 0, false, false, false); + false, false, nullptr, 0, false, false, false, s2c(al, header)); ASR::symbol_t *new_symbol = ASR::down_cast(new_subrout); - current_scope->add_symbol(new_name, new_symbol); - symbolic_replaces_with_CPtr_Module = false; + module_scope->add_symbol(new_name, new_symbol); } - } - current_scope = current_scope_copy; - } - void visit_Function(const ASR::Function_t& x) { - ASR::Function_t &xx = const_cast(x); - SymbolTable* current_scope_copy = current_scope; - current_scope = xx.m_symtab; - for (auto &item : current_scope->get_scope()) { - if (is_a(*item.second)) { - this->visit_symbol(*item.second); - if(symbolic_replaces_with_CPtr_Function){ - std::string var = std::string(item.first); - std::string placeholder = "_" + var; - ASR::symbol_t* var_sym = current_scope->get_symbol(var); - ASR::symbol_t* placeholder_sym = current_scope->get_symbol(placeholder); - ASR::expr_t* target1 = ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, placeholder_sym)); - ASR::expr_t* target2 = ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, var_sym)); - - // statement 1 - int cast_kind = ASR::cast_kindType::IntegerToInteger; - ASR::ttype_t *type1 = ASRUtils::TYPE(ASR::make_Integer_t(al, xx.base.base.loc, 4)); - ASR::ttype_t *type2 = ASRUtils::TYPE(ASR::make_Integer_t(al, xx.base.base.loc, 8)); - ASR::expr_t* cast_tar = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, xx.base.base.loc, 0, type1)); - ASR::expr_t* cast_val = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, xx.base.base.loc, 0, type2)); - ASR::expr_t* value1 = ASRUtils::EXPR(ASR::make_Cast_t(al, xx.base.base.loc, cast_tar, (ASR::cast_kindType)cast_kind, type2, cast_val)); - - // statement 2 - ASR::ttype_t *type3 = ASRUtils::TYPE(ASR::make_CPtr_t(al, xx.base.base.loc)); - ASR::expr_t* value2 = ASRUtils::EXPR(ASR::make_PointerNullConstant_t(al, xx.base.base.loc, type3)); - - // statement 3 - ASR::ttype_t *type4 = ASRUtils::TYPE(ASR::make_Pointer_t(al, xx.base.base.loc, type2)); - ASR::expr_t* get_pointer_node = ASRUtils::EXPR(ASR::make_GetPointer_t(al, xx.base.base.loc, target1, type4, nullptr)); - ASR::expr_t* value3 = ASRUtils::EXPR(ASR::make_PointerToCPtr_t(al, xx.base.base.loc, get_pointer_node, type3, nullptr)); - - // statement 4 - // ASR::symbol_t* basic_new_stack_sym = current_scope->parent->get_symbol("basic_new_stack"); - // Vec call_args; - // call_args.reserve(al, 1); - // ASR::call_arg_t call_arg; - // call_arg.loc = xx.base.base.loc; - // call_arg.m_value = target2; - // call_args.push_back(al, call_arg); - - // defining the assignment statement - ASR::stmt_t* stmt1 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target1, value1, nullptr)); - ASR::stmt_t* stmt2 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target2, value2, nullptr)); - ASR::stmt_t* stmt3 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target2, value3, nullptr)); - //ASR::stmt_t* stmt4 = ASRUtils::STMT(ASR::make_SubroutineCall_t(al, xx.base.base.loc, basic_new_stack_sym, nullptr, call_args.p, call_args.n, nullptr)); - - // push stmt1 into the updated body vector - pass_result.push_back(al, stmt1); - pass_result.push_back(al, stmt2); - pass_result.push_back(al, stmt3); - //pass_result.push_back(al, stmt4); - - // updated x.m_body and x.n_bdoy with that of the updated vector - // x.m_body = updated_body.p; - // x.n_body = updated_body.size(); - transform_stmts(xx.m_body, xx.n_body); - symbolic_replaces_with_CPtr_Function = false; - } - } + ASR::symbol_t* var_sym = current_scope->get_symbol(var_name); + ASR::symbol_t* placeholder_sym = current_scope->get_symbol(placeholder); + ASR::expr_t* target1 = ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, placeholder_sym)); + ASR::expr_t* target2 = ASRUtils::EXPR(ASR::make_Var_t(al, xx.base.base.loc, var_sym)); + + // statement 1 + ASR::expr_t* value1 = ASRUtils::EXPR(ASR::make_Cast_t(al, xx.base.base.loc, + ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, xx.base.base.loc, 0, + ASRUtils::TYPE(ASR::make_Integer_t(al, xx.base.base.loc, 4)))), + (ASR::cast_kindType)ASR::cast_kindType::IntegerToInteger, type2, + ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, xx.base.base.loc, 0, type2)))); + + // statement 2 + ASR::expr_t* value2 = ASRUtils::EXPR(ASR::make_PointerNullConstant_t(al, xx.base.base.loc, type1)); + + // statement 3 + ASR::expr_t* get_pointer_node = ASRUtils::EXPR(ASR::make_GetPointer_t(al, xx.base.base.loc, + target1, ASRUtils::TYPE(ASR::make_Pointer_t(al, xx.base.base.loc, type2)), nullptr)); + ASR::expr_t* value3 = ASRUtils::EXPR(ASR::make_PointerToCPtr_t(al, xx.base.base.loc, get_pointer_node, + type1, nullptr)); + + // statement 4 + ASR::symbol_t* basic_new_stack_sym = module_scope->get_symbol(new_name); + Vec call_args; + call_args.reserve(al, 1); + ASR::call_arg_t call_arg; + call_arg.loc = xx.base.base.loc; + call_arg.m_value = target2; + call_args.push_back(al, call_arg); + + // defining the assignment statement + ASR::stmt_t* stmt1 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target1, value1, nullptr)); + ASR::stmt_t* stmt2 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target2, value2, nullptr)); + ASR::stmt_t* stmt3 = ASRUtils::STMT(ASR::make_Assignment_t(al, xx.base.base.loc, target2, value3, nullptr)); + ASR::stmt_t* stmt4 = ASRUtils::STMT(ASR::make_SubroutineCall_t(al, xx.base.base.loc, basic_new_stack_sym, + nullptr, call_args.p, call_args.n, nullptr)); + + pass_result.push_back(al, stmt1); + pass_result.push_back(al, stmt2); + pass_result.push_back(al, stmt3); + pass_result.push_back(al, stmt4); + + // update function body using transform_stmts } current_scope = current_scope_copy; } - - void visit_Variable(const ASR::Variable_t& x) { - if (x.m_type->type == ASR::ttypeType::SymbolicExpression) { - symbolic_replaces_with_CPtr_Module = true; - symbolic_replaces_with_CPtr_Function = true; - std::string var_name = x.m_name; - std::string placeholder = "_" + std::string(x.m_name); - - // defining CPtr variable - ASR::ttype_t *type1 = ASRUtils::TYPE(ASR::make_CPtr_t(al, x.base.base.loc)); - ASR::symbol_t* sym1 = ASR::down_cast( - ASR::make_Variable_t(al, x.base.base.loc, current_scope, - s2c(al, var_name), nullptr, 0, - x.m_intent, nullptr, - nullptr, x.m_storage, - type1, nullptr, x.m_abi, - x.m_access, x.m_presence, - x.m_value_attr)); - - ASR::ttype_t *type2 = ASRUtils::TYPE(ASR::make_Integer_t(al, x.base.base.loc, 8)); - ASR::symbol_t* sym2 = ASR::down_cast( - ASR::make_Variable_t(al, x.base.base.loc, current_scope, - s2c(al, placeholder), nullptr, 0, - x.m_intent, nullptr, - nullptr, x.m_storage, - type2, nullptr, x.m_abi, - x.m_access, x.m_presence, - x.m_value_attr)); - - current_scope->erase_symbol(s2c(al, var_name)); - current_scope->add_symbol(s2c(al, var_name), sym1); - current_scope->add_symbol(s2c(al, placeholder), sym2); - } - } }; void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, @@ -171,5 +133,4 @@ void pass_replace_symbolic(Allocator &al, ASR::TranslationUnit_t &unit, ReplaceSymbolicVisitor v(al); v.visit_TranslationUnit(unit); } - -} // namespace LCompilers +} // namespace LCompilers \ No newline at end of file From ba87352faeb4e83980d1559ce7d34197953c3b1a Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Mon, 31 Jul 2023 11:11:29 +0530 Subject: [PATCH 10/11] Removed unused variable --- src/libasr/pass/replace_symbolic.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index fdb8900698..a92894791f 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -29,7 +29,6 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitortype == ASR::ttypeType::SymbolicExpression) { SymbolTable* module_scope = current_scope->parent; - symbolic_replaces_with_CPtr_Function = true; std::string var_name = xx.m_name; std::string placeholder = "_" + std::string(var_name); @@ -117,10 +116,10 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor Date: Mon, 31 Jul 2023 12:47:17 +0530 Subject: [PATCH 11/11] Added visit_Function node --- src/libasr/pass/pass_utils.h | 4 --- src/libasr/pass/replace_symbolic.cpp | 44 +++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/libasr/pass/pass_utils.h b/src/libasr/pass/pass_utils.h index 8fa1d14c66..e0f0cf0083 100644 --- a/src/libasr/pass/pass_utils.h +++ b/src/libasr/pass/pass_utils.h @@ -221,10 +221,6 @@ namespace LCompilers { ASR::AssociateBlock_t *s = ASR::down_cast(item.second); self().visit_AssociateBlock(*s); } - if (ASR::is_a(*item.second)) { - ASR::Variable_t *s = ASR::down_cast(item.second); - self().visit_Variable(*s); - } } this->current_scope = current_scope_copy; } diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index a92894791f..7575b96db6 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -23,12 +23,44 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor(x); + SymbolTable* current_scope_copy = this->current_scope; + this->current_scope = xx.m_symtab; + for (auto &item : x.m_symtab->get_scope()) { + if (ASR::is_a(*item.second)) { + ASR::Variable_t *s = ASR::down_cast(item.second); + this->visit_Variable(*s); + } + } + transform_stmts(xx.m_body, xx.n_body); + + // Add "basic_new_stack" to dependencies if needed + if (symbolic_replaces_with_CPtr_Function) { + SetChar function_dependencies; + function_dependencies.n = 0; + function_dependencies.reserve(al, 1); + for( size_t i = 0; i < xx.n_dependencies; i++ ) { + function_dependencies.push_back(al, xx.m_dependencies[i]); + } + function_dependencies.push_back(al, s2c(al, "basic_new_stack")); + xx.n_dependencies = function_dependencies.size(); + xx.m_dependencies = function_dependencies.p; + } + this->current_scope = current_scope_copy; + } + void visit_Variable(const ASR::Variable_t& x) { ASR::Variable_t& xx = const_cast(x); SymbolTable* current_scope_copy = current_scope; current_scope = xx.m_parent_symtab; if (xx.m_type->type == ASR::ttypeType::SymbolicExpression) { SymbolTable* module_scope = current_scope->parent; + symbolic_replaces_with_CPtr_Function = true; std::string var_name = xx.m_name; std::string placeholder = "_" + std::string(var_name); @@ -114,14 +146,12 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor