LLVM insertvalue 优化不佳?

2023-12-08

当我发出 LLVM 代码时,是否应该避免将“insertvalue”指令与加载和存储结合使用? 当我使用它时,我总是得到糟糕的优化本机代码。看下面的例子:

; ModuleID = 'mod'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-pc-linux-gnu"

%A = type { i64, i64, i64, i64, i64, i64, i64, i64 }

@aa = external global %A*

define void @func() {
entry:
  %a1 = load %A** @aa
  %a2 = load %A* %a1
  %a3 = insertvalue %A %a2, i64 3, 3
  store %A %a3, %A* %a1
  ret void
}

当我运行“llc -o - -O3 mod.ll”时,我得到了这个可怕的代码:

func:                                   # @func
.Ltmp0:
        .cfi_startproc
# BB#0:                                 # %entry
        movq    aa(%rip), %rax
        movq    (%rax), %r8
        movq    8(%rax), %r9
        movq    16(%rax), %r10
        movq    32(%rax), %rdi
        movq    40(%rax), %rcx
        movq    48(%rax), %rdx
        movq    56(%rax), %rsi
        movq    %rsi, 56(%rax)
        movq    %rdx, 48(%rax)
        movq    %rcx, 40(%rax)
        movq    %rdi, 32(%rax)
        movq    %r10, 16(%rax)
        movq    %r9, 8(%rax)
        movq    %r8, (%rax)
        movq    $3, 24(%rax)
        ret

但我想看到的是这样的:

func:                                   # @func
.Ltmp0:
        .cfi_startproc
# BB#0:                                 # %entry
        movq    aa(%rip), %rax
        movq    $3, 24(%rax)
        ret

当然我可以使用 getelementptr 之类的,但有时生成 insertvalue 和 extractvalue 指令更容易,我希望对这些进行优化...

我认为代码生成器很容易发现这样的事情是不好的:

        movq    56(%rax), %rsi
        movq    %rsi, 56(%rax)

首先,请注意 llc 不进行任何 IR 级别的优化。因此,您应该运行 opt 来运行 IR 级优化器集。

然而,opt 对此没有帮助。我希望标准 IR 级优化器能够以某种方式将这些内容规范化为 gep 。

请提交 LLVM PR,这看起来像是错过了优化!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM insertvalue 优化不佳? 的相关文章

  • 无法覆盖 Symfony2 GeneratorBundle 中的标准骨架视图

    我无法覆盖 GeneratorBundle 的骨架视图 我首先尝试在 app Resources SensioGeneratorBundle sculpt crud views index html twig 中添加我的视图 它不起作用 所
  • 一个单元在哪一级测试无锁代码?

    Can LLVM https packages debian org stretch llvm QEMU https packages debian org stretch qemu kvm GDB https packages debia
  • 从 64 位 nasm 代码接收 32 位寄存器

    我正在学习 64 位 nasm 我通过执行以下操作来汇编 nasm 文件 该文件仅包含 64 位寄存器 nasm f elf64 HelloWorld nasm o HelloWorld o 并链接它执行以下操作 ld HelloWorld
  • 优化视图状态

    是否有人对优化 ASP NET 应用程序的视图状态有任何想法或参考可以向我指出 我不想把它全部关闭 优化它的主要目标是提高性能 所以我不想运行一个昂贵的函数来递归地禁用某些控件的视图状态 因为该函数会减慢速度页面的加载时间会达不到目的 有任
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • Gekko - 最佳调度的不可行解决方案,与 gurobi 的比较

    我对 Gurobi 有点熟悉 但转向 Gekko 因为后者似乎有一些优势 不过 我遇到了一个问题 我将用我想象的苹果园来说明这一问题 5周的收获期 horizon T 5 就在我们身上 我的 非常微薄的 产出将是 3 0 7 0 9 0 5
  • 错误优化器参数在 Keras 函数中不合法

    我使用以下代码来计算数据生成质量指标的拟合优度研究的概率标签 from sklearn model selection import StratifiedKFold from sklearn model selection import K
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • 如何用 clang 替换 llvm-ld ?

    Summary llvm ld已从LLVM 3 2 版本 http llvm org releases 3 2 docs ReleaseNotes html 我试图弄清楚如何在我的构建系统中使用 clang 请注意 我在编写时找到了自己问题
  • 循环中的恒定条件:编译器优化[重复]

    这个问题在这里已经有答案了 考虑以下代码 Preprocessor include
  • 如何将 IR 保存到文件并将其构建为可执行文件?

    现在我使用 clang 将 c 文件构建为 s 文件 我已经使用llvm API修改了IR 但是 现在我无法将修改后的 IR 保存到文件中 我想使用 LLVMWriteBitcodeToFile 但找不到 LLVMOpaqueModule
  • 超越堆栈采样:C++ 分析器

    黑客的故事 日期是 2010 年 2 月 12 日 圣诞节前的日子已经过去了 作为一名 Windows 程序员 我几乎遇到了一个主要障碍 我一直在使用 AQTime 我尝试过 sleepy shiny very sleepy 就在我们说话的
  • InnoDB vs. MyISAM 插入查询时间

    我有一个大型 MySQL 表 约 1000 万行 6 5G 用于读取和写入 它是MyISAM 由于MyISAM 的所有表写入锁 我获得了很多锁 我决定尝试迁移到 InnoDB 推荐用于读 写表 它只锁定写入时的特定行 转换后 我测试了插入语
  • 如何防止编译器优化掉断点?

    我编写了一个 if 子句来检查是否应该中断程序进行调试 if a lt 0 a a a不应该变成负数 但我发现它确实如此 并且我想中断调试以了解如果发生这种情况它为什么会变成负数 因此我编写了这个 if 子句 在线上a a 我设置了一个断点
  • 如何正确触发 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 意图?

    如文档中所述 持有 REQUEST IGNORE BATTERY OPTIMIZATIONS 权限的应用程序可以触发系统对话框 让用户直接将应用程序添加到白名单 而无需进入设置 该应用程序会触发 ACTION REQUEST IGNORE
  • 我应该如何优化 .net 代码中对一个简单存储过程的多次调用?

    我有一个非常简单的存储过程 create procedure spFoo v varchar 50 as insert into tbFoo select v 我有 50 个值要插入到 tbFoo 中 这意味着在我的 c 代码中我调用 sp
  • 是否有类似 BNF 的语法来描述 LLVM IR?

    我想知道是否有 BNF 语法来描述 LLVM IR 如描述C语言的C BNF语法等 My LLVM 汇编语言解析器 https github com dylan lang opendylan blob master sources lib
  • 为什么字符串加法需要这么长时间才能构建?

    我正在添加文本UIlabel 及其性能成本 我使用过构建时间分析器使用此链接 https stackoverflow com questions 43455325 swift build time too long when the con
  • 在游戏行业担任优化员的基本技能[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