From c4b89cf6b44261cbb634133838ea2d5285486ae2 Mon Sep 17 00:00:00 2001 From: Smit-create Date: Mon, 4 Sep 2023 20:44:12 +0530 Subject: [PATCH 1/4] Update fma/flipsign declaration --- src/libasr/pass/flip_sign.cpp | 2 +- src/libasr/pass/fma.cpp | 2 +- src/libasr/pass/pass_utils.h | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libasr/pass/flip_sign.cpp b/src/libasr/pass/flip_sign.cpp index 695aa97a14..7b054a7970 100644 --- a/src/libasr/pass/flip_sign.cpp +++ b/src/libasr/pass/flip_sign.cpp @@ -100,7 +100,7 @@ class FlipSignVisitor : public PassUtils::SkipOptimizationFunctionVisitor } fma_var = PassUtils::get_fma(other_expr, first_arg, second_arg, - al, unit, x.base.base.loc); + al, unit, x.base.base.loc, pass_options); from_fma = false; } diff --git a/src/libasr/pass/pass_utils.h b/src/libasr/pass/pass_utils.h index ed9161bc7a..dfe86cc792 100644 --- a/src/libasr/pass/pass_utils.h +++ b/src/libasr/pass/pass_utils.h @@ -74,7 +74,8 @@ namespace LCompilers { Allocator& al); ASR::expr_t* get_flipsign(ASR::expr_t* arg0, ASR::expr_t* arg1, - Allocator& al, ASR::TranslationUnit_t& unit, const Location& loc); + Allocator& al, ASR::TranslationUnit_t& unit, const Location& loc, + PassOptions pass_options); ASR::expr_t* to_int32(ASR::expr_t* x, ASR::ttype_t* int32type, Allocator& al); @@ -86,7 +87,8 @@ namespace LCompilers { ASR::intentType var_intent=ASR::intentType::Local); ASR::expr_t* get_fma(ASR::expr_t* arg0, ASR::expr_t* arg1, ASR::expr_t* arg2, - Allocator& al, ASR::TranslationUnit_t& unit, Location& loc); + Allocator& al, ASR::TranslationUnit_t& unit, Location& loc, + PassOptions pass_options); ASR::expr_t* get_sign_from_value(ASR::expr_t* arg0, ASR::expr_t* arg1, Allocator& al, ASR::TranslationUnit_t& unit, From 33b15fb3bc3e2fa4ce49921c98b854fbb5eddea6 Mon Sep 17 00:00:00 2001 From: Smit-create Date: Mon, 4 Sep 2023 20:46:31 +0530 Subject: [PATCH 2/4] Add functions ids which needs to be skipped --- src/libasr/utils.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libasr/utils.h b/src/libasr/utils.h index 768d689fa8..48f4d6e3f9 100644 --- a/src/libasr/utils.h +++ b/src/libasr/utils.h @@ -97,6 +97,7 @@ namespace LCompilers { bool verbose = false; // For developer debugging bool pass_cumulative = false; // Apply passes cumulatively bool disable_main = false; + std::vector skip_optimization_func_instantiation; bool module_name_mangling = false; bool global_symbols_mangling = false; bool intrinsic_symbols_mangling = false; From 78efe4f3d5f24cceaa7a44aa3be515313dcf1d91 Mon Sep 17 00:00:00 2001 From: Smit-create Date: Mon, 4 Sep 2023 20:47:46 +0530 Subject: [PATCH 3/4] Update fma/flipsign definitions --- src/libasr/pass/pass_utils.cpp | 40 +++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/libasr/pass/pass_utils.cpp b/src/libasr/pass/pass_utils.cpp index 96a8a608a8..fb9c0a867d 100644 --- a/src/libasr/pass/pass_utils.cpp +++ b/src/libasr/pass/pass_utils.cpp @@ -587,14 +587,34 @@ namespace LCompilers { int32_type, bound_type, nullptr)); } + bool skip_instantiation(PassOptions pass_options, int64_t id) { + if (!pass_options.skip_optimization_func_instantiation.empty()) { + for (size_t i=0; i(ASRUtils::IntrinsicScalarFunctions::FlipSign); + if (skip_instantiation(pass_options, fp_s)) { + Vec args; + args.reserve(al, 2); + args.push_back(al, arg0); + args.push_back(al, arg1); + return ASRUtils::EXPR(ASRUtils::make_IntrinsicScalarFunction_t_util(al, loc, fp_s, + args.p, args.n, 0, type, nullptr)); + } ASRUtils::impl_function instantiate_function = ASRUtils::IntrinsicScalarFunctionRegistry::get_instantiate_function( static_cast(ASRUtils::IntrinsicScalarFunctions::FlipSign)); Vec arg_types; - ASR::ttype_t* type = ASRUtils::expr_type(arg1); arg_types.reserve(al, 2); arg_types.push_back(al, ASRUtils::expr_type(arg0)); arg_types.push_back(al, ASRUtils::expr_type(arg1)); @@ -667,13 +687,23 @@ namespace LCompilers { } ASR::expr_t* get_fma(ASR::expr_t* arg0, ASR::expr_t* arg1, ASR::expr_t* arg2, - Allocator& al, ASR::TranslationUnit_t& unit, Location& loc){ - + Allocator& al, ASR::TranslationUnit_t& unit, Location& loc, + PassOptions pass_options){ + int64_t fma_id = static_cast(ASRUtils::IntrinsicScalarFunctions::FMA); + ASR::ttype_t* type = ASRUtils::expr_type(arg0); + if (skip_instantiation(pass_options, fma_id)) { + Vec args; + args.reserve(al, 3); + args.push_back(al, arg0); + args.push_back(al, arg1); + args.push_back(al, arg2); + return ASRUtils::EXPR(ASRUtils::make_IntrinsicScalarFunction_t_util(al, loc, fma_id, + args.p, args.n, 0, type, nullptr)); + } ASRUtils::impl_function instantiate_function = ASRUtils::IntrinsicScalarFunctionRegistry::get_instantiate_function( static_cast(ASRUtils::IntrinsicScalarFunctions::FMA)); Vec arg_types; - ASR::ttype_t* type = ASRUtils::expr_type(arg0); arg_types.reserve(al, 3); arg_types.push_back(al, ASRUtils::expr_type(arg0)); arg_types.push_back(al, ASRUtils::expr_type(arg1)); From 588ef41e78e92d3961f70f9f4abd73deef24ffc4 Mon Sep 17 00:00:00 2001 From: Smit-create Date: Mon, 4 Sep 2023 20:53:25 +0530 Subject: [PATCH 4/4] LLVM: Use bits implementation for optimization --- src/libasr/codegen/asr_to_llvm.cpp | 31 ++++++++++++++++++- src/libasr/pass/intrinsic_function_registry.h | 2 +- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/libasr/codegen/asr_to_llvm.cpp b/src/libasr/codegen/asr_to_llvm.cpp index ee6533c8f6..abe3756ea0 100644 --- a/src/libasr/codegen/asr_to_llvm.cpp +++ b/src/libasr/codegen/asr_to_llvm.cpp @@ -1884,6 +1884,30 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor } break ; } + case ASRUtils::IntrinsicScalarFunctions::FlipSign: { + Vec args; + args.reserve(al, 2); + ASR::call_arg_t arg0_, arg1_; + arg0_.loc = x.m_args[0]->base.loc, arg0_.m_value = x.m_args[0]; + args.push_back(al, arg0_); + arg1_.loc = x.m_args[1]->base.loc, arg1_.m_value = x.m_args[1]; + args.push_back(al, arg1_); + generate_flip_sign(args.p); + break; + } + case ASRUtils::IntrinsicScalarFunctions::FMA: { + Vec args; + args.reserve(al, 3); + ASR::call_arg_t arg0_, arg1_, arg2_; + arg0_.loc = x.m_args[0]->base.loc, arg0_.m_value = x.m_args[0]; + args.push_back(al, arg0_); + arg1_.loc = x.m_args[1]->base.loc, arg1_.m_value = x.m_args[1]; + args.push_back(al, arg1_); + arg2_.loc = x.m_args[2]->base.loc, arg2_.m_value = x.m_args[2]; + args.push_back(al, arg2_); + generate_fma(args.p); + break; + } default: { throw CodeGenError( ASRUtils::IntrinsicScalarFunctionRegistry:: get_intrinsic_function_name(x.m_intrinsic_id) + @@ -7372,7 +7396,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor llvm::Value* int_var = builder->CreateBitCast(CreateLoad(variable), shifted_signal->getType()); tmp = builder->CreateXor(shifted_signal, int_var); llvm::Type* variable_type = llvm_utils->get_type_from_ttype_t_util(asr_variable->m_type, module.get()); - builder->CreateStore(builder->CreateBitCast(tmp, variable_type->getPointerTo()), variable); + tmp = builder->CreateBitCast(tmp, variable_type); } void generate_fma(ASR::call_arg_t* m_args) { @@ -8300,7 +8324,12 @@ Result> asr_to_llvm(ASR::TranslationUnit_t &asr, pass_options.run_fun = run_fn; pass_options.always_run = false; pass_options.verbose = co.verbose; + std::vector skip_optimization_func_instantiation; + skip_optimization_func_instantiation.push_back(static_cast(ASRUtils::IntrinsicScalarFunctions::FlipSign)); + skip_optimization_func_instantiation.push_back(static_cast(ASRUtils::IntrinsicScalarFunctions::FMA)); + pass_options.skip_optimization_func_instantiation = skip_optimization_func_instantiation; pass_manager.rtlib = co.rtlib; + pass_manager.apply_passes(al, &asr, pass_options, diagnostics); // Uncomment for debugging the ASR after the transformation diff --git a/src/libasr/pass/intrinsic_function_registry.h b/src/libasr/pass/intrinsic_function_registry.h index 1d75041ad1..41921114b9 100644 --- a/src/libasr/pass/intrinsic_function_registry.h +++ b/src/libasr/pass/intrinsic_function_registry.h @@ -2451,7 +2451,7 @@ namespace IntrinsicScalarFunctionRegistry { {static_cast(IntrinsicScalarFunctions::FMA), {&FMA::instantiate_FMA, &FMA::verify_args}}, {static_cast(IntrinsicScalarFunctions::FlipSign), - {&FlipSign::instantiate_FlipSign, &FMA::verify_args}}, + {&FlipSign::instantiate_FlipSign, &FlipSign::verify_args}}, {static_cast(IntrinsicScalarFunctions::Abs), {&Abs::instantiate_Abs, &Abs::verify_args}}, {static_cast(IntrinsicScalarFunctions::Partition),