LLVM后端怎么描述指令操作数约束

浅杰君_1000

浅杰君_1000

2026-10-08

861人浏览

原创

type 是 ir 类型(如 i32),用于 selectiondag 合法化;operandtype 是字符串枚举(如 riscvopnd::imm12),控制汇编解析与编码;constraints 仅影响汇编打印/解析,不参与指令选择。

llvm后端怎么描述指令操作数约束

Operand 的 Type 和 OperandType 字段容易混淆

定义一个操作数时,Type 是 TableGen 类型系统里的 IR 类型(如 i32、f64、ptr),它参与 SelectionDAG 合法化和类型推导;而 OperandType 是字符串标识符,对应 MCInstrDesc.h 中的 enum OperandType 值(如 MCOI::OPERAND_IMMEDIATE 或自定义的 RISCVOpnd::imm12),只用于汇编打印、编码/解码阶段的 dispatch 控制。

常见错误是把 Type 当成汇编器能识别的约束——它不是。比如写 Operand<i32>:$src</i32> 并不能阻止用户在 .s 文件里传入浮点立即数;真正起约束作用的是 OperandType 配合 AsmParser 里的语法检查逻辑。

  • Type 影响 DAG 节点生成和合法化:若 IR 操作数是 i16,但指令只支持 i32,legalizer 会自动插入 ANY_EXTEND 或报错
  • OperandType 决定 XXXAsmParser::ParseOperand 是否接受该 token:例如 RISCVOpnd::imm12 对应解析函数中对立即数范围 [-2048, 2047] 的校验
  • 自定义 OperandType 必须在 XXX.td 中用 def 声明,并通过 OperandNamespace 关联到具体命名空间(如 RISCVOpnd)

Constraints 字段只在 AsmParser 阶段生效,不参与指令选择

Constraints 是 Instruction 类里的字段,值为字符串列表(如 ["$src = $dst"]),它**仅被 XXXAsmPrinter 和 XXXAsmParser 使用**,用于生成或验证汇编文本,完全不参与 SelectionDAG 的 Pattern 匹配或寄存器分配。

典型误用是以为写 Constraints = ["$src != $dst"] 就能防止指令选择器生成 src/dst 相同的机器指令——不会。这种语义必须靠 Predicates 或 Pattern 中的条件表达式实现,比如:

def ADDrr : RISCVInst {
  let Predicates = [HasStdExtA];
  let Constraints = "$src1 = $dst";
}

上面的 Constraints 只影响汇编输出格式(比如 add t0, t0, t1),而 Predicates 才控制该指令是否参与匹配。

Aiva.ai
Aiva.ai

Aiva.ai是一款用于生成多风格原创曲目的 AI 音乐作曲助手。

下载
  • 多个约束用逗号分隔:Constraints = ["$src1 = $dst", "$src2 in [x1, x2, x3]"]
  • 约束中引用的操作数名必须与 outs/ins 中声明的变量名一致,大小写敏感
  • 若约束失败,AsmParser 报错信息形如 error: invalid operand for instruction 'add': operand '$src1' must equal '$dst'

用 MCOperandPredicate 实现动态语法约束

当简单等式或枚举无法表达约束逻辑(比如“立即数必须是 4 的倍数”或“寄存器必须属于 CSR 组”),就得用 MCOperandPredicate。

它是一段 C++ 代码片段,在 XXXAsmParser.cpp 的 validateInstruction 流程中被调用,接收 const MCInst &Inst 和操作数索引,返回 bool。TableGen 会把它内联进生成的 parser 代码里。

  • 定义方式:let MCOperandPredicate = [{ return isAligned(Imm); }];(注意花括号和分号)
  • 作用域内可访问 Inst、OpNo、getImm() / getReg() 等方法
  • 不能调用非 inline 函数或依赖全局状态;所有逻辑必须编译期确定,否则 TableGen 报错
  • 调试时可在 XXXAsmParser::ValidateInstruction 插入 errs()

Pattern 匹配中的类型约束靠 SDTypeConstraint 和 PatFrag

指令选择阶段(SelectionDAG → MachineInstr)的约束,和汇编语法无关,而是由 Pat 或 PatFrag 中嵌套的 SDTypeConstraint 控制。例如:

def : Pat;

这里 i32:$lhs 表示要求 DAG 节点的 ValueType 必须是 MVT::i32;若 IR 传来的是 i64,该 pattern 不会匹配,转而触发 legalizer 插入截断或扩展节点。

  • 更细粒度可用 SDTCisInt、SDTCisFP、SDTCisSameMemOperand 等预定义约束
  • 自定义类型约束需在 TargetSelectionDAG.td 中用 def 声明,CxxCode 字段返回布尔表达式
  • PatFrag 可封装常用子图(如地址计算),其内部 SDTypeConstraint 会递归应用到所有匹配子节点

真正难缠的是跨操作数联合约束(比如“两个操作数不能同时是立即数”),这类必须拆成多个 Pat + Predicates 组合,或退回到自定义 ComplexPattern ——这时候你已经绕不开手写 C++ 了。

相关文章

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

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

下载

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

相关专题

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

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

2023.08.11

2323

5

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

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

2024.03.19

6090

13

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

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

2024.03.19

5446

10

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

0

20

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

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

2026.09.30

120

10

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

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

2026.09.30

100

14

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

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

2026.09.30

80

12

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

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

2026.09.30

80

26

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

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

2026.09.29

100

15

热门下载

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

精品课程

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