From: Akira Hatanaka Date: Wed, 1 Aug 2018 23:51:53 +0000 (+0000) Subject: Serialize DoesNotEscape. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d64d826ce434fee4d6637be4126a0c632db9108a;p=clang Serialize DoesNotEscape. I forgot to commit this in r326530. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@338656 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 5605201a50..d17ec8e046 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -1472,6 +1472,7 @@ void ASTDeclReader::VisitBlockDecl(BlockDecl *BD) { BD->setIsVariadic(Record.readInt()); BD->setBlockMissingReturnType(Record.readInt()); BD->setIsConversionFromLambda(Record.readInt()); + BD->setDoesNotEscape(Record.readInt()); bool capturesCXXThis = Record.readInt(); unsigned numCaptures = Record.readInt(); diff --git a/lib/Serialization/ASTWriterDecl.cpp b/lib/Serialization/ASTWriterDecl.cpp index 3250a2e6bb..d83ac65e78 100644 --- a/lib/Serialization/ASTWriterDecl.cpp +++ b/lib/Serialization/ASTWriterDecl.cpp @@ -1097,6 +1097,7 @@ void ASTDeclWriter::VisitBlockDecl(BlockDecl *D) { Record.push_back(D->isVariadic()); Record.push_back(D->blockMissingReturnType()); Record.push_back(D->isConversionFromLambda()); + Record.push_back(D->doesNotEscape()); Record.push_back(D->capturesCXXThis()); Record.push_back(D->getNumCaptures()); for (const auto &capture : D->captures()) { diff --git a/test/PCH/no-escaping-block-tail-calls.cpp b/test/PCH/no-escaping-block-tail-calls.cpp new file mode 100644 index 0000000000..1e38d45f62 --- /dev/null +++ b/test/PCH/no-escaping-block-tail-calls.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -x c++-header -emit-pch -O1 -fblocks -fno-escaping-block-tail-calls -o %t %S/no-escaping-block-tail-calls.h +// RUN: %clang_cc1 -include-pch %t -emit-llvm -O1 -fblocks -fno-escaping-block-tail-calls -o - %s | FileCheck %s + +// Check that -fno-escaping-block-tail-calls doesn't disable tail-call +// optimization if the block is non-escaping. + +// CHECK-LABEL: define internal i32 @___ZN1S1mEv_block_invoke( +// CHECK: %[[CALL:.*]] = tail call i32 @_ZN1S3fooER2S0( +// CHECK-NEXT: ret i32 %[[CALL]] + +void test() { + S s; + s.m(); +} diff --git a/test/PCH/no-escaping-block-tail-calls.h b/test/PCH/no-escaping-block-tail-calls.h new file mode 100644 index 0000000000..5d37d90479 --- /dev/null +++ b/test/PCH/no-escaping-block-tail-calls.h @@ -0,0 +1,16 @@ +typedef int (^BlockTy)(void); + +struct S0 { + int a; +}; + +struct S { + int i; + void func(BlockTy __attribute__((noescape))); + int foo(S0 &); + + void m() { + __block S0 x; + func(^{ return foo(x); }); + } +};