forked from gcc-mirror/gcc
-
Notifications
You must be signed in to change notification settings - Fork 19
Open
Description
0x0
对于指令流中的分支指令cpu对其分支预测失败后会导致刷流水线,进而导致性能下降
最好的解决方式是不产生分支指令,而在高级语言中对于一些结构简单的if-then-else语句我们可以尝试对其实施分支消除
0x1
下面我们在c语言中对于a、b比较,根据比较结果将c或d赋值给out(其中a、b、c、d、out为变量)的情况进行分析讨论
以下为测试代码模板
int main(void)
{
int a,b,c,d,out;
foo(&a,&b,&c,&d);
out = a<b?c:d;
/* 也可写做以下形式
if(a<b)
out = c;
else
out = d;
*/
foo1(out);
return 0;
}
根据abcd变量类型的不同我们考虑以下4种情况,并设计其分支消除的指令序列
-
abcd全为定点
全为定点可以使用以下序列,现有gcc后端代码已经实现slt maskeqz masknez or
-
abcd全为浮点
现有gcc后端代码已经实现fcmp fsel
-
ab为浮点cd为定点
这种情况有两种方案第一种是使用浮点fcmp,然后将fcc使用movcf2gr 移动到通用寄存器,再使用maskeqz masknez or
fcmp movcf2gr maskeqz masknez or
第二种将c、d使用movgr2fr移动到浮点寄存器,再进行浮点分支消除,完成后再将结果使用movfr2gr
movgr2fr movgr2fr fcmp fsel movfr2gr
-
ab为定点cd为浮点
这种情况和上一种情况一样也有两种方案
第一种,将stl结果使用movgr2cf到fcc再使用浮点fsel
stl movgr2cf fsel
第二种将定点数据移动到浮点寄存器,转换为浮点数据,再作浮点分支消除
movgr2fr ffint movgr2fr ffint fcmp fsel
0x2
为了实现分支消除我们需要对la后端作以下改动
- 适当调大branch cost,让gcc生成更多的分支消除代码
- 放宽define_expand "movcc"的条件使得abcd中既有浮点也有定点的情况也能被loongarch_expand_conditional_move处理
- 在loongarch_expand_conditional_move中增加0x2中描述的几种情况的处理代码
xen0n and yetistjunchao98
Metadata
Metadata
Assignees
Labels
No labels