@ -38,9 +38,8 @@ void SysYOptPre::SysYDelInstAfterBr() {
for ( auto & basicBlock : basicBlocks ) {
bool Branch = false ;
auto & instructions = basicBlock - > getInstructions ( ) ;
auto iter = instructions . begin ( ) ;
auto Branchiter = instructions . end ( ) ;
for ( auto iter = instructions - > begin ( ) ; iter ! = instructions - > end ( ) ; iter+ + ) {
for ( auto iter = instructions . begin ( ) ; iter ! = instructions . end ( ) ; + + iter ) {
if ( Branch )
usedelete ( iter - > get ( ) ) ;
else if ( ( * iter ) - > isTerminator ( ) ) {
@ -48,8 +47,8 @@ void SysYOptPre::SysYDelInstAfterBr() {
Branchiter = iter ;
}
}
Branchiter + + ;
while ( Branchiter ! = instructions - > begin ( ) )
if ( Branchiter ! = instructions . end ( ) ) + + Branchiter ;
while ( Branchiter ! = instructions . end ( ) )
Branchiter = instructions . erase ( Branchiter ) ;
if ( Branch ) { // 更新前驱后继关系
@ -183,10 +182,8 @@ void SysYOptPre::SysYDelNoPreBLock() {
}
for ( auto blockIter = func - > getBasicBlocks ( ) . begin ( ) ; blockIter ! = func - > getBasicBlocks ( ) . end ( ) ; blockIter + + ) {
for ( auto blockIter = func - > getBasicBlocks ( ) . begin ( ) ; blockIter ! = func - > getBasicBlocks ( ) . end ( ) ; ) {
if ( ! blockIter - > get ( ) - > getreachable ( ) ) {
//// 处理phi指令
// 删除不可达基本块的phi指令的操作数
for ( auto succblock : blockIter - > get ( ) - > getSuccessors ( ) ) {
int indexphi = 1 ;
for ( auto pred : succblock - > getPredecessors ( ) ) {
@ -202,14 +199,16 @@ void SysYOptPre::SysYDelNoPreBLock() {
phiinst - > removeOperand ( indexphi ) ;
}
}
// 删除不可达基本块
func - > removeBasicBlock ( blockIter - > get ( ) ) ;
// 删除不可达基本块,注意迭代器不可达问题
func - > removeBasicBlock ( ( blockIter + + ) -> get ( ) ) ;
} else {
blockIter + + ;
}
}
}
}
void Sysy Optimization : : Sysy DelEmptyBlock ( ) {
void SysY OptPre : : SysY DelEmptyBlock ( ) {
auto & functions = pModule - > getFunctions ( ) ;
for ( auto & function : functions ) {
// 收集不可达基本块
@ -259,7 +258,7 @@ void SysyOptimization::SysyDelEmptyBlock() {
- - thelastinst ;
// 根据br指令传递的后继块信息, 跳过空块链
if ( thelastinst - > get ( ) - > getKind ( ) - > isUnconditional( ) ) {
if ( thelastinst - > get ( ) - > isUnconditional ( ) ) {
BasicBlock * OldBrBlock = dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 0 ) ) ;
BasicBlock * thelastBlockOld = nullptr ;
// 如果空块链表为多个块
@ -285,7 +284,7 @@ void SysyOptimization::SysyDelEmptyBlock() {
// 更新phi指令的操作数
// 移除thelastBlockOld对应的phi操作数
for ( auto & InstInNew : dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 1 ) ) - > getInstructions ( ) ) {
for ( auto & InstInNew : dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 0 ) ) - > getInstructions ( ) ) {
if ( InstInNew - > isPhi ( ) ) {
dynamic_cast < PhiInst * > ( InstInNew . get ( ) ) - > removeOperand ( indexphi + 1 ) ;
} else {
@ -322,12 +321,12 @@ void SysyOptimization::SysyDelEmptyBlock() {
// auto indexInNew = dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(0))->getPredecessors().
if ( thelastBlockOld ! = nullptr ) {
int index = 0 ;
int indexphi = 0 ;
for ( auto & pred : dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 1 ) ) - > getPredecessors ( ) ) {
if ( pred = = thelastBlockOld ) {
break ;
}
index + + ;
indexphi + + ;
}
for ( auto & InstInNew : dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 1 ) ) - > getInstructions ( ) ) {
@ -362,12 +361,12 @@ void SysyOptimization::SysyDelEmptyBlock() {
dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 2 ) ) - > addPredecessor ( basicBlock . get ( ) ) ;
if ( thelastBlockOld ! = nullptr ) {
int index = 0 ;
int indexphi = 0 ;
for ( auto & pred : dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 2 ) ) - > getPredecessors ( ) ) {
if ( pred = = thelastBlockOld ) {
break ;
}
index + + ;
indexphi + + ;
}
for ( auto & InstInNew : dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 2 ) ) - > getInstructions ( ) ) {
if ( InstInNew - > isPhi ( ) ) {
@ -398,12 +397,12 @@ void SysyOptimization::SysyDelEmptyBlock() {
basicBlock - > addSuccessor ( dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 0 ) ) ) ;
dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 0 ) ) - > addPredecessor ( basicBlock . get ( ) ) ;
if ( thelastBlockOld ! = nullptr ) {
int index = 0 ;
int indexphi = 0 ;
for ( auto & pred : dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 0 ) ) - > getPredecessors ( ) ) {
if ( pred = = thelastBlockOld ) {
break ;
}
index + + ;
indexphi + + ;
}
for ( auto & InstInNew : dynamic_cast < BasicBlock * > ( thelastinst - > get ( ) - > getOperand ( 0 ) ) - > getInstructions ( ) ) {
@ -461,7 +460,7 @@ void SysYOptPre::SysYAddReturn() {
auto & functions = pModule - > getFunctions ( ) ;
for ( auto & function : functions ) {
auto & func = function . second ;
auto & basicBlocks = func - > getBasicBlocks ( ) ;
auto basicBlocks = func - > getBasicBlocks ( ) ;
for ( auto & block : basicBlocks ) {
if ( block - > getNumSuccessors ( ) = = 0 ) {
// 如果基本块没有后继块,则添加一个返回指令