From 99ec779a93cf7a09ac336b63d2d67818960343a1 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Mon, 23 Jun 2008 21:03:19 +0000 Subject: [PATCH] Instead of adding an isSS field to LiveInterval to denote stack slot. Use top bit of 'reg' instead. If the top bit is set, than the LiveInterval represents a stack slot live interval. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52639 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/LiveInterval.h | 12 ++++++++---- lib/CodeGen/LiveInterval.cpp | 4 ++-- lib/CodeGen/StackSlotColoring.cpp | 5 ++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/include/llvm/CodeGen/LiveInterval.h b/include/llvm/CodeGen/LiveInterval.h index b6f38dfc357..5e5e4b19572 100644 --- a/include/llvm/CodeGen/LiveInterval.h +++ b/include/llvm/CodeGen/LiveInterval.h @@ -101,8 +101,8 @@ namespace llvm { typedef SmallVector Ranges; typedef SmallVector VNInfoList; - bool isSS; // True if this represents a stack slot unsigned reg; // the register or stack slot of this interval + // if the top bits is set, it represents a stack slot. unsigned preference; // preferred register to allocate for this interval float weight; // weight of this interval Ranges ranges; // the ranges in which this register is live @@ -110,7 +110,9 @@ namespace llvm { public: LiveInterval(unsigned Reg, float Weight, bool IsSS = false) - : isSS(IsSS), reg(Reg), preference(0), weight(Weight) { + : reg(Reg), preference(0), weight(Weight) { + if (IsSS) + reg = reg | (1U << (sizeof(unsigned)*8-1)); } typedef Ranges::iterator iterator; @@ -143,13 +145,15 @@ namespace llvm { /// isStackSlot - Return true if this is a stack slot interval. /// - bool isStackSlot() const { return isSS; } + bool isStackSlot() const { + return reg & (1U << (sizeof(unsigned)*8-1)); + } /// getStackSlotIndex - Return stack slot index if this is a stack slot /// interval. int getStackSlotIndex() const { assert(isStackSlot() && "Interval is not a stack slot interval!"); - return reg; + return reg & ~(1U << (sizeof(unsigned)*8-1)); } bool containsOneValue() const { return valnos.size() == 1; } diff --git a/lib/CodeGen/LiveInterval.cpp b/lib/CodeGen/LiveInterval.cpp index 24081b99c0e..0f5de9257a7 100644 --- a/lib/CodeGen/LiveInterval.cpp +++ b/lib/CodeGen/LiveInterval.cpp @@ -678,8 +678,8 @@ void LiveRange::dump() const { void LiveInterval::print(std::ostream &OS, const TargetRegisterInfo *TRI) const { - if (isSS) - OS << "SS#" << reg; + if (isStackSlot()) + OS << "SS#" << getStackSlotIndex(); else if (TRI && TargetRegisterInfo::isPhysicalRegister(reg)) OS << TRI->getName(reg); else diff --git a/lib/CodeGen/StackSlotColoring.cpp b/lib/CodeGen/StackSlotColoring.cpp index 24bd028afda..b6a043c0dae 100644 --- a/lib/CodeGen/StackSlotColoring.cpp +++ b/lib/CodeGen/StackSlotColoring.cpp @@ -1,4 +1,4 @@ -//===-- StackSlotColoring.cpp - Sinking for machine instructions ----------===// +//===-- StackSlotColoring.cpp - Stack slot coloring pass. -----------------===// // // The LLVM Compiler Infrastructure // @@ -12,9 +12,9 @@ //===----------------------------------------------------------------------===// #define DEBUG_TYPE "stackcoloring" +#include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/LiveStackAnalysis.h" #include "llvm/CodeGen/MachineFrameInfo.h" -#include "llvm/CodeGen/Passes.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" @@ -201,7 +201,6 @@ int StackSlotColoring::ColorSlot(LiveInterval *li) { bool StackSlotColoring::ColorSlots(MachineFunction &MF) { unsigned NumObjs = MFI->getObjectIndexEnd(); std::vector SlotMapping(NumObjs, -1); - SlotMapping.resize(NumObjs, -1); bool Changed = false; for (unsigned i = 0, e = SSIntervals.size(); i != e; ++i) {