From: Reed Kotler Date: Wed, 13 Nov 2013 23:52:18 +0000 (+0000) Subject: Take care of long short branch immediate instructions for mips16 in X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5aeb5e530e11a1473ecddb126b72cd4e37fada81;p=oota-llvm.git Take care of long short branch immediate instructions for mips16 in constant islands. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194630 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Mips/MipsConstantIslandPass.cpp b/lib/Target/Mips/MipsConstantIslandPass.cpp index c40b7fe39b8..c46bbacf658 100644 --- a/lib/Target/Mips/MipsConstantIslandPass.cpp +++ b/lib/Target/Mips/MipsConstantIslandPass.cpp @@ -417,13 +417,11 @@ bool MipsConstantIslands::runOnMachineFunction(MachineFunction &mf) { DEBUG(dbgs() << "Beginning BR iteration #" << NoBRIters << '\n'); bool BRChange = false; -#ifdef IN_PROGRESS for (unsigned i = 0, e = ImmBranches.size(); i != e; ++i) BRChange |= fixupImmediateBr(ImmBranches[i]); if (BRChange && ++NoBRIters > 30) report_fatal_error("Branch Fix Up pass failed to converge!"); DEBUG(dumpBBs()); -#endif if (!CPChange && !BRChange) break; MadeChange = true; @@ -588,7 +586,6 @@ initializeFunctionInfo(const std::vector &CPEMIs) { continue; int Opc = I->getOpcode(); -#ifdef IN_PROGRESS if (I->isBranch()) { bool isCond = false; unsigned Bits = 0; @@ -596,13 +593,21 @@ initializeFunctionInfo(const std::vector &CPEMIs) { int UOpc = Opc; switch (Opc) { default: - continue; // Ignore other JT branches + continue; // Ignore other branches for now + case Mips::Bimm16: + Bits = 11; + Scale = 2; + isCond = false; + break; + case Mips::BimmX16: + Bits = 16; + Scale = 2; + isCond = false; } // Record this immediate branch. unsigned MaxOffs = ((1 << (Bits-1))-1) * Scale; ImmBranches.push_back(ImmBranch(I, MaxOffs, isCond, UOpc)); } -#endif if (Opc == Mips::CONSTPOOL_ENTRY) continue; diff --git a/test/CodeGen/Mips/brsize3.ll b/test/CodeGen/Mips/brsize3.ll new file mode 100644 index 00000000000..7b1f44001a9 --- /dev/null +++ b/test/CodeGen/Mips/brsize3.ll @@ -0,0 +1,33 @@ +; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=pic -mips16-constant-islands < %s | FileCheck %s -check-prefix=b-no-short + +; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=pic -mips16-constant-islands < %s | FileCheck %s -check-prefix=b-long + +; ModuleID = 'brsize3.c' +target datalayout = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64" +target triple = "mips--linux-gnu" + +; Function Attrs: noreturn nounwind optsize +define void @foo() #0 { +entry: + br label %x + +x: ; preds = %x, %entry + tail call void asm sideeffect ".space 60000", ""() #1, !srcloc !1 + br label %x +; b-long: $BB0_1: +; b-long: #APP +; b-long: .space 60000 +; b-long: #NO_APP +; b-long: b $BB0_1 +; b-no-short: $BB0_1: +; b-no-short: #APP +; b-no-short: .space 60000 +; b-no-short: #NO_APP +; b-no-short-NOT: b $BB0_1 # 16 bit inst + +} + +attributes #0 = { noreturn nounwind optsize "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="true" } +attributes #1 = { nounwind } + +!1 = metadata !{i32 45} diff --git a/test/CodeGen/Mips/brsize3a.ll b/test/CodeGen/Mips/brsize3a.ll new file mode 100644 index 00000000000..6382fa228e1 --- /dev/null +++ b/test/CodeGen/Mips/brsize3a.ll @@ -0,0 +1,26 @@ +; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=pic -mips16-constant-islands < %s | FileCheck %s -check-prefix=b-short + +; ModuleID = 'brsize3.c' +target datalayout = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64" +target triple = "mips--linux-gnu" + +; Function Attrs: noreturn nounwind optsize +define void @foo() #0 { +entry: + br label %x + +x: ; preds = %x, %entry + tail call void asm sideeffect ".space 200", ""() #1, !srcloc !1 + br label %x +; b-short: $BB0_1: +; b-short: #APP +; b-short: .space 200 +; b-short: #NO_APP +; b-short: b $BB0_1 # 16 bit inst + +} + +attributes #0 = { noreturn nounwind optsize "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="true" } +attributes #1 = { nounwind } + +!1 = metadata !{i32 45}