Allow the specification of explicit alignments for constant pool entries.
authorEvan Cheng <evan.cheng@apple.com>
Tue, 31 Jan 2006 22:23:14 +0000 (22:23 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 31 Jan 2006 22:23:14 +0000 (22:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25855 91177308-0d34-0410-b5e6-96231b3b80d8

14 files changed:
include/llvm/CodeGen/MachineConstantPool.h
include/llvm/CodeGen/SelectionDAG.h
include/llvm/CodeGen/SelectionDAGNodes.h
lib/CodeGen/AsmPrinter.cpp
lib/CodeGen/MachineFunction.cpp
lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp
lib/ExecutionEngine/JIT/JITEmitter.cpp
lib/Target/Alpha/AlphaISelLowering.cpp
lib/Target/IA64/IA64ISelDAGToDAG.cpp
lib/Target/PowerPC/PPCISelLowering.cpp
lib/Target/Sparc/SparcISelDAGToDAG.cpp
lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp
lib/Target/SparcV9/SparcV9AsmPrinter.cpp

index c2c3399adb74c08b75153e7991151fb5b6cd8528..1bbf88d843bd17e8907bb6f5d0afb601b380a3b3 100644 (file)
@@ -30,20 +30,23 @@ namespace llvm {
 class Constant;
 
 class MachineConstantPool {
-  std::vector<Constant*> Constants;
+  std::vector<std::pair<Constant*,unsigned> > Constants;
 public:
 
   /// getConstantPoolIndex - Create a new entry in the constant pool or return
-  /// an existing one.
+  /// an existing one. User may specify an alignment that is greater than the
+  /// default alignment. If one is not specified, it will be 0.
   ///
-  unsigned getConstantPoolIndex(Constant *C) {
+  unsigned getConstantPoolIndex(Constant *C, unsigned Alignment = 0) {
     // Check to see if we already have this constant.
     //
     // FIXME, this could be made much more efficient for large constant pools.
     for (unsigned i = 0, e = Constants.size(); i != e; ++i)
-      if (Constants[i] == C)
+      if (Constants[i].first == C) {
+        Constants[i].second = std::max(Constants[i].second, Alignment);
         return i;
-    Constants.push_back(C);
+      }
+    Constants.push_back(std::make_pair(C, Alignment));
     return Constants.size()-1;
   }
 
@@ -51,7 +54,9 @@ public:
   ///
   bool isEmpty() const { return Constants.empty(); }
 
-  const std::vector<Constant*> &getConstants() const { return Constants; }
+  const std::vector<std::pair<Constant*,unsigned> > &getConstants() const {
+    return Constants;
+  }
 
   /// print - Used by the MachineFunction printer to print information about
   /// stack objects.  Implemented in MachineFunction.cpp
index 195e8e435b0c2a9c6ab309a6a80b816f87813d3e..6d75e47acfb6d67624e839d15d2680f6d5d3ec85 100644 (file)
@@ -120,8 +120,10 @@ public:
                                    int offset = 0);
   SDOperand getFrameIndex(int FI, MVT::ValueType VT);
   SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT);
-  SDOperand getConstantPool(Constant *C, MVT::ValueType VT);
-  SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT);
+  SDOperand getConstantPool(Constant *C, MVT::ValueType VT,
+                            unsigned Alignment=0);
+  SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT,
+                                  unsigned Alignment=0);
   SDOperand getBasicBlock(MachineBasicBlock *MBB);
   SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT);
   SDOperand getTargetExternalSymbol(const char *Sym, MVT::ValueType VT);
@@ -606,8 +608,8 @@ private:
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs;
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstantFPs;
   std::map<int, SDNode*> FrameIndices, TargetFrameIndices;
-  std::map<Constant *, SDNode*> ConstantPoolIndices;
-  std::map<Constant *, SDNode*> TargetConstantPoolIndices;
+  std::map<std::pair<Constant *, unsigned>, SDNode*> ConstantPoolIndices;
+  std::map<std::pair<Constant *, unsigned>, SDNode*> TargetConstantPoolIndices;
   std::map<MachineBasicBlock *, SDNode*> BBNodes;
   std::vector<SDNode*> ValueTypeNodes;
   std::map<std::string, SDNode*> ExternalSymbols;
index ae2519a83632fe3eaa8c4fa4940ab11dfd5342db..0b850e617b16830155d665b29bed5cbcd08fcbca 100644 (file)
@@ -1058,14 +1058,20 @@ public:
 
 class ConstantPoolSDNode : public SDNode {
   Constant *C;
+  unsigned Alignment;
 protected:
   friend class SelectionDAG;
   ConstantPoolSDNode(Constant *c, MVT::ValueType VT, bool isTarget)
     : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT),
