Early if-conversion
用于对于没有很多可预测指令的乱序CPU。目标是消除可能误预测的条件分支。
来自分支两侧的指令都会被推测性地执行,并使用 cmov 指令选择结果。
// SSAIfConv 类在确定可能的情况下,对SSA形式的机器码执行if-conversion。该类不包含任何启发式方法;
// 外部代码应该用于确定何时进行 if-conversion 是个好主意。
//
// SSAIfConv 可以转换三角形和菱形:
//
// 三角形: Head 菱形: Head
// | \ / \_
// | \ / |
// | [TF]BB FBB TBB
// | / \ /
// | / \ /
// Tail Tail
//
// 条件块TBB和/或FBB中的指令被插入到Head块中,Tail块中的phi指令被转换为select指令。
按支配树的后序遍历访问块。后序遍历允许在单次遍历中进行嵌套的if转换。tryConvertIf() 函数可能会擦除块,但仅擦除由头块支配的块。这使得在后序遍历迭代器仍然活动时更新支配树是安全的。
./BiShengKernel/build3/bin/llc -debugify-and-strip-all-safe < ./BiShengKernel/llvm/test/CodeGen/AArch64/arm64-early-ifcvt.ll -stress-early-ifcvt -aarch64-enable-atomic-cfg-tidy=0 -stop-before=early-ifcvt -o 1.mir
./BiShengKernel/build3/bin/llc -debugify-and-strip-all-safe < ./BiShengKernel/llvm/test/CodeGen/AArch64/arm64-early-ifcvt.ll -stress-early-ifcvt -aarch64-enable-atomic-cfg-tidy=0 -stop-after=early-ifcvt -o 2.mir
./build3/bin/llc -run-pass=dot-machine-cfg 1.mir
dot .mm2.dot -T svg