首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止DAGCombiner::递归deletion删除相关SDNodes

防止DAGCombiner::递归deletion删除相关SDNodes
EN

Stack Overflow用户
提问于 2014-08-24 13:59:46
回答 1查看 226关注 0票数 0

我面临着相当有教育意义的任务,要以以下方式扩展LLVM:

  • 向SPARC后端添加寄存器XACC和指令LRXACC()、SRXACC(arg1)、XMAC(arg1、arg2)。指示如下: LRXACC:来自XACC的负载值, SRXACC:写信给XACC, XMAC: XACC+=(arg1 1*arg1 2)>>31
  • 在Clang前端为所有三个人提供内置组件。

我的测试来源是:

代码语言:javascript
复制
int main() {
int acc = 0;
__builtin___srxacc(acc);
__builtin___xmac(12345,6789);
acc = __builtin___lrxacc();
return 0;
}

我能够支持将内置程序转换为内在功能。我从clang得到的IR文件看起来很好:

代码语言:javascript
复制
define i32 @main() #0 {
entry:
  %retval = alloca i32, align 4
  %acc = alloca i32, align 4
  store i32 0, i32* %retval
  store i32 0, i32* %acc, align 4
  %0 = load i32* %acc, align 4
  call void @llvm.sparc.srxacc(i32 %0)
  call void @llvm.sparc.xmac(i32 12345, i32 6789)
  %1 = call i32 @llvm.sparc.lrxacc()
  store i32 %1, i32* %acc, align 4
  ret i32 0
}

在DAG合并步骤时出现问题,最终输出代码如下所示:

代码语言:javascript
复制
.text
    .file   "file22.ll"
    .globl  main
    .align  4
    .type   main,@function
   main:                                ! @main
! BB#0:                                 ! %entry
       add %sp, -104, %sp
       st %g0, [%sp+100]
       st %g0, [%sp+96]
       lrxacc %xacc, %o0
       st %o0, [%sp+96]
       sethi 0, %o0
       retl
       add %sp, 104, %sp
.Ltmp0:
       .size   main, .Ltmp0-main
       .ident  "clang version 3.6.0 (trunk)"

DAGCombiner将srxacc和xmac指令删除为冗余。(在::Run方法中,它检查节点是否为use_empty(),如果是的话删除它)

组合器是这样做的,因为它们存储的结果是寄存器,所以从图中看不到,其中一个依赖于另一个。

如能就如何避免删除我的指示提出任何建议,我将不胜感激。

谢谢!

编辑

为了简化和具体化:指令,在IR代码中表示为void @llvm.sparc.srxacc(i32 %0)的指令看起来像它们不影响计算一样,相应的SDNodes接收空的UseList。怎么才能绕开呢?

EN

回答 1

Stack Overflow用户

发布于 2014-11-06 18:28:21

  1. 您可以使用链式令牌来表示SDNode之间的控制依赖关系,这样就可以在两个指令之间添加假依赖项,即使第二个指令没有消耗第一个指令的任何输出。
  2. 您可以使用CopyToRegisterCopyFromRegister来处理预定义的物理寄存器
  3. 您可以使用Glue将几个简单的指令粘合成一个复杂的伪指令。

考虑为x86编译的以下简单示例:

代码语言:javascript
复制
int foo(int aa, int bb) {
  return aa / bb;
}

您可能还想研究更复杂的示例,尽管DAG图片太大,无法在这里发布(您可以使用-view-sched-dags选项查看DAG ):

代码语言:javascript
复制
void foo(int aa, int bb, int *x, int *y, int *z) {
  *x = aa / bb;
  *y = aa % bb;
  *z = aa * bb;
}

也请看一下this post

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25472475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档