-    C(c) {}
+    C(c), Alignment(0) {}
+  ConstantPoolSDNode(Constant *c, MVT::ValueType VT, unsigned Align,
+                     bool isTarget)
+    : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT),
+    C(c), Alignment(Align) {}
 public:
 
   Constant *get() const { return C; }
+  unsigned getAlignment() const { return Alignment; }
 
   static bool classof(const ConstantPoolSDNode *) { return true; }
   static bool classof(const SDNode *N) {
index ab0465df1c3249465768efe573f8f447c1ca815a..df00f47f29342b4a27af62d2c7c9c722f7cb75aa 100644 (file)
@@ -103,7 +103,7 @@ void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
 /// the code generator.
 ///
 void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) {
-  const std::vector<Constant*> &CP = MCP->getConstants();
+  const std::vector<std::pair<Constant*, unsigned> > &CP = MCP->getConstants();
   if (CP.empty()) return;
   const TargetData &TD = TM.getTargetData();
   
@@ -111,13 +111,17 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) {
   for (unsigned i = 0, e = CP.size(); i != e; ++i) {
     // FIXME: force doubles to be naturally aligned.  We should handle this
     // more correctly in the future.
-    unsigned Alignment = TD.getTypeAlignmentShift(CP[i]->getType());
-    if (CP[i]->getType() == Type::DoubleTy && Alignment < 3) Alignment = 3;
+    unsigned Alignment = CP[i].second;
+    if (Alignment == 0) {
+      Alignment = TD.getTypeAlignmentShift(CP[i].first->getType());
+      if (CP[i].first->getType() == Type::DoubleTy && Alignment < 3)
+        Alignment = 3;
+    }
     
     EmitAlignment(Alignment);
     O << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << '_' << i
-      << ":\t\t\t\t\t" << CommentString << *CP[i] << '\n';
-    EmitGlobalConstant(CP[i]);
+      << ":\t\t\t\t\t" << CommentString << *CP[i].first << '\n';
+    EmitGlobalConstant(CP[i].first);
   }
 }
 
index f0ece6b3dbbec51691d853cc9e31875e03cfbc9b..3c41dbe4bb53cbed0c602b70601f63cffa13b856 100644 (file)
@@ -346,8 +346,11 @@ void MachineFrameInfo::dump(const MachineFunction &MF) const {
 //===----------------------------------------------------------------------===//
 
 void MachineConstantPool::print(std::ostream &OS) const {
-  for (unsigned i = 0, e = Constants.size(); i != e; ++i)
-    OS << "  <cp #" << i << "> is" << *(Value*)Constants[i] << "\n";
+  for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
+    OS << "  <cp #" << i << "> is" << *(Value*)Constants[i].first;
+    if (Constants[i].second != 0) OS << " , align=" << Constants[i].second;
+    OS << "\n";
+  }
 }
 
 void MachineConstantPool::dump() const { print(std::cerr); }
