- 博客(35)
- 收藏
- 关注
原创 【语言学习】std::transform函数
如果不理解std::transform的三个参数的关系,就会对第三个参数的lambda表达式理解不了。其实,第三个参数的作用是提供给了一种对第一个参数(std::transform中是前两个参数,分别是begin和end)的一种处理操作。所以第三个参数的lambda表达式的输入对象是第一个参数。时,发现了其中使用了一个函数std::transform(原文对其进行了一层封装)可以看到,对每个元素进行了除2处理。
2024-03-05 21:37:43 280
原创 【语言学习】C++algorithm库的命名空间问题
algorithm中的函数不需要显式地使用std命名空间是因为这些函数通常在标准库头文件中声明。这意味着它们已经位于std命名空间中,因此你可以直接调用它们而无需前缀"std::"。这种设计有助于简化代码并提高可读性,但请注意,这仅适用于标准库中的函数。在定义copy函数的stl_algobase.h中,发现了_GLIBCXX_STD_C::这个宏,其定义在c++config.h中,时,发现一个很有趣的点,原来使用copy和back_inserter时不需要使用std::。可以看到,此处将其定义为std。
2024-03-05 21:20:11 263
原创 编写LLVM Pass的一个小问题
但是我在使用自己编译的ll文件时,我发现该pass无法正常使用。最后经过测试发现是利用-O0编译产生的ll文件有optnone的flag,需要将其删除,或使用-O1等flag。时发现一个很有趣的细节,官方给出了一个测试用例,此处有一个小问题(%无法复制)。
2024-02-23 20:32:34 222
原创 【LLVM】SCCP设置nuw和nsw的逻辑
可以看到,首先获取两个操作数对应的Range,分别为RangeA和RangeB,然后使用ConstantRange::makeGuaranteedNoWrapRegion方法获取不会溢出的区间范围,判断RangeA是否在该范围内,如果在,则说明不会溢出,可以设置对应的flag。此处注意A的R和L是和直觉相反的,这是因为对于溢出的情况,Upper是比Lower小的,也即Upper反而是左边的。如果第一个是Full或者第二个是empty,直接返回true,这很好理解,同样的,反之返回false。
2024-02-20 19:47:00 601
原创 【LLVM】nsw和nuw的一个例子
nsw和nuw是LLVMIR提供给二元运算的flag。分别表示not signed wrap和not unsigned wrap。在LLVM2.6的中表述如下:给出了和中不同的角度,该flag的添加相当于向编译器提供了一个不溢出的保证,让编译器基于此进行优化。
2024-02-20 00:09:11 691
原创 Rust学习心得
理解重影和可变变量的赋值。重影其实就是将一个变量名进行重新定义,这在弱类型的语言中是不存在的,例如C语言不允许在同一个作用域下将某个类型的变量修改为另一个类型。可变变量的赋值类似于C语言中的变量赋值。允许通过下划线分割一个大数的不同段。98_222——和C语言中的98222是一致的,也即下划线在此处的作用相当于大数的逗号。loop的设计loop是Rust提供的一个无限循环结构,可以通过break进行跳出,且break可以带参数以返回循环跳出时的相关变量。
2024-02-16 09:31:59 81
原创 【工具介绍】Herbie:浮点数运算化简工具
在一篇论文的case study部分看到了介绍该工具,可以化简浮点数运算,提供一个更简单的形式。该工具的目的就是解决用浮点数处理实数问题是造成的不准确的问题。分别贴一下项目源代码。
2024-02-05 23:03:40 140
原创 【论文研读】Better Together:Unifying Datalog and Equality Saturation
EqSat本质上是将Rewrite和history同时保存然后获得二者的好处。文章还介绍了一些EqSat的扩展,例如,支持语义分析以增加Soundness。Multi-pattern,看起来是将pattern的过程并行了,有两篇文章是这方面的工作,但还没有达到更优。提高e-matching的效率,最近的技术是relational e-matching。
2024-02-05 22:32:33 716
原创 NonDefUseDependency及例子
的。这可能导致程序在并行执行或重排序时出现问题,因为执行顺序的改变可能会影响到数据的正确性。这种所谓的没有经过明确定义的,也即没有通过限制指令标记两个指令之间是不可移动或不可并行的,但两个指令之间有明显的先后关系,如果并行可能会出现某种失败的情况。
2024-01-30 20:36:54 414
原创 推荐一个AI代码阅读神器
首先他的界面和vscode非常类似,对于vscode的老用户,切换起来开销非常小,此外用起来非常容易,打开项目之后勾选代码片段,然后输入自己的问题:例如需要对某个变量进行解释,或是对某个方面进行解释,回车即可等待AI的回复。最近阅读Reassociate代码时遇到了一个问题,也即自己手动阅读代码或是通过gdb进行调试的方法阅读代码,都不能避免细节过多造成的效率究极落后的情况,因此在网络上查阅相关的工具。唯一要吐槽的就是在笔记本电脑上chat板块的按键太小了,很费眼睛。最后发现了cursor,还挺好用的。
2024-01-29 20:01:15 498
原创 【LLVM Pass解读】Reassociate 重结合优化
首先,ReassociatePass是一个FunctionAnalysis,所以其入口函数为。
2024-01-29 15:05:44 806
原创 【LLVM源码解读】Modifying reassociate for improved CSE
这个patch是我在思考如何判断两个长表达式是否有公共子表达式时发现的。在此。该patch的作用主要是实现对一些复杂的例子通过重结合找到其中的公共子表达式。
2024-01-23 23:31:21 841
原创 调试LLVM Pass
在学习一个大型系统时,动态的方式(执行和调试)好过静态的方式,因此如果能掌握调试LLVM Pass的方法,也就能更好学习Pass的原理,并编写自己的Pass。本文记录笔者在调试LLVMPass时遇到的问题。
2024-01-14 14:34:01 357
原创 理解Herbrand Equivalence
论文的第二和第三部分分别给出了Herbrand等值关系和值编号的定义。首先来看第二部分。此公式首先定义了某个值到一个表达式的定义,作者的思路是将所有的值都上溯到定义他们的表达式的形式,这样可以比较不同值之间的相等性,带着这样的想法再来看上述公式,第一种情况是t=x的形式(根据后文的描述称为变量表达式),直接将x的表达式传递给t,第二种是t = t1 o t2的二元表达式形式(根据后文的描述称为包含运算符的表达式),将两个二元表达式的操作数的定义进行二元计算。
2024-01-10 15:50:33 1044
原创 一个GVN无法消除的例子
上述例子中,y+c在两个分支中是一致的,也即两个分支的表达式之间是冗余的计算,但LLVM的优化并没有将二者进行消除,而是使用了select结构。为了突出上述例子的严重性,我又造了一个例子,以显示此类问题。贴一个Compiler Explorer的。可以看到,LLVM没有看到两个Phi函数重结合的可能性,从而造成了冗余计算未成功消除。
2024-01-08 20:51:53 797
原创 编写自定义的LLVM Pass
今晚反思了一下,自己最近看的东西太发散了,只有一个模糊的主题——LLVM,然后看了很多作者的一系列文章,但是这些文章比较多而杂,大多数都是一个系列,且较为发散,近来又喜欢发现一个作者便将该作者的一系列文章进行阅读,然后其中引用了另一个作者的文章,又要读一大箩筐,这样铺的太开而没有线,今后还是以一个较为固定且细致的主题发布博文,这样也方便读者查找和掌握重点,用到的资料以链接的形式附在文中,如果某天的资料没有看完,仍可以将链接附在文中,以飨读者。本文主要是阅读LLVM的。
2024-01-06 23:13:36 424
原创 【工作日志】1月5日——指针分析 LLVM
在最近学习的过程中总是发现容易发散,没有中心,且很多好的资料,如果只存在本地的话既不容易在多个设备中流转,又不好标记,因此决定写一系列名为工作日志的文章,不奢求阅读数据,权当将好资料集中分享。在这里,但是给出的是makefile的构建方式,不喜欢,以后在看。今天在群里看到一个朋友询问别名分析时为什么使用二元组的形式,而不是使用指针分析中的结合形式,我在CSDN中查阅资料时,发现了。文章1提到的ModRef部分,即4.2.2的3,已经封装到一个单独的文件,附。,好东西,暂存,支持邮件列表。
2024-01-05 19:03:01 786
原创 gdb调试宏定义的方法
逛知乎时刷到了,讲述了如何在GDB中调试宏,笔者在复现的时候未成功,一直显示上下文中找不到对应的符号,用文中的-g3方法仍然无法打印出该符号,使用文中的方法利用readelf查看生成的调试信息,可以看到对应的宏信息,但仍然无法打印该标志。
2024-01-03 17:48:59 642
原创 【论文研读】Detection of redundant expressions: A precise, efficient, and pragmatic algorithm in SSA.
继续研读GVN领域的文章,又是一篇重要的文章,此文提出的算法已经在LLVM中实现为NewGVN。能够找到所有Herbrand等值关系且时间复杂度为polynomial。
2024-01-02 18:10:13 836
原创 【论文复现】Furthering Datalog in the pursuit of program analysis
本文是对同名论文中GVN相关部分的代码进行复现,该论文的研读可以看笔者主页。
2023-12-31 16:25:25 514
原创 【论文研读】Furthering Datalog in the pursuit of program analysis
本文是一篇博士论文,洋洋洒洒,内容丰富。虽然有些图例和程序上的小瑕疵,但本文不乏一篇好的文章。敢于使用LLVM编译器进行对比就是一个很贴近工业界的实验方法。笔者对Datalog和程序分析的相关技术理解尚浅,还需要更进一步的学习和成长!另外笔者主要关注GVN相关的技术,因此并未展开另外两部分,对相关技术感兴趣的读者也可以自行在网络中搜索原文来看。
2023-12-31 16:23:30 960
原创 x86_64在64位模式汇编指令的立即数扩展问题
该问题源自笔者在阅读《汇编语言——基于x86处理器》(基普·R.欧文 著 吴为民 译)(以下简称x86)一书时原作者提到的一个问题,也即在64位模式下处理32位立即数时存在的扩展模式不同的问题。本文使用的是原书第8版的译本,对应页码以此书为准。在该书第161页6.1.10 64位模式下的布尔指令,作者给出了如下一段程序可以看到,此处作者对32位进行and运算时,没有默认将高位看作全0,而是只对低32位进行了运算。当源操作数为32位以下的立即数时,通过0扩展将其扩充为32位。
2023-12-28 13:46:55 955
原创 signed integer overflow对编译器的影响
最开始接触这个问题,是在研究编译器对C和C++中的未定义行为的处理时看到的一篇文章。其中有一部分是对signed integer overflow类型的未定义行为进行介绍。作者举了一个例子,如果考虑溢出的情况,那么对于不等式 i+1 > i,不一定是恒成立的,也即如果编译器不考虑这种情况,直接将i+1>i优化为true,就会造成部分例子的错误。同样的,对于x * 2 / 2和x也存在这样的问题。
2023-12-23 16:09:25 728
原创 int main函数的最大返回值问题
通常情况下,当我们使用int main函数计算某个题目(例如计算10的阶乘)时,通常会将该结果通过printf或std::cout输出到控制台中,但是也可以将该值作为函数的返回值,以return的形式展示。通过汇编代码可以看到,在x86_64的测试机上,该值以常数的形式存储在eax寄存器上,但由[这篇文章][1]可以看到,该寄存器只能存储数字的低16位,也即最大为255。main函数在C语言中起到用户编写程序的入口函数的作用,尝尝以void或int类型作为返回值。
2023-12-19 20:39:41 362
原创 verilog 常见位宽问题集合
verilog 常见的位宽问题集合1. 位宽不等wire b[31:0];assign b = 5'b0;这种错误常见于赋值操作中。2. 保留最低位wire b;assign b = 32'h5;此时因为b缺省定义为1位长度,因此只能被赋值最低为1。3.位宽不匹配wire b[4:0];reg a;assign b = 5'ha;always @(*) begin if(b)begin a = 1; endend此段代码本意是想判断若b不为5’b0则将a赋值为1。
2021-06-15 11:26:46 9621 1
原创 ISE 14.7 修改编辑器为 VS CODE
ISE 14.7 修改编辑器为 VS CODEVS CODE 命令行启动修改 ISE 内置编辑器VS CODE 命令行启动打开新的命令行窗口,输入code --help查看帮助可知,vs code打开指定文件file的指定行line对应的命令为 code -g file:line。若在当前窗口打开文件,需要使用参数-r。修改 ISE 内置编辑器依次选择 Edit -> Preference -> ISE General -> Editors。在Editor:下拉框选择Custo
2021-04-21 09:07:10 873
原创 【微信小程序】 map 组件 callout 自定义气泡 (实实在在的讲解)
自定义气泡为什么出不来呢?主要注意以下问题:首先这里的 customCallout 是作为一个属性存在的,那么自然要在 WXML 中有所体现,主要体现在 markers 对象中的数据结构。需要保证 markers 对象中有如下字段customCallout: { anchorX: 0, anchorY: 0, display: "ALWAYS" }比如我自己开发过程中
2020-09-03 17:28:26 11016 14
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人