]> granicus.if.org Git - clang/commitdiff
Serialize DoesNotEscape.
authorAkira Hatanaka <ahatanaka@apple.com>
Wed, 1 Aug 2018 23:51:53 +0000 (23:51 +0000)
committerAkira Hatanaka <ahatanaka@apple.com>
Wed, 1 Aug 2018 23:51:53 +0000 (23:51 +0000)
I forgot to commit this in r326530.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@338656 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Serialization/ASTReaderDecl.cpp
lib/Serialization/ASTWriterDecl.cpp
test/PCH/no-escaping-block-tail-calls.cpp [new file with mode: 0644]
test/PCH/no-escaping-block-tail-calls.h [new file with mode: 0644]

index 5605201a509a4ca1ade0a1ce11768dfe82b135c8..d17ec8e04618662fa6b93ad447864767ba4fa4be 100644 (file)
@@ -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();
index 3250a2e6bbbc77f6f62e19ce60307aa271417270..d83ac65e78c982903f963c78c2dcc16a9ef52bec 100644 (file)
@@ -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 (file)
index 0000000..1e38d45
--- /dev/null
@@ -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 (file)
index 0000000..5d37d90
--- /dev/null
@@ -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); });
+  }
+};