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