From 934536dab2585079d72b0218b3d5a2ea07795beb Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Wed, 31 Jan 2007 18:19:07 +0000 Subject: [PATCH] ConstPool island bug: watch out for cases where UserMI is the last MI of the BB. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33706 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMConstantIslandPass.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/Target/ARM/ARMConstantIslandPass.cpp b/lib/Target/ARM/ARMConstantIslandPass.cpp index eca3b04fbbb..32f8e8cb255 100644 --- a/lib/Target/ARM/ARMConstantIslandPass.cpp +++ b/lib/Target/ARM/ARMConstantIslandPass.cpp @@ -461,6 +461,7 @@ MachineBasicBlock *ARMConstantIslands::SplitBlockBeforeInstr(MachineInstr *MI) { /// is out-of-range. If so, pick it up the constant pool value and move it some /// place in-range. bool ARMConstantIslands::HandleConstantPoolUser(MachineFunction &Fn, CPUser &U){ + bool isThumb = AFI->isThumbFunction(); MachineInstr *UserMI = U.MI; MachineInstr *CPEMI = U.CPEMI; @@ -477,7 +478,7 @@ bool ARMConstantIslands::HandleConstantPoolUser(MachineFunction &Fn, CPUser &U){ // User before the CPE. if (CPEOffset-UserOffset <= U.MaxDisp) return false; - } else if (!AFI->isThumbFunction()) { + } else if (!isThumb) { // Thumb LDR cannot encode negative offset. if (UserOffset-CPEOffset <= U.MaxDisp) return false; @@ -487,15 +488,26 @@ bool ARMConstantIslands::HandleConstantPoolUser(MachineFunction &Fn, CPUser &U){ // Solution guaranteed to work: split the user's MBB right after the user and // insert a clone the CPE into the newly created water. - MachineInstr *NextMI = next(MachineBasicBlock::iterator(UserMI)); + MachineBasicBlock *UserMBB = UserMI->getParent(); + MachineBasicBlock *NewMBB; + // TODO: Search for the best place to split the code. In practice, using // loop nesting information to insert these guys outside of loops would be // sufficient. - MachineBasicBlock *NewBB = SplitBlockBeforeInstr(NextMI); + if (&UserMBB->back() == UserMI) { + assert(BBHasFallthrough(UserMBB) && "Expected a fallthrough BB!"); + NewMBB = next(MachineFunction::iterator(UserMBB)); + // Add an unconditional branch from UserMBB to fallthrough block. + BuildMI(UserMBB, TII->get(isThumb ? ARM::tB : ARM::B)).addMBB(NewMBB); + BBSizes[UserMBB->getNumber()] += isThumb ? 2 : 4; + } else { + MachineInstr *NextMI = next(MachineBasicBlock::iterator(UserMI)); + NewMBB = SplitBlockBeforeInstr(NextMI); + } // Okay, we know we can put an island before UserMBB now, do it! MachineBasicBlock *NewIsland = new MachineBasicBlock(); - Fn.getBasicBlockList().insert(NewBB, NewIsland); + Fn.getBasicBlockList().insert(NewMBB, NewIsland); // Update internal data structures to account for the newly inserted MBB. UpdateForInsertedWaterBlock(NewIsland);