1bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===-- User.cpp - Implement the User class -------------------------------===// 2bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// 3bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// The LLVM Compiler Infrastructure 4bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// 5bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// This file is distributed under the University of Illinois Open Source 6bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// License. See LICENSE.TXT for details. 7bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// 8bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 9bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 100b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/User.h" 110b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constant.h" 120b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h" 130b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Operator.h" 14bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 15bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foadnamespace llvm { 166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass BasicBlock; 17bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 18bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 19bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// User Class 20bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 21bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 220becc96b243da058f6d8901128b173d192db5148David Blaikievoid User::anchor() {} 230becc96b243da058f6d8901128b173d192db5148David Blaikie 24bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foadvoid User::replaceUsesOfWith(Value *From, Value *To) { 25bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad if (From == To) return; // Duh what? 26bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 27bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad assert((!isa<Constant>(this) || isa<GlobalValue>(this)) && 28bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad "Cannot call User::replaceUsesOfWith on a constant!"); 29bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 30bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad for (unsigned i = 0, E = getNumOperands(); i != E; ++i) 31bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad if (getOperand(i) == From) { // Is This operand is pointing to oldval? 32bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad // The side effects of this setOperand call include linking to 33bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad // "To", adding "this" to the uses list of To, and 34bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad // most importantly, removing "this" from the use list of "From". 35bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad setOperand(i, To); // Fix it now... 36bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad } 37bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} 38bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 39bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 40bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// User allocHungoffUses Implementation 41bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 42bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid User::allocHungoffUses(unsigned N, bool IsPhi) { 446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(HasHungOffUses && "alloc must have hung off uses"); 45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static_assert(AlignOf<Use>::Alignment >= AlignOf<Use::UserRef>::Alignment, 47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar "Alignment is insufficient for 'hung-off-uses' pieces"); 48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static_assert(AlignOf<Use::UserRef>::Alignment >= 49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AlignOf<BasicBlock *>::Alignment, 50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar "Alignment is insufficient for 'hung-off-uses' pieces"); 51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 5295c3e48f9557adb6064d580684bb14cacec2f826Jay Foad // Allocate the array of Uses, followed by a pointer (with bottom bit set) to 5395c3e48f9557adb6064d580684bb14cacec2f826Jay Foad // the User. 5495c3e48f9557adb6064d580684bb14cacec2f826Jay Foad size_t size = N * sizeof(Use) + sizeof(Use::UserRef); 556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (IsPhi) 566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar size += N * sizeof(BasicBlock *); 5795c3e48f9557adb6064d580684bb14cacec2f826Jay Foad Use *Begin = static_cast<Use*>(::operator new(size)); 58bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Use *End = Begin + N; 59691c05bb29d3e2ec9c2ed6b1c082ce5d484b75daJay Foad (void) new(End) Use::UserRef(const_cast<User*>(this), 1); 606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar setOperandList(Use::initTags(Begin, End)); 616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid User::growHungoffUses(unsigned NewNumUses, bool IsPhi) { 646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(HasHungOffUses && "realloc must have hung off uses"); 656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned OldNumUses = getNumOperands(); 676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // We don't support shrinking the number of uses. We wouldn't have enough 696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // space to copy the old uses in to the new space. 706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(NewNumUses > OldNumUses && "realloc must grow num uses"); 716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Use *OldOps = getOperandList(); 736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar allocHungoffUses(NewNumUses, IsPhi); 746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Use *NewOps = getOperandList(); 756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Now copy from the old operands list to the new one. 776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::copy(OldOps, OldOps + OldNumUses, NewOps); 786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // If this is a Phi, then we need to copy the BB pointers too. 806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (IsPhi) { 816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto *OldPtr = 826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar reinterpret_cast<char *>(OldOps + OldNumUses) + sizeof(Use::UserRef); 836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto *NewPtr = 846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar reinterpret_cast<char *>(NewOps + NewNumUses) + sizeof(Use::UserRef); 856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::copy(OldPtr, OldPtr + (OldNumUses * sizeof(BasicBlock *)), NewPtr); 866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Use::zap(OldOps, OldOps + OldNumUses, true); 88bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} 89bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 90f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 91f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// This is a private struct used by `User` to track the co-allocated descriptor 92f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// section. 93f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstruct DescriptorInfo { 94f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar intptr_t SizeInBytes; 95f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}; 96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarArrayRef<const uint8_t> User::getDescriptor() const { 98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar auto MutableARef = const_cast<User *>(this)->getDescriptor(); 99f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return {MutableARef.begin(), MutableARef.end()}; 100f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 101f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 102f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarMutableArrayRef<uint8_t> User::getDescriptor() { 103f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar assert(HasDescriptor && "Don't call otherwise!"); 104f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar assert(!HasHungOffUses && "Invariant!"); 105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 106f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar auto *DI = reinterpret_cast<DescriptorInfo *>(getIntrusiveOperands()) - 1; 107f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar assert(DI->SizeInBytes != 0 && "Should not have had a descriptor otherwise!"); 108f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 109f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return MutableArrayRef<uint8_t>( 110f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar reinterpret_cast<uint8_t *>(DI) - DI->SizeInBytes, DI->SizeInBytes); 111f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 112f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 113bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 114bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// User operator new Implementations 115bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 116bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 117f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid *User::allocateFixedOperandUser(size_t Size, unsigned Us, 118f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned DescBytes) { 1196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(Us < (1u << NumUserOperandsBits) && "Too many operands"); 120f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 121f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static_assert(sizeof(DescriptorInfo) % sizeof(void *) == 0, "Required below"); 122f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 123f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned DescBytesToAllocate = 124f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar DescBytes == 0 ? 0 : (DescBytes + sizeof(DescriptorInfo)); 125f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar assert(DescBytesToAllocate % sizeof(void *) == 0 && 126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar "We need this to satisfy alignment constraints for Uses"); 127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint8_t *Storage = static_cast<uint8_t *>( 129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ::operator new(Size + sizeof(Use) * Us + DescBytesToAllocate)); 130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Use *Start = reinterpret_cast<Use *>(Storage + DescBytesToAllocate); 131bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Use *End = Start + Us; 132bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad User *Obj = reinterpret_cast<User*>(End); 1336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Obj->NumUserOperands = Us; 1346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Obj->HasHungOffUses = false; 135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Obj->HasDescriptor = DescBytes != 0; 136bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad Use::initTags(Start, End); 137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (DescBytes != 0) { 139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar auto *DescInfo = reinterpret_cast<DescriptorInfo *>(Storage + DescBytes); 140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar DescInfo->SizeInBytes = DescBytes; 141f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 142f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 143bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad return Obj; 144bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} 145bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid *User::operator new(size_t Size, unsigned Us) { 147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return allocateFixedOperandUser(Size, Us, 0); 148f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid *User::operator new(size_t Size, unsigned Us, unsigned DescBytes) { 151f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return allocateFixedOperandUser(Size, Us, DescBytes); 152f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 153f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 1546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid *User::operator new(size_t Size) { 1556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Allocate space for a single Use* 1566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void *Storage = ::operator new(Size + sizeof(Use *)); 1576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Use **HungOffOperandList = static_cast<Use **>(Storage); 1586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar User *Obj = reinterpret_cast<User *>(HungOffOperandList + 1); 1596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Obj->NumUserOperands = 0; 1606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Obj->HasHungOffUses = true; 161f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Obj->HasDescriptor = false; 1626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar *HungOffOperandList = nullptr; 1636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Obj; 1646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 166bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 167bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad// User operator delete Implementation 168bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad//===----------------------------------------------------------------------===// 169bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 170bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foadvoid User::operator delete(void *Usr) { 1716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Hung off uses use a single Use* before the User, while other subclasses 1726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // use a Use[] allocated prior to the user. 1736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar User *Obj = static_cast<User *>(Usr); 1746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Obj->HasHungOffUses) { 175f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar assert(!Obj->HasDescriptor && "not supported!"); 176f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 1776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Use **HungOffOperandList = static_cast<Use **>(Usr) - 1; 1786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // drop the hung off uses. 1796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Use::zap(*HungOffOperandList, *HungOffOperandList + Obj->NumUserOperands, 1806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /* Delete */ true); 1816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ::operator delete(HungOffOperandList); 182f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } else if (Obj->HasDescriptor) { 183f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Use *UseBegin = static_cast<Use *>(Usr) - Obj->NumUserOperands; 184f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Use::zap(UseBegin, UseBegin + Obj->NumUserOperands, /* Delete */ false); 185f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar auto *DI = reinterpret_cast<DescriptorInfo *>(UseBegin) - 1; 187f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint8_t *Storage = reinterpret_cast<uint8_t *>(DI) - DI->SizeInBytes; 188f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ::operator delete(Storage); 1896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } else { 1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Use *Storage = static_cast<Use *>(Usr) - Obj->NumUserOperands; 1916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Use::zap(Storage, Storage + Obj->NumUserOperands, 1926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /* Delete */ false); 1936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ::operator delete(Storage); 1946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 195bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} 196bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad 19730f57da439dc6313e8704dec09da0a3789060608Richard Smith//===----------------------------------------------------------------------===// 19830f57da439dc6313e8704dec09da0a3789060608Richard Smith// Operator Class 19930f57da439dc6313e8704dec09da0a3789060608Richard Smith//===----------------------------------------------------------------------===// 20030f57da439dc6313e8704dec09da0a3789060608Richard Smith 20130f57da439dc6313e8704dec09da0a3789060608Richard SmithOperator::~Operator() { 20230f57da439dc6313e8704dec09da0a3789060608Richard Smith llvm_unreachable("should never destroy an Operator"); 20330f57da439dc6313e8704dec09da0a3789060608Richard Smith} 20430f57da439dc6313e8704dec09da0a3789060608Richard Smith 205bdbe342e8602e38c7eadb4f0c2664e7e30bff768Jay Foad} // End llvm namespace 206