方舟编译器_8

2021SC@SDUSC
MIRLower类中主要是定义一些向下转换的操作,之前我们也做过控制流语句的具体向下转换的分析,都是属于MIRLower类的具体的成员函数。
void MIRLower::LowerFunc(MIRFunction &func) {
mirModule.SetCurFunction(&func);
if (IsLowerExpandArray()) {
ExpandArrayMrt(func);
}
BlockNode *origBody = func.GetBody();
ASSERT(origBody != nullptr, “nullptr check”);
BlockNode *newBody = LowerBlock(*origBody);
ASSERT(newBody != nullptr, “nullptr check”);
if (!InLFO()) {
LowerCandCior(*newBody);
}
func.SetBody(newBody);
}
向下转译方法
BaseNode *MIRLower::LowerFarray(ArrayNode *array) {
auto farrayType = static_cast<MIRFarrayType>(array->GetArrayType(GlobalTables::GetTypeTable()));
size_t eSize = GlobalTables::GetTypeTable().GetTypeFromTyIdx(farrayType->GetElemTyIdx())->GetSize();
MIRType &arrayType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(array->GetPrimType()));
/
how about multi-dimension array? */
if (array->GetIndex(0)->GetOpCode() == OP_constval) {
const ConstvalNode constvalNode = static_cast<const ConstvalNode>(array->GetIndex(0));
if (constvalNode->GetConstVal()->GetKind() == kConstInt) {
const MIRIntConst pIntConst = static_cast<const MIRIntConst>(constvalNode->GetConstVal());
CHECK_FATAL(mirModule.IsJavaModule() || pIntConst->GetValue() >= 0, “Array index should >= 0.”);
int64 eleOffset = pIntConst->GetValue() * eSize;

BaseNode *baseNode = array->GetBase();
if (eleOffset == 0) {
return baseNode;
}

MIRIntConst *eleConst =
GlobalTables::GetIntConstTable().GetOrCreateIntConst(eleOffset, arrayType);
BaseNode *offsetNode = mirModule.CurFuncCodeMemPool()->New(eleConst);
offsetNode->SetPrimType(array->GetPrimType());

BaseNode *rAdd = mirModule.CurFuncCodeMemPool()->New(OP_add);
rAdd->SetPrimType(array->GetPrimType());
rAdd->SetOpnd(baseNode, 0);
rAdd->SetOpnd(offsetNode, 1);
return rAdd;
}
}

BaseNode *rMul = nullptr;

BaseNode *baseNode = array->GetBase();

BaseNode *rAdd = mirModule.CurFuncCodeMemPool()->New(OP_add);
rAdd->SetPrimType(array->GetPrimType());
rAdd->SetOpnd(baseNode, 0);
rAdd->SetOpnd(rMul, 1);
auto *newAdd = ConstantFold(mirModule).Fold(rAdd);
rAdd = (newAdd != nullptr ? newAdd : rAdd);
return rAdd;
}
向下转译Farray

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值