禁用 LLVM 10 C++ API 的常量折叠

2023-12-09

我正在使用 LLVM C++ API 为 C 语言的子集编写编译器前端。我注意到生成的 IR 总是应用恒定的折叠优化。但我想禁用此功能并获得忠实的、未优化的 IR。有什么办法可以做到这一点吗?

以下是我用来从模块生成 IR 的代码。

    llvm::verifyModule(kit.module, &llvm::outs());
    kit.module.print(llvm::outs(), nullptr);
    auto tirFile = "output.ir";
    error_code ec;
    llvm::raw_fd_ostream tirFileStream(tirFile, ec, llvm::sys::fs::F_None);
    kit.module.print(tirFileStream, nullptr);
    tirFileStream.flush();

看来我使用的 LLVM 版本是 LLVM 10。

sumit@HAL9001:~$ llvm-config --version
10.0.0

例如,当我在以下 C 函数上运行编译器时

int arith() {
  return (10 - 10/3) << 3 | (23+8*12) & 1024;
}

它被编译为

define i32 @arith() {
entry:
  ret i32 56
}

对常量的二进制操作由编译器本身进行评估,即常量折叠;它不会被转换为适当的 IR 代码。


引用自这个链接:

前端将代码降低为 IR 的方式会导致这种情况 即使在生成任何 LLVM IR 之前也会发生恒定折叠。 本质上,当你进行 AST 遍历时,你将 本质上看到以下代码运行:

IRBuilder<> Builder; Value *LHS = Builder.getInt32(2); 
Value *RHS = Builder.getInt32(4); // LHS and RHS are ConstantInt values because they’re constant expressions.
Value *Res = Builder.CreateMul(LHS,RHS); // Because LHS and RHS are constant values, the IRBuilder folds this to a constant expression.

这种持续折叠无法关闭。 (我还假设有 在 Clang AST 级别没有发生其他持续折叠)。

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

