mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 04:38:24 +00:00
SCEVExpander's InsertCastOfTo knows how to move existing cast
instructions in order to avoid inserting new ones. However, if the cast instruction is the SCEVExpander's InsertPt, this causes subsequently emitted instructions to be inserted near the cast, and not at the location of the original insert point. Fix this by adjusting the insert point in such cases. This fixes PR4009. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69808 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -49,6 +49,9 @@ Value *SCEVExpander::InsertCastOfTo(Instruction::CastOps opcode, Value *V,
|
||||
// If the cast isn't the first instruction of the function, move it.
|
||||
if (BasicBlock::iterator(CI) !=
|
||||
A->getParent()->getEntryBlock().begin()) {
|
||||
// If the CastInst is the insert point, change the insert point.
|
||||
if (CI == InsertPt) ++InsertPt;
|
||||
// Splice the cast at the beginning of the entry block.
|
||||
CI->moveBefore(A->getParent()->getEntryBlock().begin());
|
||||
}
|
||||
return CI;
|
||||
@ -71,6 +74,8 @@ Value *SCEVExpander::InsertCastOfTo(Instruction::CastOps opcode, Value *V,
|
||||
It = cast<InvokeInst>(I)->getNormalDest()->begin();
|
||||
while (isa<PHINode>(It)) ++It;
|
||||
if (It != BasicBlock::iterator(CI)) {
|
||||
// If the CastInst is the insert point, change the insert point.
|
||||
if (CI == InsertPt) ++InsertPt;
|
||||
// Splice the cast immediately after the operand in question.
|
||||
CI->moveBefore(It);
|
||||
}
|
||||
|
Reference in New Issue
Block a user