summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mir/optimise.cpp95
1 files changed, 69 insertions, 26 deletions
diff --git a/src/mir/optimise.cpp b/src/mir/optimise.cpp
index 6fda84df..537d6d66 100644
--- a/src/mir/optimise.cpp
+++ b/src/mir/optimise.cpp
@@ -223,17 +223,8 @@ namespace {
self_ty(nullptr)
{}
- ::HIR::TypeRef monomorph(const Span& sp, const ::HIR::TypeRef& ty) const {
- return monomorphise_type_with(sp, ty, monomorphise_type_get_cb(sp, self_ty, &impl_params, fcn_params, nullptr));
- }
- ::HIR::GenericPath monomorph(const Span& sp, const ::HIR::GenericPath& ty) const {
- return monomorphise_genericpath_with(sp, ty, monomorphise_type_get_cb(sp, self_ty, &impl_params, fcn_params, nullptr), false);
- }
- ::HIR::Path monomorph(const Span& sp, const ::HIR::Path& ty) const {
- return monomorphise_path_with(sp, ty, monomorphise_type_get_cb(sp, self_ty, &impl_params, fcn_params, nullptr), false);
- }
- ::HIR::PathParams monomorph(const Span& sp, const ::HIR::PathParams& ty) const {
- return monomorphise_path_params_with(sp, ty, monomorphise_type_get_cb(sp, self_ty, &impl_params, fcn_params, nullptr), false);
+ t_cb_generic get_cb(const Span& sp) const {
+ return monomorphise_type_get_cb(sp, self_ty, &impl_params, fcn_params, nullptr);
}
};
const ::MIR::Function* get_called_mir(const ::MIR::TypeResolve& state, const ::HIR::Path& path, ParamsSet& params)
@@ -418,6 +409,7 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
struct Cloner
{
const Span& sp;
+ const ::StaticTraitResolve& resolve;
const ::MIR::Terminator::Data_Call& te;
ParamsSet params;
unsigned int bb_base = ~0u;
@@ -425,10 +417,59 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
unsigned int var_base = ~0u;
unsigned int df_base = ~0u;
- Cloner(const Span& sp, ::MIR::Terminator::Data_Call& te):
- sp(sp), te(te)
+ Cloner(const Span& sp, const ::StaticTraitResolve& resolve, ::MIR::Terminator::Data_Call& te):
+ sp(sp),
+ resolve(resolve),
+ te(te)
{}
+ // TODO: Expand associated types
+ ::HIR::TypeRef monomorph(const ::HIR::TypeRef& ty) const {
+ auto rv = monomorphise_type_with(sp, ty, params.get_cb(sp));
+ resolve.expand_associated_types(sp, rv);
+ return rv;
+ }
+ ::HIR::GenericPath monomorph(const ::HIR::GenericPath& ty) const {
+ auto rv = monomorphise_genericpath_with(sp, ty, params.get_cb(sp), false);
+ for(auto& arg : rv.m_params.m_types)
+ resolve.expand_associated_types(sp, arg);
+ return rv;
+ }
+ ::HIR::Path monomorph(const ::HIR::Path& ty) const {
+ auto rv = monomorphise_path_with(sp, ty, params.get_cb(sp), false);
+ TU_MATCH(::HIR::Path::Data, (rv.m_data), (e2),
+ (Generic,
+ for(auto& arg : e2.m_params.m_types)
+ resolve.expand_associated_types(sp, arg);
+ ),
+ (UfcsInherent,
+ resolve.expand_associated_types(sp, *e2.type);
+ for(auto& arg : e2.params.m_types)
+ resolve.expand_associated_types(sp, arg);
+ // TODO: impl params too?
+ for(auto& arg : e2.impl_params.m_types)
+ resolve.expand_associated_types(sp, arg);
+ ),
+ (UfcsKnown,
+ resolve.expand_associated_types(sp, *e2.type);
+ for(auto& arg : e2.trait.m_params.m_types)
+ resolve.expand_associated_types(sp, arg);
+ for(auto& arg : e2.params.m_types)
+ resolve.expand_associated_types(sp, arg);
+ ),
+ (UfcsUnknown,
+ BUG(sp, "Encountered UfcsUnknown");
+ )
+ )
+ return rv;
+ }
+ ::HIR::PathParams monomorph(const ::HIR::PathParams& ty) const {
+ auto rv = monomorphise_path_params_with(sp, ty, params.get_cb(sp), false);
+ for(auto& arg : rv.m_types)
+ resolve.expand_associated_types(sp, arg);
+ return rv;
+ }
+
::MIR::BasicBlock clone_bb(const ::MIR::BasicBlock& src) const
{
::MIR::BasicBlock rv;
@@ -514,10 +555,10 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
tgt = ::MIR::CallTarget::make_Value( this->clone_lval(ste) );
),
(Path,
- tgt = ::MIR::CallTarget::make_Path( this->params.monomorph(this->sp, ste) );
+ tgt = ::MIR::CallTarget::make_Path( this->monomorph(ste) );
),
(Intrinsic,
- tgt = ::MIR::CallTarget::make_Intrinsic({ ste.name, this->params.monomorph(this->sp, ste.params) });
+ tgt = ::MIR::CallTarget::make_Intrinsic({ ste.name, this->monomorph(ste.params) });
)
)
return ::MIR::Terminator::make_Call({
@@ -563,7 +604,7 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
return this->te.ret_val.clone();
),
(Static,
- return this->params.monomorph( this->sp, se );
+ return this->monomorph( se );
),
(Deref,
@@ -599,10 +640,10 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
(Bytes, return ::MIR::Constant(ce);),
(StaticString, return ::MIR::Constant(ce);),
(Const,
- return ::MIR::Constant::make_Const({ this->params.monomorph(this->sp, ce.p) });
+ return ::MIR::Constant::make_Const({ this->monomorph(ce.p) });
),
(ItemAddr,
- return ::MIR::Constant::make_ItemAddr(this->params.monomorph(this->sp, ce));
+ return ::MIR::Constant::make_ItemAddr(this->monomorph(ce));
)
)
),
@@ -614,7 +655,7 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
return ::MIR::RValue::make_Borrow({ se.region, se.type, this->clone_lval(se.val) });
),
(Cast,
- return ::MIR::RValue::make_Cast({ this->clone_lval(se.val), this->params.monomorph(this->sp, se.type) });
+ return ::MIR::RValue::make_Cast({ this->clone_lval(se.val), this->monomorph(se.type) });
),
(BinOp,
return ::MIR::RValue::make_BinOp({ this->clone_lval(se.val_l), se.op, this->clone_lval(se.val_r) });
@@ -638,16 +679,17 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
return ::MIR::RValue::make_Array({ this->clone_lval_vec(se.vals) });
),
(Variant,
- return ::MIR::RValue::make_Variant({ this->params.monomorph(this->sp, se.path), se.index, this->clone_lval(se.val) });
+ return ::MIR::RValue::make_Variant({ this->monomorph(se.path), se.index, this->clone_lval(se.val) });
),
(Struct,
- return ::MIR::RValue::make_Struct({ this->params.monomorph(this->sp, se.path), se.variant_idx, this->clone_lval_vec(se.vals) });
+ return ::MIR::RValue::make_Struct({ this->monomorph(se.path), se.variant_idx, this->clone_lval_vec(se.vals) });
)
)
throw "";
}
};
+ bool inline_happened = false;
for(unsigned int i = 0; i < fcn.blocks.size(); i ++)
{
state.set_cur_stmt_term(i);
@@ -656,7 +698,7 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
if( ! te->fcn.is_Path() )
continue ;
- Cloner cloner { state.sp, *te };
+ Cloner cloner { state.sp, state.m_resolve, *te };
const auto* called_mir = get_called_mir(state, te->fcn.as_Path(), cloner.params);
if( !called_mir )
continue ;
@@ -672,10 +714,10 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
// Monomorph values and append
cloner.var_base = fcn.named_variables.size();
for(const auto& ty : called_mir->named_variables)
- fcn.named_variables.push_back( cloner.params.monomorph(state.sp, ty) );
+ fcn.named_variables.push_back( cloner.monomorph(ty) );
cloner.tmp_base = fcn.temporaries.size();
for(const auto& ty : called_mir->temporaries)
- fcn.temporaries.push_back( cloner.params.monomorph(state.sp, ty) );
+ fcn.temporaries.push_back( cloner.monomorph(ty) );
cloner.df_base = fcn.drop_flags.size();
fcn.drop_flags.insert( fcn.drop_flags.end(), called_mir->drop_flags.begin(), called_mir->drop_flags.end() );
cloner.bb_base = fcn.blocks.size();
@@ -688,16 +730,17 @@ bool MIR_Optimise_Inlining(::MIR::TypeResolve& state, ::MIR::Function& fcn)
new_blocks.push_back( cloner.clone_bb(bb) );
}
+ // Apply
fcn.blocks.reserve( fcn.blocks.size() + new_blocks.size() );
for(auto& b : new_blocks)
{
fcn.blocks.push_back( mv$(b) );
}
-
fcn.blocks[i].terminator = ::MIR::Terminator::make_Goto( cloner.bb_base );
+ inline_happened = true;
}
}
- return false;
+ return inline_happened;
}
// --------------------------------------------------------------------