禁用 LLVM 10 C++ API 的常量折叠 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • 使用Friendly_id匹配单个Rails路线中的多个模型

    我有一个公司和一个用户模型 两者都有一个通过Friendly id 的slug 确保两种模型中的段头都是唯一的 我想要网址 http www example com any company name http www example com
  • Google 地图 API 路线

    我可以在应用程序中的谷歌地图上标记两个点 然后计算地图上的方向以及逐向导航吗 我正在创建一个应用程序 用于获取两点之间的行驶方向在地图上 一步一步 step1首先创建一个类MyOverlay java用于绘制路径 import androi
  • phpmyadmin 出现奇怪的错误,安装成功但仍然无法运行

    我一整天都在努力安装 phpmyadmin 我已经尝试重新安装很多次了 但还是不行 打开 localhost phpmyadmin 时 我收到一些文本 而不是实际的 phpmyadmin UI 正文是 addJSON options PMA
  • 如何在 Web midi api 中发现 midi 键盘?

    参考 2013 年的浏览器支持 Web MIDI API 我目前正在 OS 10 9 2 上运行 Chrome 34 0 1847 116 并尝试使用 Web Midi API 启用 chrome flags enable web midi
  • Perl正则表达式匹配较长句子中的可选短语

    我正在尝试匹配句子中的可选 可能存在 短语 perl e word1 word2 word3 print 1 1 2 2 3 3 n if m word1 word2 word3 Output 1 word1 2 3 word3 我知道第一
  • 使用 Coldfusion 上传时存储文件名

    我正在尝试将要上传的所选文件的文件名存储到表单上的隐藏输入字段中 我的表格看起来像这样
  • 如何手动更新实体框架代码优先模型,以便它更新数据库(使用新列)?

    有人可以告诉我如何将数据成员 col 添加到我的 mvc3 模型 类 并让它更新数据库 而不必从头开始生成所有内容 我首先从代码开始工作 当我更改模型然后运行我的项目时 我收到一条错误消息 指出模型已更改 有什么干净简单的方法来同步创建新的
  • std::使用整数数组中的元素作为 std::variant 中的目标类型从 std::variant 获取内容

    我有一个整数数组来检索 std variant 中的内容 但是编译失败 报错信息No matching function to call get 您能否解释原因并提出实现相同目的的可行解决方案 using my type std varia
  • 显示实时页面查看者数量[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 javascript 或 php 统计网站当前访问者 我的网站上有一个嵌入式流 但我想提取页面上实时观看者的数量 有没有一种方法可以使用 PHP AJAX 来执行此操作 显示当前正在查看我的
  • 从 C#(非 C)COM 组件加载和传递 JScript 数组

    我看过有关 jscript 数组的教程 但还没有看到 我看到类似的问题 但涉及 Win32 代码而不是 NET 想知道如何在 JScript 和 C COM 组件之间来回传递数组 例如 我在 C COM 中定义了两个属性 它们返回字符串和整
  • 视图模型不断创建实时数据实例

    我在中创建了视图模型的实例onCreate活动的方法 ticketViewModel ViewModelProviders of this get TicketViewModel class 那我有一个方法 AddTicket 它使用vie
  • 增加 Angular 2+ 和 ASP.NET Core WebAPI 应用程序中的超时

    在我的 Angular 2 ASP NET Core MVC WebAPI 应用程序中 我有一个从客户端 UI 到服务器的长时间运行的 API 调用 请求在 30 秒后超时 我想在客户端或服务器端定义此特定 API 调用的超时 我只找到了全
  • 将文件拖到桌面快捷方式 - 不在应用程序中打开文件

    我有一个小型日志查看器应用程序来读取一些自定义日志 我可以将文件直接拖到可执行文件上 然后通过命令行加载它们就可以了 但是 如果我将文件拖到桌面快捷方式 Windows 将不会使用这些文件作为命令行参数来打开应用程序 它根本不会打开该应用程
  • 改变垫子展开指示器的旋转

    我成功地将垫指示器移动到左侧 而不是右侧 并且我使用变换属性使其在展开时向内转动 不过 我希望指示器在展开时朝上 在折叠时朝下 我如何正确地设计它来实现这一目标 https stackblitz com edit indicatorrota
  • Git - 如何查看方法/函数的更改历史记录?

    所以我发现了关于如何查看文件的更改历史记录的问题 但是这个特定文件的更改历史记录是巨大的 我真的只对特定方法的更改感兴趣 那么是否可以查看该特定方法的更改历史记录 我知道这需要 git 来分析代码 并且不同语言的分析会有所不同 但方法 函数
  • 尝试从应用扩展访问钥匙串时出现“没有可用钥匙串”错误

    我正在制作一个 IOS 自定义键盘扩展 默认情况下 键盘的功能有限 但是当用户从主父应用程序购买完整版本时 键盘会解锁缺少的部分 为了检查用户是否购买了该应用程序 我尝试存储Bool在 IOS 钥匙串中使用这个图书馆 let IAPKeyc
  • UTF8 和日语字符

    问题 外来字符未按应有的方式显示 这包括德语 日语 俄语和除英语之外的所有其他语言 完美运行 PHP 通过 jQuery AJAX 调用调用 MySQL 它应该返回信息并将其显示在页面上 数据被调用并显示 然而 对于非英语字符 结果显示为
  • 如何根据 iFrame 内容的大小“增长”iFrame?

    我正在动态加载 iFrame 有些页面比其他页面 更高 我希望 iFrame 能够相应地增长 是否可以 如果是这样 怎么办 是的 jquery 是可以的 父页面代码 iframe页面上的脚本 function alertSize var m
  • 如何实现网页的实时更新?

    Google 的 GMail 服务之所以能做到这一点 是因为它集成了 Google Talk 而 Etherpad 现在的 typewith me 使 Google Wave 等使用的系统闻名 当其他用户对页面进行更改时 所有此类系统都会立
  • 禁用 LLVM 10 C++ API 的常量折叠

    我正在使用 LLVM C API 为 C 语言的子集编写编译器前端 我注意到生成的 IR 总是应用恒定的折叠优化 但我想禁用此功能并获得忠实的 未优化的 IR 有什么办法可以做到这一点吗 以下是我用来从模块生成 IR 的代码 llvm ve