如何在LLVM CodeGen中从常量池加载指令获取Constant FP值?
在LLVM CodeGen阶段从常量池加载的操作数中提取ConstantFP值
根据你提供的DAG结构,foo的操作数是一个加载节点(t9),而非直接的常量节点,它的数据源是经过X86ISD::Wrapper包裹的TargetConstantPool节点(t11)。因此需要逐层拆解DAG节点来获取原始的ConstantFP,具体实现代码如下:
// 假设Operand是foo的SDNode操作数(即t9) if (LoadSDNode *Load = dyn_cast<LoadSDNode>(Operand)) { // 获取加载操作的地址源节点(即t11) SDValue WrapperNode = Load->getBasePtr(); if (WrapperNode.getOpcode() == X86ISD::Wrapper) { // 提取Wrapper内部的ConstantPool节点 SDValue CPNodes = WrapperNode.getOperand(0); if (ConstantPoolSDNode *CPNode = dyn_cast<ConstantPoolSDNode>(CPNodes)) { // 从ConstantPool节点中取出ConstantFP const ConstantFP *CFP = dyn_cast<ConstantFP>(CPNode->getConstVal()); if (CFP) { const APFloat &C = CFP->getValueAPF(); // 在这里执行你的APFloat规范化逻辑 } } } }
逻辑说明
- 先判断操作数是否是
LoadSDNode:对应DAG中的t9: f32,ch = load节点 - 获取加载的地址操作数:对应
t11: i64 = X86ISD::Wrapper节点 - 验证该地址节点是X86平台的Wrapper类型,提取其内部的
ConstantPoolSDNode - 从
ConstantPoolSDNode中取出原始的ConstantFP,进而获取APFloat值
内容的提问来源于stack exchange,提问作者Pawan Nirpal
相关产品推荐
相关产品推荐

