我想问您Haskell和C ++编译器是否可以以相同的方式优化函数调用. 请查看以下代码.在下面的示例中,Haskell明显快于C ++. 我听说Haskell可以编译为LLVM,可以通过LLVM Pass进行优化.此外,我听说Haskell在引擎盖下进行了一些重型优化. 但是以下示例应该能够以相同的性能工作. 我想问: 为什么我在C ++中的样本基准比Haskell中的慢呢? 是否有可能进一步优化代码? (我正在使用LLVM-3.2和GHC-7.6). C ++代码: #include #include int b(const int x){ return x+5; } int c(const int x){ return b(x)+1; } int d(const int x){ return b(x)-1; } int a(const int x){ return c(x)
以下是关于 llvm 的编程技术问答
LLVM是否会在可能的情况下自动将Objective-C方法转换为内联函数? (即,创建一个可以粘贴在线粘贴的代码块的Objective-C方法的性能是否一样?) 如果LLVM不执行此优化,为什么不呢?如果这样做,(a)我必须设置某些构建设置才能发生吗? (b)我该如何判断是否将Objective-C方法隐藏? 解决方案 否,因为在OBJ-C运行时不可能知道是否可以执行这些优化.要记住的是,OBJ-C方法是通过发送消息发送的,这些消息不仅来自[myObject doSomething]语法. 考虑[obj performSelector:NSSelectorFromString(@"hello")]这可能发生的事实意味着将不可能嵌入任何方法. 当类别接收到消息时,这些事件也会发生,这些事件可以重新路由甚至更改正在发送的消息.这是透明的,在消息发送的下方. 其他解决方案 否.这是Objective-C的重要功能,该消息派遣(请记住,在OBJ-C您发送
我正在为JIT生成LLVM IR,我注意到LLVM的调用约定在涉及汇总值时似乎与C调用约定不符.例如,当我将函数声明为{i32, i32}(即,在c项中a struct {int a, b;})参数时,它似乎将其自己x86-64 gpr中的每个结构元素传递给该函数,即使x86-64 abi 尽管有LLVM的文档声称与C呼叫约定匹配的默认情况下: " ccc" - c调用大会 此呼叫约定(如果未指定其他调用约定的默认约定)匹配目标C呼叫约定.此调用约定支持varargs函数调用,并容忍声明的原型中的某些不匹配并实现了该函数的声明(如正常C). 我的问题是:我是在做错事,以使llvm不符合c呼叫约定,还是这种已知的行为? (至少,文档似乎是错误的,不?) 我只能在网络上完全找到对该问题的参考,例如此错误报告 2007年,该报告声称是固定的.它还声称"首先,llvm无法将汇总作为单数值*的汇总处理,我不知道这是在2007年是否真的,但是鉴于 extractvalue/i
我需要一些有关"转发"论点的建议(在LLVM-IR中). 假设我有一个函数F,该函数在的开头在模块中的其他功能.从F我需要访问(阅读)传递给其直接呼叫者的参数. 现在要执行此操作,我将呼叫者内的所有参数都包装在struct中,然后将i8*指针传递给struct to F,并与标识符一起,告诉哪个调用者F正在调用. F然后有一个巨大的开关,该开关分支到适当的拆箱代码.必须这样做,因为模块中的功能具有不同的签名(参数/返回值计数和类型不同;甚至不同的呼叫约定),但是显然这是次优的(无论是从性能和代码尺寸的观点而言),因为I需要在堆栈上分配结构,将其内部的参数复制,将附加指针传递给F,然后执行拆箱. 我想知道是否有更好的方法来执行此操作,即一种从功能 的堆栈框架的一种方法(感谢标识符,该函数是哪个呼叫者从)或更一般地称为任意值在其直接呼叫者中定义的.有什么建议吗? 注意:我正在努力的全部要点是具有完成所有这些功能的 single 函数F;分裂/内部/专业/模板F不是一个
我已经尽一切可能安装eo-learn,但它不起作用 使用Conda行不通 最接近的是使它工作的是PIP,但我在尝试安装Numba 时被卡住了 采取的步骤 brew install llvm export LLVM_CONFIG=/opt/homebrew/opt/llvm/bin/llvm-config LLVM_CONFIG=/opt/homebrew/opt/llvm/bin/llvm-config pip install numba LLVM_CONFIG=/opt/homebrew/opt/llvm/bin/llvm-config pip install llvmlite which is the major dependency breaking for now brew link llvm Warning: Refusing to link macOS provided/shadowed software: llvm If you need to have
尽管不再受制于塞拉,但我需要安装llvm@13公式作为其他公式的依赖性.因此,我尝试以这种方式安装它: $ brew install llvm ... ==> Downloading https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.0/llvm-project-13.0.0.src.tar.xz Already downloaded: /Users/username/Library/Caches/Homebrew/downloads/8fd68fc8f968137c5080826db6e58682326235960fd8469363eb27d0799978ca--llvm-project-13.0.0.src.tar.xz ... ==> Installing llvm ==> cmake -G Unix Makefiles .. -DLLVM_ENABLE_PROJECTS=clang;cla
ghc -fllvm -ekep -llvm -files -fforce -recomp hello.hs [1 of 1]编译主(Hello.hs,Hello.o) : 警告:无法弄清LLVM版本! 确保您已经安装了LLVM GHC:无法执行:opt 尽管.ll文件是在当前目录中生成的,但我仍然没有错误. 解决方案 需要设置路径,cplus_include_path和ld_library_path # export PATH=/usr/local/opt/llvm/bin:$PATH # export CPLUS_INCLUDE_PATH=$(llvm-config --includedir):$CPLUS_INCLUDE_PATH # export LD_LIBRARY_PATH=$(llvm-config --libdir):$LD_LIBRARY_PATH
我正在使用MacBook 1G,Snow Leopard. 几天前,我安装了Xcode 4.2,并为C ++ 0x进行了测试项目. i将LLVM 3.0设置为C ++编译器,C ++语言方言为C ++ 0x和C ++标准库为libc ++. 但是,当构建时,发生错误. "iostream" file not found 我发现它最令人困惑.我该如何解决这个问题? 解决方案 "我将libc ++更改为libstdc ++".如何?这个设置在哪里? Apple Documentation说"简单地设置"构建设置中的" C ++标准库"类型为..."构建设置很长,我看不到设置的地方.谢谢. 编辑 - 没有什么能像午睡那样清除头部. 请确保将实现文件的文件名后缀为" .mm". project->构建设置 - > Apple LLVM编译器3.1语言 - 然后: C ++语言方言 - > C ++ 11(或任何选项) C ++标准库 - >
我在MacOSX 10.9 Mavericks和命令行工具上安装了Xcode 5.0.1(例如,我可以在命令行上使用GCC/Clang),但是命令opt似乎已经消失了. 它被其他东西所取代吗? 解决方案 Apple从未在Xcode命令行工具中,只有clang oppled'base'llvm工具.您需要自己编译LLVM的所需修订/发布.您可以通过 http://llvm.g/releases/releleases/download.htload.htload.htload.htload.a htload.a htload.htload.a, >也. 其他解决方案 我的策略(在小牛上)是做brew install llvm然后symlink: sudo ln -s /usr/local/Cellar/llvm/3.4/bin/opt /usr/bin/opt sudo ln -s /usr/local/Cellar/llvm/3.4/bin/llc /usr/bin/
gcc在Mac OS X Lion上象征性地链接到llvm-gcc prosseek ~> ls -alF /usr/bin/gcc lrwxr-xr-x 1 root wheel 12 Nov 12 14:39 /usr/bin/gcc@ -> llvm-gcc-4.2 当调用gcc时,如何设置gcc-4.2? 解决方案 似乎有一种方法可以将GCC与Xcode 4.2- http://caiustheory.com/install-gcc-421-papple-build-56663-with-xcode-42 其他解决方案 从狮子XCode 4.2开始,Apple不再播放其先前版本的gcc-4.2,该版本在Xcode 4.1和更早版本中.现在,它仅船舶llvm-gcc(代码后端的GCC前端)和clang(带有llvm后端的clang前端).虽然可以从其他来源(例如Macports)安装 vanilla vanila gcc-4.2的旧版本再支持gcc,
我正在设置OS X 10.7. 我正在使用python的默认安装: /library/frameworks/python.framework/versions/2.7/lib/python2.7/ 我使用一个基于Python的软件包管理器,称为Easy_install. easy_install似乎无法找到编译器. 编辑:当我尝试安装mysql-python时,我会收到此错误: $ sudo easy_install MySQL-python Password: Searching for MySQL-python Reading http://pypi.python.org/simple/MySQL-python/ Reading http://sourceforge.net/projects/mysql-python/ Reading http://sourceforge.net/projects/mysql-python Best match: MySQ
在我的Mac OS X版本上),有LLVM 3.0SVN和Clang 2.1. 来自 xccode网站似乎最新版本(4.2.1)仍然使用LLVM 2.0,这似乎是一个错误. 如果安装了最新的Xcode,我是否会得到llvm/clang的最新版本? 是否有任何可能的问题手动安装clang ? 安装后,我拥有的所有IDE都会自动使用新的叮当/a>)? 解决方案 软件供应商传统上对更新构建工具的更新和有充分的理由是保守的.如果您想使用Apple提供和修改的最新公共支持版本的构建工具,则应在您正在运行的OS X版本的最新版本的Xcode中坚持使用. 通常有充分的理由苹果尚未更新到最新的开源组件的最新尖端版本,例如严重的错误. 如果您不需要苹果提供的修改,并且不介意生活在边缘 - 即没有苹果的支持,也可能会发现已知问题 - 并且不打算将编译的文件运送到其他人们的系统,您 可以在/usr/local/bin中或使用第三方软件包管理器中安装自己的版本,例如 Mac
我正在学习生锈和ASM,并为此使用Godbolt. 我有一个看起来像: 的程序 pub fn test() -> i32 { let a = 1; let b = 2; let c = 3; a + b + c } 我希望输出看起来像 example::test: subq $16, %rsp movl $1, (%rsp) movl $2, 4(%rsp) movl $3, 8(%rsp) movl (%rsp), %eax addl 4(%rsp), %eax addl 8(%rsp), %eax addq $16, %rsp retq ,但我实际上得到了: example::test: mov eax, 6
这是一个后续问题,来自这个. 我正在使用llvm::CloneFunctionInto在llvm/Transforms/Utils/Cloning.h中定义的llvm::CloneFunctionInto,以创建一个新的函数,并在代码生成后使用返回值的类型推断出正确的签名.这很好,但是很慢 我试图通过某种方式将功能体从旧函数移动到新功能,对此有所优化,是否有效用? 我正在尝试通过查看中的代码,来攻击转移的方法. cloneFunctionInto ,但想看看是否存在现有函数 解决方案 无耻地从// Since we have now created the new function, splice the body of the old // function right into the new function, leaving the old rotting hulk of the // function empty. NF->getBasicBlockL
我一直在阅读各种编译器的功能,并且遇到了许多编译器执行的"积极优化"一词.例如,LLVM引用以下编译时优化功能: 内存/指针特定 循环变换 数据流 算术 消除代码 内线 这是什么意思?假设您有以下代码段,如何优化生成的字节代码以比编译器生成的更快运行?我特别有兴趣优化以C#,Java和Flash等JIT驱动的Runtimes的字节码.这很棘手,因为JIT仅支持处理器通常使用的Opcodes的子集,这限制了您可以执行的优化量.不过,我很想知道什么可能以及哪些转换可以推动VM的限制. 代码的虚拟块: for (i = 0; i > 16) - 10; }else{ out = ((in
我最近开始使用Clang/LLVM,并想知道是否有有关-ox优化级别的任何特定文档? 我在LLVM文档页面上找不到太多.有人可以分享一些链接吗? 谢谢. 解决方案 clang的命令行选项文档确实很差,特别是您正确地说,几乎没有解释优化级别的作用. freebsd,但是,确实会添加a 带有有用摘要的人页面: -O0 -O1 -O2 -Os -Oz -O3 -O4 指定要使用的优化级别. -O0表示"否 优化":此级别收集最快的 最可辩论的代码. -O2是中等水平的优化水平 这实现了大多数优化. -os就像-o2,额外 优化以减少代码尺寸. -oz就像-os(以及-o2), 但进一步减少了代码大小. -o3就像-o2,除了它 启用优化需要更长的执行或可能 生成较大的代码(试图使程序运行 快点).在支持的平台上,-O4启用链接时间 优化;对象文件存储在LLVM BitCode文件中 格式和整个程序优化是在链接时间完成的. -o1是 -o0和-o2之间的某个位置
我想具体地知道LLVM的各种优化水平与. 相对应. 也就是说,我想知道哪些优化通过是完全执行的(在前端之外)以及当我使用LLVM(或Clang或Opt)的" -0x"选项时的顺序. 相应工具的"人"没有提供有关此问题的太多信息(对于GCC的OpeSite). 我知道这个有用的页面: http://llvm.org/docs/passes.html ,但是它没有提供有关" -ox"选项的任何信息. 我一直在寻找一些调试或冗长的选项(尤其是使用" opt -help"中的信息),但我找不到任何有用的选项. 作为补充,我注意到分析代码,所有各种LLVM工具以及Clang都使用不同的驱动程序,这些驱动程序可以自己的方式解析选项.这些驱动程序在" -ox"选项方面是否相似? edit :我找到了" opt"工具的选项" -debug-pass = grimuments",它为选项" O1"提供以下输出: Pass Arguments: -targetdata -no-
我意识到LLVM还有很长的路要走,但是从理论上讲,可以在GCC/ICC/等中进行优化.对于单个语言,应用于LLVM字节代码?如果是这样,这是否意味着任何将汇编为LLVM字节代码的语言都有同样快的潜力?或是特定语言的优化(在LLVM字节码阶段之前)将始终在优化任何特定程序中发挥重要作用. 我对编译器或优化不太了解(仅足以危险),因此,如果这个问题没有很好地定义,我深表歉意. 解决方案 一般而言,no. 例如,在Haskell中,常见优化是严格的分析,它允许编译器确定哪些变量始终为正态正态形式,因此可以强制 +嵌入方式而无需更改程序语义. LLVM不可能. 说明:在Haskell中,函数(Int, Int) -> Int或多或少等同于C中的类型: typedef int (*returns_int)(); struct pair { returns_int first, second}; typedef struct pair *(*returns_pair)