From f578022ce27acd2234ee75ad8706ba992ea24a59 Mon Sep 17 00:00:00 2001
From: Akira Hatanaka <ahatanaka@apple.com>
Date: Sat, 15 Apr 2017 05:44:27 +0000
Subject: [PATCH] Revert "[ObjC] Use empty Objective-C collection literal
 constants when"

This reverts commit r300389. There were mistakes in the changes I made
to CodeGen.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@300391 91177308-0d34-0410-b5e6-96231b3b80d8
---
 include/clang/Basic/ObjCRuntime.h            | 14 ------
 lib/CodeGen/CGObjC.cpp                       | 16 +-----
 lib/Sema/SemaExprCXX.cpp                     | 12 -----
 test/CodeGenObjC/empty-collection-literals.m | 51 --------------------
 4 files changed, 2 insertions(+), 91 deletions(-)
 delete mode 100644 test/CodeGenObjC/empty-collection-literals.m

diff --git a/include/clang/Basic/ObjCRuntime.h b/include/clang/Basic/ObjCRuntime.h
index 8dc259c7ab6..78fc8998824 100644
--- a/include/clang/Basic/ObjCRuntime.h
+++ b/include/clang/Basic/ObjCRuntime.h
@@ -326,20 +326,6 @@ public:
     }
   }
 
