From: Chad Rosier Date: Wed, 22 Feb 2012 21:36:06 +0000 (+0000) Subject: Revert r151172: Unwind path cleanup for array new list initializers. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4d8b79786bf1426ed7031274433279737a6917fe;p=clang Revert r151172: Unwind path cleanup for array new list initializers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151203 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index 00fbe9bfb0..af9c766238 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -804,32 +804,12 @@ CodeGenFunction::EmitNewArrayInitializer(const CXXNewExpr *E, unsigned initializerElements = 0; const Expr *Init = E->getInitializer(); - llvm::AllocaInst *endOfInit = 0; - QualType::DestructionKind dtorKind = elementType.isDestructedType(); - EHScopeStack::stable_iterator cleanup; - llvm::Instruction *cleanupDominator = 0; // If the initializer is an initializer list, first do the explicit elements. if (const InitListExpr *ILE = dyn_cast(Init)) { initializerElements = ILE->getNumInits(); - - // Enter a partial-destruction cleanup if necessary. - if (needsEHCleanup(dtorKind)) { - // In principle we could tell the cleanup where we are more - // directly, but the control flow can get so varied here that it - // would actually be quite complex. Therefore we go through an - // alloca. - endOfInit = CreateTempAlloca(beginPtr->getType(), "array.endOfInit"); - cleanupDominator = Builder.CreateStore(beginPtr, endOfInit); - pushIrregularPartialArrayCleanup(beginPtr, endOfInit, elementType, - getDestroyer(dtorKind)); - cleanup = EHStack.stable_begin(); - } - + QualType elementType = E->getAllocatedType(); + // FIXME: exception-safety for the explicit initializers for (unsigned i = 0, e = ILE->getNumInits(); i != e; ++i) { - // Tell the cleanup that it needs to destroy up to this - // element. TODO: some of these stores can be trivially - // observed to be unnecessary. - if (endOfInit) Builder.CreateStore(explicitPtr, endOfInit); StoreAnyExprIntoOneUnit(*this, ILE->getInit(i), elementType, explicitPtr); explicitPtr =Builder.CreateConstGEP1_32(explicitPtr, 1, "array.exp.next"); } @@ -845,12 +825,7 @@ CodeGenFunction::EmitNewArrayInitializer(const CXXNewExpr *E, // anything left to initialize. if (llvm::ConstantInt *constNum = dyn_cast(numElements)) { // If all elements have already been initialized, skip the whole loop. - if (constNum->getZExtValue() <= initializerElements) { - // If there was a cleanup, deactivate it. - if (cleanupDominator) - DeactivateCleanupBlock(cleanup, cleanupDominator);; - return; - } + if (constNum->getZExtValue() <= initializerElements) return; } else { llvm::BasicBlock *nonEmptyBB = createBasicBlock("new.loop.nonempty"); llvm::Value *isEmpty = Builder.CreateICmpEQ(explicitPtr, endPtr, @@ -870,11 +845,11 @@ CodeGenFunction::EmitNewArrayInitializer(const CXXNewExpr *E, Builder.CreatePHI(explicitPtr->getType(), 2, "array.cur"); curPtr->addIncoming(explicitPtr, entryBB); - // Store the new cleanup position for irregular cleanups. - if (endOfInit) Builder.CreateStore(curPtr, endOfInit); - // Enter a partial-destruction cleanup if necessary. - if (!cleanupDominator && needsEHCleanup(dtorKind)) { + QualType::DestructionKind dtorKind = elementType.isDestructedType(); + EHScopeStack::stable_iterator cleanup; + llvm::Instruction *cleanupDominator = 0; + if (needsEHCleanup(dtorKind)) { pushRegularPartialArrayCleanup(beginPtr, curPtr, elementType, getDestroyer(dtorKind)); cleanup = EHStack.stable_begin(); diff --git a/test/CodeGenCXX/new-array-init-exceptions.cpp b/test/CodeGenCXX/new-array-init-exceptions.cpp deleted file mode 100644 index 933f7f7553..0000000000 --- a/test/CodeGenCXX/new-array-init-exceptions.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// RUN: %clang_cc1 -std=c++11 -triple i386-unknown-unknown -fexceptions -fcxx-exceptions %s -emit-llvm -o - | FileCheck %s - -struct Throws { - Throws(int); - Throws(); - ~Throws(); -}; - -// CHECK: define void @_Z7cleanupi -void cleanup(int n) { - // CHECK: invoke void @_ZN6ThrowsC1Ei - // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD:[^ ]+]] - // CHECK: invoke void @_ZN6ThrowsC1Ei - // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]] - // CHECK: invoke void @_ZN6ThrowsC1Ei - // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]] - // CHECK: invoke void @_ZN6ThrowsC1Ev - // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]] - new Throws[n] { 1, 2, 3 }; - // CHECK: [[LPAD]]: - // CHECK-NEXT: landingpad - // CHECK: call void @_ZN6ThrowsD1Ev - // CHECK: call void @_ZdaPv -} - - -// CHECK: define void @_Z7cleanupv -void cleanup() { - // CHECK: invoke void @_ZN6ThrowsC1Ei - // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2:[^ ]+]] - // CHECK: invoke void @_ZN6ThrowsC1Ei - // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2]] - // CHECK: invoke void @_ZN6ThrowsC1Ei - // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2]] - new Throws[3] { 1, 2, 3 }; - // CHECK: [[LPAD2]]: - // CHECK-NEXT: landingpad - // CHECK: call void @_ZN6ThrowsD1Ev - // CHECK: call void @_ZdaPv -}