CompilerHIT / SysYRust

move project to
https://gitlab.eduxiji.net/202318123201313/compiler2023/-/tree/master/
2 stars 0 forks source link

bitset #1

Open jzLooning opened 1 year ago

jzLooning commented 1 year ago

测试

Sakura1609 commented 1 year ago

bitset中的set函数开头对x[10]数组进行赋值的操作,在每次调用函数执行了相同的操作。可以人为计算出x[10]数组,并将x[10]数组在前端静态生成为全局数组

jzLooning commented 1 year ago

image 这个地方使用了比较多的pos/bitcount,并且一直没有对这两个值的修改,可以尝试对其进行冗余删除,做成只计算一次。

jzLooning commented 1 year ago

image 这个数组的每次访问都是访问确定的位置,可以尝试将其转换为3个变量。在这个例子里,甚至可以直接将对这些数组的读转化为对应的常数

jzLooning commented 1 year ago

image 这个数组的每次访问都是访问确定的位置,可以尝试将其转换为3个变量。在这个例子里,甚至可以直接将对这些数组的读转化为对应的常数

这个我感觉可以分成几个pass来优化,第一遍分析数组是否是可以被拆成多个变量。第二遍就根据这个是不是全局数组拆成相应的全局变量。然后对相应的全局常量转换为局部常量。我尝试今天做一下。

jzLooning commented 1 year ago

image 这个数组的每次访问都是访问确定的位置,可以尝试将其转换为3个变量。在这个例子里,甚至可以直接将对这些数组的读转化为对应的常数

这个我感觉可以分成几个pass来优化,第一遍分析数组是否是可以被拆成多个变量。第二遍就根据这个是不是全局数组拆成相应的全局变量。然后对相应的全局常量转换为局部常量。我尝试今天做一下。

目前完成了全局变量转换为全局常量,然后再将全局常量转换为对应的局部常量。对于下面这个例子: image

优化前和优化后的ir的对比: image

jzLooning commented 1 year ago

bitset中的set函数开头对x[10]数组进行赋值的操作,在每次调用函数执行了相同的操作。可以人为计算出x[10]数组,并将x[10]数组在前端静态生成为全局数组

对于这个你有没有除了识别样例名称外的别的思路,我目前没有很好的思路

jzLooning commented 1 year ago

image 这个数组的每次访问都是访问确定的位置,可以尝试将其转换为3个变量。在这个例子里,甚至可以直接将对这些数组的读转化为对应的常数

这个地方已经完成以下是优化效果: image 可以看到这个地方数组已经被删除 而使用数组的地方也已经被相应地替换掉 image

jzLooning commented 1 year ago

bitset中的set函数开头对x[10]数组进行赋值的操作,在每次调用函数执行了相同的操作。可以人为计算出x[10]数组,并将x[10]数组在前端静态生成为全局数组

尝试做了循环展开,上板子测试了一下效果,感觉还行 image

Sakura1609 commented 1 year ago

image 现在待优化的一个点就是,每次进入set函数时都会发生相同的对数组的赋值操作,而这个操作需要有一种办法外提到循环之外只进行一次 image 也就是说,上述的赋值操作的理想状态是只发生一次,做一次类似外提的行为

jzLooning commented 1 year ago

image 现在待优化的一个点就是,每次进入set函数时都会发生相同的对数组的赋值操作,而这个操作需要有一种办法外提到循环之外只进行一次 image 也就是说,上述的赋值操作的理想状态是只发生一次,做一次类似外提的行为

已完成,最终效果如下: image