OSDN Git Service

Write/read allocation instruction alignment info to .bc files.
authorChris Lattner <sabre@nondot.org>
Sat, 5 Nov 2005 22:08:14 +0000 (22:08 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 5 Nov 2005 22:08:14 +0000 (22:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24203 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bytecode/Reader/Reader.cpp
lib/Bytecode/Writer/Writer.cpp

index daf7577..9177270 100644 (file)
@@ -902,27 +902,33 @@ void BytecodeReader::ParseInstruction(std::vector<unsigned> &Oprnds,
     if (CallingConv) cast<InvokeInst>(Result)->setCallingConv(CallingConv);
     break;
   }
-  case Instruction::Malloc:
-    if (Oprnds.size() > 2)
+  case Instruction::Malloc: {
+    unsigned Align = 0;
+    if (Oprnds.size() == 2)
+      Align = (1 << Oprnds[1]) >> 1;
+    else if (Oprnds.size() > 2)
       error("Invalid malloc instruction!");
     if (!isa<PointerType>(InstTy))
       error("Invalid malloc instruction!");
 
     Result = new MallocInst(cast<PointerType>(InstTy)->getElementType(),
-                            Oprnds.size() ? getValue(Type::UIntTyID,
-                                                   Oprnds[0]) : 0);
+                            getValue(Type::UIntTyID, Oprnds[0]), Align);
     break;
+  }
 
-  case Instruction::Alloca:
-    if (Oprnds.size() > 2)
+  case Instruction::Alloca: {
+    unsigned Align = 0;
+    if (Oprnds.size() == 2)
+      Align = (1 << Oprnds[1]) >> 1;
+    else if (Oprnds.size() > 2)
       error("Invalid alloca instruction!");
     if (!isa<PointerType>(InstTy))
       error("Invalid alloca instruction!");
 
     Result = new AllocaInst(cast<PointerType>(InstTy)->getElementType(),
-                            Oprnds.size() ? getValue(Type::UIntTyID,
-                            Oprnds[0]) :0);
+                            getValue(Type::UIntTyID, Oprnds[0]), Align);
     break;
+  }
   case Instruction::Free:
     if (!isa<PointerType>(InstTy))
       error("Invalid free instruction!");
index b1f2634..d314231 100644 (file)
@@ -693,6 +693,13 @@ void BytecodeWriter::outputInstruction(const Instruction &I) {
       assert(Slots[1] != ~0U && "Cast return type unknown?");
       if (Slots[1] > MaxOpSlot) MaxOpSlot = Slots[1];
       NumOperands++;
+    } else if (const AllocationInst *AI = dyn_cast<AllocationInst>(&I)) {
+      assert(NumOperands == 1 && "Bogus allocation!");
+      if (AI->getAlignment()) {
+        Slots[1] = Log2_32(AI->getAlignment())+1;
+        if (Slots[1] > MaxOpSlot) MaxOpSlot = Slots[1];
+        NumOperands = 2;
+      }
     } else if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(&I)) {
       // We need to encode the type of sequential type indices into their slot #
       unsigned Idx = 1;