LLVM后端怎么实现LowerOperation

阿雪姑娘_1436

阿雪姑娘_1436

2026-10-05

557人浏览

原创

loweroperation 是 targetlowering 类的虚函数,必须重写,负责将 ir 抽象操作(如 isd::sdiv)映射为目标平台 sdnode(如 riscv::add 或 cpu0isd::divrem);跳过会导致通用 lowering 膨胀指令、自定义指令不识别、类型合法化失效、setoperationaction 策略失活。

llvm后端怎么实现loweroperation

直接说结论:LowerOperation 是 TargetLowering 类里的虚函数,必须重写,它负责把 LLVM IR 中的抽象操作(比如 ISD::ADD、ISD::SDIV)映射成目标平台能理解的 SDNode 节点(如 RISCV::ADD 或自定义的 Cpu0ISD::DivRem),不重写就走默认兜底逻辑,大概率生成错误或低效代码。

为什么 LowerOperation 不能跳过

LLVM IR 是平台无关的,而硬件指令是具体的。SelectionDAGBuilder 把 IR 指令转成 SDNode 后,会调用 LowerOperation 对每个节点做“合法化”和“定制化”处理。跳过它,意味着: - 所有除法、浮点比较、向量操作等都走通用 lowering,可能膨胀成几十条指令 - 自定义指令(如 RISC-V 的 clz)根本不会被识别 - 类型不匹配时(比如 i16 除法在只支持 i32 运算的 CPU 上)不会触发 expand 或 promote 等合法化动作 - setOperationAction 设置的 Expand、Legalize 等策略不会生效

LowerOperation 常见实现模式

典型写法是 switch (Op.getOpcode()),对不同 opcode 分支处理。关键点不是“写完就行”,而是要匹配目标硬件的真实能力:

Reachout.ai
Reachout.ai

一款面向销售团队的 AI 视频触达与营销工具,通过个性化视频内容辅助企业开展客户开发和销售沟通,提高潜在客户触达效率。

下载
  • 对原生支持的操作(如 RISC-V 的 add),直接构造目标指令节点:DAG.getNode(RISCV::ADD, ...)
  • 对不支持的操作(如 64-bit 除法在 32-bit CPU 上),返回 SDValue() 让框架自动 expand 成库调用或软实现
  • 对需拆解的操作(如 ISD::SDIVREM),要检查 N->hasAnyUseOfValue(0) 和 N->hasAnyUseOfValue(1),只生成实际需要的 MFLO/MFHI 指令,避免冗余读寄存器
  • 对带副作用的 intrinsic(如 llvm.riscv.clz),需先判断是否已由 LowerIntrinsicCall 处理,避免重复 lowering

容易踩的坑

这个函数看着简单,但调试起来最头疼的地方往往藏在细节里:

  • SDLoc(Op) 必须传进去,否则生成的汇编行号错乱,gdb 调试时定位不到源码位置
  • 返回的 SDNode * 如果类型(MVT)和原节点不一致,后续 pass 会 crash,比如把 MVT::i32 返回成 MVT::i64
  • 没处理 DCI.isBeforeLegalizeOps() 就直接访问 operand,可能在 legalize 前拿到非法值(比如未展开的 vector 类型)
  • 忘记调用 DAG.ReplaceAllUsesOfValueWith 替换旧节点,导致 DAG 中残留死节点,影响寄存器分配

真正难的不是写对一个 ADD,而是让整套 lowering 在所有优化级别、所有类型组合、所有调用上下文中都稳定输出正确且紧凑的指令——这要求你对硬件手册、TableGen 描述、LLVM 的 type legalization 规则三者之间的咬合点非常清楚。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2263

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5990

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5326

10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程