-  /// Are the empty collection symbols available?
-  bool hasEmptyCollections() const {
-    switch (getKind()) {
-    default:
-      return false;
-    case MacOSX:
-      return getVersion() >= VersionTuple(10, 11);
-    case iOS:
-      return getVersion() >= VersionTuple(9);
-    case WatchOS:
-      return getVersion() >= VersionTuple(2);
-    }
-  }
-
   /// \brief Try to parse an Objective-C runtime specification from the given
   /// string.
   ///
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index 067718e2b8e..c011ab4dfc9 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -117,22 +117,10 @@ llvm::Value *CodeGenFunction::EmitObjCCollectionLiteral(const Expr *E,
   const ObjCArrayLiteral *ALE = dyn_cast<ObjCArrayLiteral>(E);
   if (!ALE)
     DLE = cast<ObjCDictionaryLiteral>(E);
-
-  // Optimize empty collections by referencing constants, when available.
+  
+  // Compute the type of the array we're initializing.
   uint64_t NumElements = 
     ALE ? ALE->getNumElements() : DLE->getNumElements();
-  if (NumElements == 0 && CGM.getLangOpts().ObjCRuntime.hasEmptyCollections()) {
-    StringRef ConstantName = ALE ? "__NSArray0__" : "__NSDictionary0__";
-    QualType IdTy(CGM.getContext().getObjCIdType());
-    llvm::Constant *Constant =
-        CGM.CreateRuntimeVariable(ConvertType(IdTy), ConstantName);
-    LValue LV = LValue::MakeAddr(Constant, IdTy,
-                                 Context.getTypeAlignInChars(IdTy), Context);
-    return Builder.CreateBitCast(EmitLoadOfScalar(LV, E->getLocStart()),
-                                 ConvertType(E->getType()));
-  }
-
-  // Compute the type of the array we're initializing.
   llvm::APInt APNumElements(Context.getTypeSize(Context.getSizeType()),
                             NumElements);
   QualType ElementType = Context.getObjCIdType().withConst();
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index d65570fcef7..485d012b6e6 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -5980,21 +5980,9 @@ ExprResult Sema::MaybeBindToTemporary(Expr *E) {
       } else if (ObjCBoxedExpr *BoxedExpr = dyn_cast<ObjCBoxedExpr>(E)) {
         D = BoxedExpr->getBoxingMethod();
       } else if (ObjCArrayLiteral *ArrayLit = dyn_cast<ObjCArrayLiteral>(E)) {
-        // Don't do reclaims if we're using the zero-element array
-        // constant.
-        if (ArrayLit->getNumElements() == 0 &&
-            Context.getLangOpts().ObjCRuntime.hasEmptyCollections())
-          return E;
-
         D = ArrayLit->getArrayWithObjectsMethod();
       } else if (ObjCDictionaryLiteral *DictLit
                                         = dyn_cast<ObjCDictionaryLiteral>(E)) {
-        // Don't do reclaims if we're using the zero-element dictionary
-        // constant.
-        if (DictLit->getNumElements() == 0 &&
-            Context.getLangOpts().ObjCRuntime.hasEmptyCollections())
-          return E;
-
         D = DictLit->getDictWithObjectsMethod();
       }
 
diff --git a/test/CodeGenObjC/empty-collection-literals.m b/test/CodeGenObjC/empty-collection-literals.m
deleted file mode 100644
index 0f9715f521f..00000000000
--- a/test/CodeGenObjC/empty-collection-literals.m
+++ /dev/null
@@ -1,51 +0,0 @@
-// RUN: %clang_cc1 -I %S/Inputs -triple x86_64-apple-macosx10.10.0 -fobjc-runtime=macosx-10.10.0 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck -check-prefix=CHECK-WITHOUT-EMPTY-COLLECTIONS %s
-// RUN: %clang_cc1 -I %S/Inputs -triple x86_64-apple-macosx10.11.0 -fobjc-runtime=macosx-10.11.0 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck -check-prefix=CHECK-WITH-EMPTY-COLLECTIONS %s
-
-// RUN: %clang_cc1 -I %S/Inputs -triple arm64-apple-ios8.0 -fobjc-runtime=ios-8.0 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck -check-prefix=CHECK-WITHOUT-EMPTY-COLLECTIONS %s
-// RUN: %clang_cc1 -I %S/Inputs -triple arm64-apple-ios9.0 -fobjc-runtime=ios-9.0 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck -check-prefix=CHECK-WITH-EMPTY-COLLECTIONS %s
-
-// RUN: %clang_cc1 -I %S/Inputs -triple armv7k-apple-watchos2.0 -fobjc-runtime=watchos-1.0 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck -check-prefix=CHECK-WITHOUT-EMPTY-COLLECTIONS %s
-// RUN: %clang_cc1 -I %S/Inputs -triple armv7k-apple-watchos2.0 -fobjc-runtime=watchos-2.0 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck -check-prefix=CHECK-WITH-EMPTY-COLLECTIONS %s
-
-// RUN: %clang_cc1 -I %S/Inputs -triple arm64-apple-tvos8.0 -fobjc-runtime=ios-8.0 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck -check-prefix=CHECK-WITHOUT-EMPTY-COLLECTIONS %s
-// RUN: %clang_cc1 -I %S/Inputs -triple arm64-apple-tvos9.0 -fobjc-runtime=ios-9.0 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck -check-prefix=CHECK-WITH-EMPTY-COLLECTIONS %s
-
-#include "literal-support.h"
-
-void test_empty_array() {
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS-LABEL: define void @test_empty_array
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS: {{call.*objc_msgSend}}
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS: {{call.*objc_retainAutoreleasedReturnValue}}
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS: ret void
-
-  // CHECK-WITH-EMPTY-COLLECTIONS-LABEL: define void @test_empty_array
-  // CHECK-WITH-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITH-EMPTY-COLLECTIONS: load {{.*}} @__NSArray0__
-  // CHECK-WITH-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITH-EMPTY-COLLECTIONS: {{call.*objc_retain\(}}
-  // CHECK-WITH-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITH-EMPTY-COLLECTIONS: call void @objc_storeStrong
-  // CHECK-WITH-EMPTY-COLLECTIONS-NEXT: ret void
-  NSArray *arr = @[];
-}
-
-void test_empty_dictionary() {
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS-LABEL: define void @test_empty_dictionary
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS: {{call.*objc_msgSend}}
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS: {{call.*objc_retainAutoreleasedReturnValue}}
-  // CHECK-WITHOUT-EMPTY-COLLECTIONS: ret void
-
-  // CHECK-WITH-EMPTY-COLLECTIONS-LABEL: define void @test_empty_dictionary
-  // CHECK-WITH-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITH-EMPTY-COLLECTIONS: load {{.*}} @__NSDictionary0__
-  // CHECK-WITH-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITH-EMPTY-COLLECTIONS: {{call.*objc_retain\(}}
-  // CHECK-WITH-EMPTY-COLLECTIONS-NOT: ret void
-  // CHECK-WITH-EMPTY-COLLECTIONS: call void @objc_storeStrong
-  // CHECK-WITH-EMPTY-COLLECTIONS-NEXT: ret void
-  NSDictionary *dict = @{};
-}
-- 
GitLab