Skip to content

Commit

Permalink
LLVM: Use bits implementation for optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
Smit-create committed Sep 4, 2023
1 parent 78efe4f commit 588ef41
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
31 changes: 30 additions & 1 deletion src/libasr/codegen/asr_to_llvm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1884,6 +1884,30 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
}
break ;
}
case ASRUtils::IntrinsicScalarFunctions::FlipSign: {
Vec<ASR::call_arg_t> 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<ASR::call_arg_t> 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) +
Expand Down Expand Up @@ -7372,7 +7396,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
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) {
Expand Down Expand Up @@ -8300,7 +8324,12 @@ Result<std::unique_ptr<LLVMModule>> 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<int64_t> skip_optimization_func_instantiation;
skip_optimization_func_instantiation.push_back(static_cast<int64_t>(ASRUtils::IntrinsicScalarFunctions::FlipSign));
skip_optimization_func_instantiation.push_back(static_cast<int64_t>(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
Expand Down
2 changes: 1 addition & 1 deletion src/libasr/pass/intrinsic_function_registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -2451,7 +2451,7 @@ namespace IntrinsicScalarFunctionRegistry {
{static_cast<int64_t>(IntrinsicScalarFunctions::FMA),
{&FMA::instantiate_FMA, &FMA::verify_args}},
{static_cast<int64_t>(IntrinsicScalarFunctions::FlipSign),
{&FlipSign::instantiate_FlipSign, &FMA::verify_args}},
{&FlipSign::instantiate_FlipSign, &FlipSign::verify_args}},
{static_cast<int64_t>(IntrinsicScalarFunctions::Abs),
{&Abs::instantiate_Abs, &Abs::verify_args}},
{static_cast<int64_t>(IntrinsicScalarFunctions::Partition),
Expand Down

0 comments on commit 588ef41

Please sign in to comment.