index 9f285d5c9c96d44bc24b1803a7371c7d2454e5df..c0fd3975649a1d8e4407af7593aa416ecfe54229 100644 (file)
@@ -194,7 +194,8 @@ void ScheduleDAG::EmitNode(NodeInfo *NI) {
         MI->addFrameIndexOperand(FI->getIndex());
       } else if (ConstantPoolSDNode *CP = 
                     dyn_cast<ConstantPoolSDNode>(Node->getOperand(i))) {
-        unsigned Idx = ConstPool->getConstantPoolIndex(CP->get());
+        unsigned Idx = ConstPool->getConstantPoolIndex(CP->get(),
+                                                       CP->getAlignment());
         MI->addConstantPoolIndexOperand(Idx);
       } else if (ExternalSymbolSDNode *ES = 
                  dyn_cast<ExternalSymbolSDNode>(Node->getOperand(i))) {
index aa9ea638f8e44341644b2d56d7a763e6b39549b2..6f1a263048d715c9a3d697ef8b227d2b3cbda3c1 100644 (file)
@@ -310,10 +310,14 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
     Erased = TargetFrameIndices.erase(cast<FrameIndexSDNode>(N)->getIndex());
     break;
   case ISD::ConstantPool:
-    Erased = ConstantPoolIndices.erase(cast<ConstantPoolSDNode>(N)->get());
+    Erased = ConstantPoolIndices.
+      erase(std::make_pair(cast<ConstantPoolSDNode>(N)->get(),
+                           cast<ConstantPoolSDNode>(N)->getAlignment()));
     break;
   case ISD::TargetConstantPool:
-    Erased =TargetConstantPoolIndices.erase(cast<ConstantPoolSDNode>(N)->get());
+    Erased = TargetConstantPoolIndices.
+      erase(std::make_pair(cast<ConstantPoolSDNode>(N)->get(),
+                           cast<ConstantPoolSDNode>(N)->getAlignment()));
     break;
   case ISD::BasicBlock:
     Erased = BBNodes.erase(cast<BasicBlockSDNode>(N)->getBasicBlock());
@@ -655,18 +659,20 @@ SDOperand SelectionDAG::getTargetFrameIndex(int FI, MVT::ValueType VT) {
   return SDOperand(N, 0);
 }
 
-SDOperand SelectionDAG::getConstantPool(Constant *C, MVT::ValueType VT) {
-  SDNode *&N = ConstantPoolIndices[C];
+SDOperand SelectionDAG::getConstantPool(Constant *C, MVT::ValueType VT,
+                                        unsigned Alignment) {
+  SDNode *&N = ConstantPoolIndices[std::make_pair(C, Alignment)];
   if (N) return SDOperand(N, 0);
-  N = new ConstantPoolSDNode(C, VT, false);
+  N = new ConstantPoolSDNode(C, VT, Alignment, false);
   AllNodes.push_back(N);
   return SDOperand(N, 0);
 }
 
-SDOperand SelectionDAG::getTargetConstantPool(Constant *C, MVT::ValueType VT) {
-  SDNode *&N = TargetConstantPoolIndices[C];
+SDOperand SelectionDAG::getTargetConstantPool(Constant *C, MVT::ValueType VT,
+                                              unsigned Alignment) {
+  SDNode *&N = TargetConstantPoolIndices[std::make_pair(C, Alignment)];
   if (N) return SDOperand(N, 0);
-  N = new ConstantPoolSDNode(C, VT, true);
+  N = new ConstantPoolSDNode(C, VT, Alignment, true);
   AllNodes.push_back(N);
   return SDOperand(N, 0);
 }
index fb204715efa55246ec760c430f364c49855cbb7d..d2f943f4016474f46350f3202fa39a691c0cdfa7 100644 (file)
@@ -566,16 +566,18 @@ void JITEmitter::finishFunction(MachineFunction &F) {
 }
 
 void JITEmitter::emitConstantPool(MachineConstantPool *MCP) {
-  const std::vector<Constant*> &Constants = MCP->getConstants();
+  const std::vector<std::pair<Constant*,unsigned> > &Constants = MCP->getConstants();
   if (Constants.empty()) return;
 
   for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
-    const Type *Ty = Constants[i]->getType();
+    const Type *Ty = Constants[i].first->getType();
     unsigned Size      = (unsigned)TheJIT->getTargetData().getTypeSize(Ty);
-    unsigned Alignment = TheJIT->getTargetData().getTypeAlignment(Ty);
+    unsigned Alignment = (Constants[i].second == 0)
+      ? TheJIT->getTargetData().getTypeAlignment(Ty)
+      : Constants[i].second;
 
     void *Addr = MemMgr.allocateConstant(Size, Alignment);
-    TheJIT->InitializeMemory(Constants[i], Addr);
+    TheJIT->InitializeMemory(Constants[i].first, Addr);
     ConstantPoolAddresses.push_back(Addr);
   }
 }
index 517ffaeab6a87f8cfabd7ecde34ef04b295ebaa2..2990146899b507234363788c66ceb85304a4e57b 100644 (file)
@@ -482,8 +482,9 @@ SDOperand AlphaTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
       }
   }
   case ISD::ConstantPool: {
-    Constant *C = cast<ConstantPoolSDNode>(Op)->get();
-    SDOperand CPI = DAG.getTargetConstantPool(C, MVT::i64);
+    ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op);
+    Constant *C = CP->get();
+    SDOperand CPI = DAG.getTargetConstantPool(C, MVT::i64, CP->getAlignment());
     
     SDOperand Hi = DAG.getNode(AlphaISD::GPRelHi,  MVT::i64, CPI,
                               DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
index 072b55b21245fb5351c1af1bb11b5b1957069966..2b817bb6fd806369c49ce2bc6ec7246f48d476ed 100644 (file)
@@ -442,8 +442,10 @@ SDOperand IA64DAGToDAGISel::Select(SDOperand Op) {
 
   case ISD::ConstantPool: { // TODO: nuke the constant pool
                            //       (ia64 doesn't need one)
-    Constant *C = cast<ConstantPoolSDNode>(N)->get();
-    SDOperand CPI = CurDAG->getTargetConstantPool(C, MVT::i64);
+    ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(N);
+    Constant *C = CP->get();
+    SDOperand CPI = CurDAG->getTargetConstantPool(C, MVT::i64,
+                                                  CP->getAlignment());
     return CurDAG->getTargetNode(IA64::ADDL_GA, MVT::i64, // ?
                              CurDAG->getRegister(IA64::r1, MVT::i64), CPI);
   }
index 8b5546d62cdc01451732f3b4c93a693ff819ac59..28beeafce16656ff06ee08b8d2a24e24643a8abc 100644 (file)
@@ -389,8 +389,9 @@ SDOperand PPCTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
     return DAG.getNode(ISD::BUILD_PAIR, MVT::i64, OutLo, OutHi);
   }
   case ISD::ConstantPool: {
-    Constant *C = cast<ConstantPoolSDNode>(Op)->get();
-    SDOperand CPI = DAG.getTargetConstantPool(C, MVT::i32);
+    ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op);
+    Constant *C = CP->get();
+    SDOperand CPI = DAG.getTargetConstantPool(C, MVT::i32, CP->getAlignment());
     SDOperand Zero = DAG.getConstant(0, MVT::i32);
     
     if (PPCGenerateStaticCode) {
index 38f3c15a8a63b2bc100ecd081daad30243ec0c1d..c2741059b03a01ced677a102ed51f37b9e37fb6b 100644 (file)
@@ -693,7 +693,8 @@ LowerOperation(SDOperand Op, SelectionDAG &DAG) {
   }
   case ISD::ConstantPool: {
     Constant *C = cast<ConstantPoolSDNode>(Op)->get();
-    SDOperand CP = DAG.getTargetConstantPool(C, MVT::i32);
+    SDOperand CP = DAG.getTargetConstantPool(C, MVT::i32,
+                                  cast<ConstantPoolSDNode>(Op)->getAlignment());
     SDOperand Hi = DAG.getNode(V8ISD::Hi, MVT::i32, CP);
     SDOperand Lo = DAG.getNode(V8ISD::Lo, MVT::i32, CP);
     return DAG.getNode(ISD::ADD, MVT::i32, Lo, Hi);
index 38f3c15a8a63b2bc100ecd081daad30243ec0c1d..c2741059b03a01ced677a102ed51f37b9e37fb6b 100644 (file)
@@ -693,7 +693,8 @@ LowerOperation(SDOperand Op, SelectionDAG &DAG) {
   }
   case ISD::ConstantPool: {
     Constant *C = cast<ConstantPoolSDNode>(Op)->get();
-    SDOperand CP = DAG.getTargetConstantPool(C, MVT::i32);
+    SDOperand CP = DAG.getTargetConstantPool(C, MVT::i32,
+                                  cast<ConstantPoolSDNode>(Op)->getAlignment());
     SDOperand Hi = DAG.getNode(V8ISD::Hi, MVT::i32, CP);
     SDOperand Lo = DAG.getNode(V8ISD::Lo, MVT::i32, CP);
     return DAG.getNode(ISD::ADD, MVT::i32, Lo, Hi);
index 564c7edf1f0ec265097d9ee51f4597942079e865..638a69952285b72cfd59d9286f6c22d8a599c5a1 100644 (file)
@@ -209,11 +209,14 @@ namespace {
     // Print a constant (which may be an aggregate) prefixed by all the
     // appropriate directives.  Uses printConstantValueOnly() to print the
     // value or values.
-    void printConstant(const Constant* CV, std::string valID = "") {
+    void printConstant(const Constant* CV, unsigned Alignment,
+                       std::string valID = "") {
       if (valID.length() == 0)
         valID = getID(CV);
 
-      O << "\t.align\t" << ConstantToAlignment(CV, TM) << "\n";
+      if (Alignment == 0)
+        Alignment = ConstantToAlignment(CV, TM);
+      O << "\t.align\t" << Alignment << "\n";
 
       // Print .size and .type only if it is not a string.
       if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV))
@@ -721,12 +724,12 @@ void SparcV9AsmPrinter::emitFunction(const Function &F) {
 
   // Emit constant pool for this function
   const MachineConstantPool *MCP = MF.getConstantPool();
-  const std::vector<Constant*> &CP = MCP->getConstants();
+  const std::vector<std::pair<Constant*, unsigned> > &CP = MCP->getConstants();
 
   enterSection(ReadOnlyData);
   for (unsigned i = 0, e = CP.size(); i != e; ++i) {
     std::string cpiName = ".CPI_" + CurrentFnName + "_" + utostr(i);
-    printConstant(CP[i], cpiName);
+    printConstant(CP[i].first, CP[i].second, cpiName);
   }
 
   enterSection(Text);
@@ -755,7 +758,7 @@ void SparcV9AsmPrinter::printGlobalVariable(const GlobalVariable* GV) {
   if (GV->hasInitializer() &&
       !(GV->getInitializer()->isNullValue() ||
         isa<UndefValue>(GV->getInitializer()))) {
-    printConstant(GV->getInitializer(), getID(GV));
+    printConstant(GV->getInitializer(), 0, getID(GV));
   } else {
     O << "\t.align\t" << TypeToAlignment(GV->getType()->getElementType(),
                                                 TM) << "\n";