Remove instructions instead of attempting to delete them. Instructions are allocated using the ArenaAllocator which uses a memory pool of "slabs", so we can't use the regular C++ delete to deallocate them. Just remove them from the list. This change also provides an override for Inst's operator delete to use the custom allocator, which should currently not be called. BUG=swiftshader:8 Change-Id: Ibb166910402a70e7d9276b28e19b15caf64422f2 Reviewed-on: https://chromium-review.googlesource.com/384336 Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Jim Stichnoth <stichnot@chromium.org>
diff --git a/src/IceCfgNode.cpp b/src/IceCfgNode.cpp index c7dac53..d8e95af 100644 --- a/src/IceCfgNode.cpp +++ b/src/IceCfgNode.cpp
@@ -74,7 +74,7 @@ auto I = L->begin(), E = L->end(), Next = I; for (++Next; I != E; I = Next++) { if (DoDelete && I->isDeleted()) { - L->erase(I); + L->remove(I); } else { I->renumber(Func); }
diff --git a/src/IceInst.h b/src/IceInst.h index 68bd1a2..d038d53 100644 --- a/src/IceInst.h +++ b/src/IceInst.h
@@ -193,6 +193,12 @@ virtual ~Inst() = default; void replaceDest(Variable *Var) { Dest = Var; } + void operator delete(void *Ptr, std::size_t Size) { + assert(CfgAllocatorTraits::current() != nullptr); + CfgAllocatorTraits::current()->Deallocate(Ptr, Size); + llvm::report_fatal_error("Inst unexpectedly deleted"); + } + protected: Inst(Cfg *Func, InstKind Kind, SizeT MaxSrcs, Variable *Dest); void addSource(Operand *Src) {