diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2016-12-07 12:31:45 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2016-12-07 12:31:45 +0000 |
| commit | 926ab5b00b92c47c4a8f5f676bf0012a7c72524a (patch) | |
| tree | 7fa4c0aa327a76d75cf207320a9ebec0e4951bae /llvm/lib | |
| parent | ae5780104f1a784f5dffc6058125f6c686248ae9 (diff) | |
| download | bcm5719-llvm-926ab5b00b92c47c4a8f5f676bf0012a7c72524a.tar.gz bcm5719-llvm-926ab5b00b92c47c4a8f5f676bf0012a7c72524a.zip | |
[LowerTypeTests] Use the TrailingObjects infrastructure for trailing objects.
Also avoid allocating ~3x as much memory as needed.
llvm-svn: 288904
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index e4e3f151073..88942fdebff 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -30,6 +30,7 @@ #include "llvm/IR/Operator.h" #include "llvm/Pass.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/TrailingObjects.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" @@ -211,26 +212,29 @@ struct ByteArrayInfo { /// metadata types referenced by a global, which at the IR level is an expensive /// operation involving a map lookup; this data structure helps to reduce the /// number of times we need to do this lookup. -class GlobalTypeMember { +class GlobalTypeMember final : TrailingObjects<GlobalTypeMember, MDNode *> { GlobalObject *GO; size_t NTypes; - MDNode *Types[1]; // We treat this as a flexible array member. + + friend class TrailingObjects; + size_t numTrailingObjects(OverloadToken<MDNode *>) const { return NTypes; } public: static GlobalTypeMember *create(BumpPtrAllocator &Alloc, GlobalObject *GO, ArrayRef<MDNode *> Types) { - auto GTM = Alloc.Allocate<GlobalTypeMember>( - sizeof(GlobalTypeMember) + (Types.size() - 1) * sizeof(MDNode *)); + auto *GTM = static_cast<GlobalTypeMember *>(Alloc.Allocate( + totalSizeToAlloc<MDNode *>(Types.size()), alignof(GlobalTypeMember))); GTM->GO = GO; GTM->NTypes = Types.size(); - std::copy(Types.begin(), Types.end(), GTM->Types); + std::uninitialized_copy(Types.begin(), Types.end(), + GTM->getTrailingObjects<MDNode *>()); return GTM; } GlobalObject *getGlobal() const { return GO; } ArrayRef<MDNode *> types() const { - return {&Types[0], &Types[NTypes]}; + return makeArrayRef(getTrailingObjects<MDNode *>(), NTypes); } }; |

