llvm后端之函数栈帧

引言

llvm后端在物理寄存器分配后、指令发射前会调用PEI这个pass来生成函数栈帧的创建与销毁。

1 目标扩展实现

在target下,需要实现如下两个方法:

  • TargetFrameLowering子类重写emitPrologue与emitEpilogue方法;
  • TargetInstrInfo子类重写storeRegToStackSlot和loadRegFromStackSlot方法。

1.1 emitPrologue和emitEpilogue

TargetFrameLowering类的emitPrologue与emitEpilogue方法用于创建和消耗函数栈帧实现。以RISCV为例:

emitPrologue其核心逻辑如下:

  • 基于对齐考虑,调用RISCVFrameLowering::determineFrameLayout调整栈大小;
  • 若栈指针寄存器SPReg被引用,则报错退出;否则继续;
  • 若栈指针需要通过多次调整,则将临时变量StackSize设置为第一次调整的大小。这是通过getFirstSPAdjustAmount计算的;
  • 通过adjustReg生成扩展栈空间的指令。由于栈向下生长,是加上负StackSize大小;此外,该指令是插入到基本块最前端;
  • 将插入指令的迭代器位置往后移需要保存的寄存器的个数;
  • 通过adjustReg调整帧指针FPReg的位置,使其指向变长参数所在位置。若无变长参数,则FPReg则指向父函数调用本函数时的栈指针位置;
  • 如果getFirstSPAdjustAmount返回非0,则需要第二次扩展栈空间;
  • 如果TargetRegisterInfo::needsStackRealignment返回要求改函数需要比正常调用约定更严格的栈对齐,则对栈指针SPReg再向下扩展MaxAlignment长度;

注:此外源码中还有包括生成用于栈回溯的cfi指令。

emitEpilogue其核心逻辑如下:

  • 首先将插入指令的位置MBBI设置为基本块末尾;
  • 调整指令插入位置。若有终止指令,将MBBI指向第一个终止指令的前面,否则指向最后一个非终止且非debug指令的后面;
  • 如果栈指针SPReg在emitPrologue中做了多次调整,则需要反序恢复回来。前面的恢复指令插入位置是MBBI向前移动该函数作为被调用者需要保存的寄存器个数;最后一次插入位置是MBBI

1.2 storeRegToStackSlot和loadRegFromStackSlot

TargetInstrInfo类的storeRegToStackSlot和loadRegFromStackSlot方法用于寄存器压栈和出栈指令的生成。同样,以RISCV为例:

  • storeRegToStackSlot则是根据寄存器分类获取不同的压栈指令类型,例如在32位目标下的GPR寄存器类,则是sw指令;
  • loadRegFromStackSlot也是根据寄存器分类获取不同的出栈指令类型,例如在32位目标下的GPR寄存器类,则是lw指令;

2 寄存器存栈与恢复

细心的朋友可能会发现之前的代码逻辑缺失了寄存器的保留与恢复操作。这部分指令是在PEI这个pass中完成的,该pass是在TargetPassConfig::addMachinePasses中完成添加的。在PEI::runOnMachineFunction中:

  • 首先就调用PEI::spillCalleeSavedRegs生成了该函数作为被调用者需要保护寄存器的保留与恢复指令操作,其中包括调用XXXInstrInfo实现的storeRegToStackSlot和loadRegFromStackSlot方法;
  • 后续,调用PEI::insertPrologEpilogCode生成栈帧的创建与销毁指令。

注:由于提前生成保留寄存器的压栈与出栈指令,所以目标在实现emitPrologue和emitEpilogue方法时,需要注意指令的插入位置。

主要内容:本文详细介绍了一种QRBiLSTM(分位数回归双向长短期记忆网络)的时间序列区间预测方法。首先介绍了项目背景以及模型的优势,比如能够有效利用双向的信息,并对未来的趋势上限和下限做出估计。接着从数据生成出发讲述了具体的代码操作过程:数据预处理,搭建模型,进行训练,并最终可视化预测结果与计算分位数回归的边界线。提供的示例代码可以完全运行并且包含了数据生成环节,便于新手快速上手,深入学习。此外还指出了模型未来发展的方向,例如加入额外的输入特性和改善超参数配置等途径提高模型的表现。文中强调了时间序列的标准化和平稳检验,在样本划分阶段需要按时间序列顺序进行划分,并在训练阶段采取合适的手段预防过度拟合发生。 适合人群:对于希望学习和应用双向长短时记忆网络解决时序数据预测的初学者和具有一定基础的研究人员。尤其适用于有金融数据分析需求、需要做多一步或多步预测任务的从业者。 使用场景及目标:应用于金融市场波动预报、天气状况变化预测或是物流管理等多个领域内的决策支持。主要目的在于不仅能够提供精确的数值预计还能描绘出相应的区间概率图以增强结论置信程度。 补充说明:本教程通过一个由正弦信号加白噪构造而成的简单实例来指导大家理解和执行QRBiLSTM流程的所有关键步骤,这既方便于初学者跟踪学习,又有利于专业人士作为现有系统的补充参考工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值