Fix SingleSource/Regression/C/2005-05-06-LongLongSignedShift.c, we were not
[oota-llvm.git] / lib / CodeGen / MachineFunction.cpp
index 3478e30e1f7986910608b63657704ee13c6392a4..d49a1ddb4b16f71338e83af382b6127a16ae528d 100644 (file)
@@ -1,12 +1,12 @@
 //===-- MachineFunction.cpp -----------------------------------------------===//
-// 
+//
 //                     The LLVM Compiler Infrastructure
 //
 // This file was developed by the LLVM research group and is distributed under
 // the University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+//
 //===----------------------------------------------------------------------===//
-// 
+//
 // Collect native machine code information for a function.  This allows
 // target-specific information about the generated code to be stored with each
 // function.
@@ -23,8 +23,8 @@
 #include "llvm/Target/TargetFrameInfo.h"
 #include "llvm/Function.h"
 #include "llvm/Instructions.h"
-#include "Support/LeakDetector.h"
-#include "Support/GraphWriter.h"
+#include "llvm/Support/LeakDetector.h"
+#include "llvm/Support/GraphWriter.h"
 #include <fstream>
 #include <iostream>
 #include <sstream>
@@ -32,7 +32,7 @@
 using namespace llvm;
 
 static AnnotationID MF_AID(
-                 AnnotationManager::getID("CodeGen::MachineCodeForFunction"));
+  AnnotationManager::getID("CodeGen::MachineCodeForFunction"));
 
 
 namespace {
@@ -61,7 +61,7 @@ namespace {
 /// stream is std::cerr; the default banner is empty.
 ///
 FunctionPass *llvm::createMachineFunctionPrinterPass(std::ostream *OS,
-                                                     const std::string &Banner) {
+                                                     const std::string &Banner){
   return new Printer(OS, Banner);
 }
 
@@ -89,26 +89,25 @@ FunctionPass *llvm::createMachineCodeDeleter() {
 //===---------------------------------------------------------------------===//
 // MachineFunction implementation
 //===---------------------------------------------------------------------===//
-MachineBasicBlock* ilist_traits<MachineBasicBlock>::createNode()
-{
-    MachineBasicBlock* dummy = new MachineBasicBlock();
-    LeakDetector::removeGarbageObject(dummy);
-    return dummy;
+
+MachineBasicBlock* ilist_traits<MachineBasicBlock>::createSentinel() {
+  MachineBasicBlock* dummy = new MachineBasicBlock();
+  LeakDetector::removeGarbageObject(dummy);
+  return dummy;
 }
 
 void ilist_traits<MachineBasicBlock>::transferNodesFromList(
-    iplist<MachineBasicBlock, ilist_traits<MachineBasicBlock> >& toList,
-    ilist_iterator<MachineBasicBlock> first,
-    ilist_iterator<MachineBasicBlock> last)
-{
-    if (Parent != toList.Parent)
-        for (; first != last; ++first)
-            first->Parent = toList.Parent;
+  iplist<MachineBasicBlock, ilist_traits<MachineBasicBlock> >& toList,
+  ilist_iterator<MachineBasicBlock> first,
+  ilist_iterator<MachineBasicBlock> last) {
+  if (Parent != toList.Parent)
+    for (; first != last; ++first)
+      first->Parent = toList.Parent;
 }
 
 MachineFunction::MachineFunction(const Function *F,
                                  const TargetMachine &TM)
-  : Annotation(MF_AID), Fn(F), Target(TM) {
+  : Annotation(MF_AID), Fn(F), Target(TM), UsedPhysRegs(0) {
   SSARegMapping = new SSARegMap();
   MFInfo = 0;
   FrameInfo = new MachineFrameInfo();
@@ -116,12 +115,13 @@ MachineFunction::MachineFunction(const Function *F,
   BasicBlocks.Parent = this;
 }
 
-MachineFunction::~MachineFunction() { 
+MachineFunction::~MachineFunction() {
   BasicBlocks.clear();
   delete SSARegMapping;
   delete MFInfo;
   delete FrameInfo;
   delete ConstantPool;
+  delete[] UsedPhysRegs;
 }
 
 void MachineFunction::dump() const { print(std::cerr); }
@@ -134,7 +134,7 @@ void MachineFunction::print(std::ostream &OS) const {
 
   // Print Constant Pool
   getConstantPool()->print(OS);
-  
+
   for (const_iterator BB = begin(); BB != end(); ++BB)
     BB->print(OS);
 
@@ -148,38 +148,38 @@ void MachineFunction::print(std::ostream &OS) const {
 static bool CFGOnly = false;
 
 namespace llvm {
-template<>
-struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
-  static std::string getGraphName(const MachineFunction *F) {
-    return "CFG for '" + F->getFunction()->getName() + "' function";
-  }
+  template<>
+  struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
+    static std::string getGraphName(const MachineFunction *F) {
+      return "CFG for '" + F->getFunction()->getName() + "' function";
+    }
 
-  static std::string getNodeLabel(const MachineBasicBlock *Node,
-                                  const MachineFunction *Graph) {
-    if (CFGOnly && Node->getBasicBlock() &&
-        !Node->getBasicBlock()->getName().empty())
-      return Node->getBasicBlock()->getName() + ":";
+    static std::string getNodeLabel(const MachineBasicBlock *Node,
+                                    const MachineFunction *Graph) {
+      if (CFGOnly && Node->getBasicBlock() &&
+          !Node->getBasicBlock()->getName().empty())
+        return Node->getBasicBlock()->getName() + ":";
 
-    std::ostringstream Out;
-    if (CFGOnly) {
-      Out << Node->getNumber() << ':';
-      return Out.str();
-    }
+      std::ostringstream Out;
+      if (CFGOnly) {
+        Out << Node->getNumber() << ':';
+        return Out.str();
+      }
 
-    Node->print(Out);
+      Node->print(Out);
 
-    std::string OutStr = Out.str();
-    if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
+      std::string OutStr = Out.str();
+      if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
 
-    // Process string output to make it nicer...
-    for (unsigned i = 0; i != OutStr.length(); ++i)
-      if (OutStr[i] == '\n') {                            // Left justify
-        OutStr[i] = '\\';
-        OutStr.insert(OutStr.begin()+i+1, 'l');
-      }
-    return OutStr;
-  }
-};
+      // Process string output to make it nicer...
+      for (unsigned i = 0; i != OutStr.length(); ++i)
+        if (OutStr[i] == '\n') {                            // Left justify
+          OutStr[i] = '\\';
+          OutStr.insert(OutStr.begin()+i+1, 'l');
+        }
+      return OutStr;
+    }
+  };
 }
 
 void MachineFunction::viewCFG() const
@@ -187,7 +187,7 @@ void MachineFunction::viewCFG() const
   std::string Filename = "/tmp/cfg." + getFunction()->getName() + ".dot";
   std::cerr << "Writing '" << Filename << "'... ";
   std::ofstream F(Filename.c_str());
-  
+
   if (!F) {
     std::cerr << "  error opening file for writing!\n";
     return;
@@ -221,7 +221,7 @@ void MachineFunction::viewCFGOnly() const
 // get()       -- Returns a handle to the object.
 //                This should not be called before "construct()"
 //                for a given Function.
-// 
+//
 MachineFunction&
 MachineFunction::construct(const Function *Fn, const TargetMachine &Tar)
 {
@@ -256,7 +256,8 @@ void MachineFunction::clearSSARegMap() {
 /// CreateStackObject - Create a stack object for a value of the specified type.
 ///
 int MachineFrameInfo::CreateStackObject(const Type *Ty, const TargetData &TD) {
-  return CreateStackObject(TD.getTypeSize(Ty), TD.getTypeAlignment(Ty));
+  return CreateStackObject((unsigned)TD.getTypeSize(Ty), 
+                           TD.getTypeAlignment(Ty));
 }
 
 
@@ -270,16 +271,16 @@ void MachineFrameInfo::print(const MachineFunction &MF, std::ostream &OS) const{
       OS << "variable sized";
     else
       OS << SO.Size << " byte" << (SO.Size != 1 ? "s" : " ");
-    
+
     if (i < NumFixedObjects)
       OS << " fixed";
     if (i < NumFixedObjects || SO.SPOffset != -1) {
       int Off = SO.SPOffset - ValOffset;
       OS << " at location [SP";
       if (Off > 0)
-       OS << "+" << Off;
+        OS << "+" << Off;
       else if (Off < 0)
-       OS << Off;
+        OS << Off;
       OS << "]";
     }
     OS << "\n";
@@ -304,4 +305,3 @@ void MachineConstantPool::print(std::ostream &OS) const {
 }
 
 void MachineConstantPool::dump() const { print(std::cerr); }
-