From 4fb08317af55c97f421047f0bdbfdd320ac76936 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Tue, 28 Aug 2012 18:58:57 +0000 Subject: [PATCH] Follow-up patch to r162731. Fix a couple of bugs in mips' long branch pass. This patch was supposed to be committed along with r162731, so I don't have a new test case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162777 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MipsLongBranch.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/Target/Mips/MipsLongBranch.cpp b/lib/Target/Mips/MipsLongBranch.cpp index 98d8d83fb9a..b9dbd522b70 100644 --- a/lib/Target/Mips/MipsLongBranch.cpp +++ b/lib/Target/Mips/MipsLongBranch.cpp @@ -257,10 +257,10 @@ void MipsLongBranch::expandToLongBranch(MBBInfo &I) { LongBrMBB->addSuccessor(BalTgtMBB); BalTgtMBB->addSuccessor(TgtMBB); - uint64_t TgtAddress = MBBInfos[TgtMBB->getNumber()].Address; - uint64_t Offset = TgtAddress - (I.Address + I.Size - 20); - uint64_t Lo = Offset & 0xffff; - uint64_t Hi = ((Offset + 0x8000) >> 16) & 0xffff; + int64_t TgtAddress = MBBInfos[TgtMBB->getNumber()].Address; + int64_t Offset = TgtAddress - (I.Address + I.Size - 20); + int64_t Lo = SignExtend64<16>(Offset & 0xffff); + int64_t Hi = SignExtend64<16>(((Offset + 0x8000) >> 16) & 0xffff); if (ABI != MipsSubtarget::N64) { // $longbr: @@ -317,8 +317,9 @@ void MipsLongBranch::expandToLongBranch(MBBInfo &I) { // $fallthrough: // - uint64_t Higher = ((Offset + 0x80008000) >> 32) & 0xffff; - uint64_t Highest = ((Offset + 0x800080008000LL) >> 48) & 0xffff; + int64_t Higher = SignExtend64<16>(((Offset + 0x80008000) >> 32) & 0xffff); + int64_t Highest = + SignExtend64<16>(((Offset + 0x800080008000LL) >> 48) & 0xffff); Pos = LongBrMBB->begin(); @@ -412,7 +413,7 @@ bool MipsLongBranch::runOnMachineFunction(MachineFunction &F) { continue; I->HasLongBranch = true; - I->Size += LongBranchSeqSize; + I->Size += LongBranchSeqSize * 4; ++LongBranches; EverMadeChange = MadeChange = true; } @@ -427,7 +428,7 @@ bool MipsLongBranch::runOnMachineFunction(MachineFunction &F) { uint64_t Address = 0; - for (I = MBBInfos.begin(); I != E; ++I, Address += I->Size) + for (I = MBBInfos.begin(); I != E; Address += I->Size, ++I) I->Address = Address; }