Index: clang/lib/Sema/Sema.cpp =================================================================== --- clang/lib/Sema/Sema.cpp +++ clang/lib/Sema/Sema.cpp @@ -923,10 +923,7 @@ Pending.begin(), Pending.end()); } - { - llvm::TimeTraceScope TimeScope("PerformPendingInstantiations"); - PerformPendingInstantiations(); - } + PerformPendingInstantiations(); // Finalize analysis of OpenMP-specific constructs. if (LangOpts.OpenMP) @@ -983,6 +980,8 @@ LateParsedInstantiations.begin(), LateParsedInstantiations.end()); LateParsedInstantiations.clear(); + + PerformPendingInstantiations(); } DiagnoseUnterminatedPragmaPack(); Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -5854,6 +5854,8 @@ /// Performs template instantiation for all implicit template /// instantiations we have seen until this point. void Sema::PerformPendingInstantiations(bool LocalOnly) { + llvm::TimeTraceScope TimeScope("PerformPendingInstantiations", + StringRef("")); while (!PendingLocalImplicitInstantiations.empty() || (!LocalOnly && !PendingInstantiations.empty())) { PendingImplicitInstantiation Inst; Index: clang/test/CodeGenCXX/vla-lambda-capturing.cpp =================================================================== --- clang/test/CodeGenCXX/vla-lambda-capturing.cpp +++ clang/test/CodeGenCXX/vla-lambda-capturing.cpp @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,NOPCH %s // RUN: %clang_cc1 %s -std=c++11 -emit-pch -o %t -// RUN: %clang_cc1 %s -std=c++11 -include-pch %t -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -std=c++11 -include-pch %t -emit-llvm -o - | FileCheck --check-prefixes=CHECK,PCH %s #ifndef HEADER #define HEADER @@ -111,14 +111,14 @@ // CHECK: call void @llvm.stackrestore( // CHECK: ret void -// CHECK: define linkonce_odr{{.*}} void [[F_INT_LAMBDA]]([[CAP_TYPE2]]* -// CHECK: [[THIS:%.+]] = load [[CAP_TYPE2]]*, [[CAP_TYPE2]]** -// CHECK: [[SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[THIS]], i{{.+}} 0, i{{.+}} 0 -// CHECK: [[SIZE:%.+]] = load [[INTPTR_T]], [[INTPTR_T]]* [[SIZE_REF]] -// CHECK: call i{{.+}}* @llvm.stacksave() -// CHECK: alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE]] -// CHECK: call void @llvm.stackrestore( -// CHECK: ret void +// NOPCH: define linkonce_odr{{.*}} void [[F_INT_LAMBDA]]([[CAP_TYPE2]]* +// NOPCH: [[THIS:%.+]] = load [[CAP_TYPE2]]*, [[CAP_TYPE2]]** +// NOPCH: [[SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[THIS]], i{{.+}} 0, i{{.+}} 0 +// NOPCH: [[SIZE:%.+]] = load [[INTPTR_T]], [[INTPTR_T]]* [[SIZE_REF]] +// NOPCH: call i{{.+}}* @llvm.stacksave() +// NOPCH: alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE]] +// NOPCH: call void @llvm.stackrestore( +// NOPCH: ret void // CHECK: define linkonce_odr{{.*}} void [[B_INT_LAMBDA]]([[CAP_TYPE3]]* // CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1 @@ -168,4 +168,14 @@ // CHECK: [[MUL:%.+]] = mul {{.*}} i{{[0-9]+}} [[SIZE2]], [[SIZE1]] // CHECK: mul {{.*}} i{{[0-9]+}} {{[0-9]+}}, [[MUL]] // CHECK: ret void + +// PCH: define linkonce_odr{{.*}} void [[F_INT_LAMBDA]]([[CAP_TYPE2]]* +// PCH: [[THIS:%.+]] = load [[CAP_TYPE2]]*, [[CAP_TYPE2]]** +// PCH: [[SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[THIS]], i{{.+}} 0, i{{.+}} 0 +// PCH: [[SIZE:%.+]] = load [[INTPTR_T]], [[INTPTR_T]]* [[SIZE_REF]] +// PCH: call i{{.+}}* @llvm.stacksave() +// PCH: alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE]] +// PCH: call void @llvm.stackrestore( +// PCH: ret void + #endif Index: clang/test/OpenMP/single_codegen.cpp =================================================================== --- clang/test/OpenMP/single_codegen.cpp +++ clang/test/OpenMP/single_codegen.cpp @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefixes=CHECK,NOPCH %s // RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,PCH %s // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -std=c++11 -fopenmp -fnoopenmp-use-tls -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG // RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -DARRAY -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -check-prefix=ARRAY %s @@ -230,6 +230,58 @@ // ARRAY: store %struct.St* %{{.+}}, %struct.St** %{{.+}}, #endif +// PCH-LABEL: @_ZN3SSTIdEC2Ev +// PCH: getelementptr inbounds [[SST_TY]], [[SST_TY]]* %{{.+}}, i32 0, i32 0 +// PCH-NEXT: store double 0.000000e+00, double* % +// PCH-NEXT: getelementptr inbounds [[SST_TY]], [[SST_TY]]* %{{.+}}, i32 0, i32 0 +// PCH-NEXT: store double* %{{.+}}, double** % +// PCH-NEXT: load double*, double** % +// PCH-NEXT: load double, double* % +// PCH-NEXT: bitcast i64* %{{.+}} to double* +// PCH-NEXT: store double %{{.+}}, double* % +// PCH-NEXT: load i64, i64* % +// PCH-NEXT: call void ([[IDENT_T_TY]]*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call([[IDENT_T_TY]]* @{{.+}}, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [[SST_TY]]*, i64)* [[SST_MICROTASK:@.+]] to void +// PCH-NEXT: ret void + +// PCH: define internal void [[SST_MICROTASK]](i32* {{[^,]+}}, i32* {{[^,]+}}, [[SST_TY]]* {{.+}}, i64 {{.+}}) +// PCH: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) +// PCH-NEXT: icmp ne i32 [[RES]], 0 +// PCH-NEXT: br i1 + +// PCH: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 +// PCH-NEXT: load double*, double** % +// PCH-NEXT: store double* % +// PCH-LABEL: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv( + +// PCH: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) +// PCH-NEXT: store i32 1, i32* [[DID_IT]], +// PCH-NEXT: br label + +// PCH: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) +// PCH-NEXT: br label + +// PCH: getelementptr inbounds [1 x i8*], [1 x i8*]* [[LIST:%.+]], i64 0, i64 0 +// PCH: load double*, double** % +// PCH-NEXT: bitcast double* % +// PCH-NEXT: store i8* % +// PCH-NEXT: bitcast [1 x i8*]* [[LIST]] to i8* +// PCH-NEXT: load i32, i32* [[DID_IT]], +// PCH-NEXT: call void @__kmpc_copyprivate([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}, i64 8, i8* %{{.+}}, void (i8*, i8*)* [[COPY_FUNC:@[^,]+]], i32 %{{.+}}) +// PCH-NEXT: ret void + +// PCH-LABEL: @_ZZN3SSTIdEC1EvENKUlvE_clEv( +// PCH: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 +// PCH-NEXT: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 +// PCH-NEXT: load double*, double** % +// PCH-NEXT: store double* % +// PCH-LABEL: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv( +// PCH-NEXT: ret void + +// PCH: define internal void [[COPY_FUNC]](i8* %0, i8* %1) +// PCH: ret void + +// PCH-LABEL: @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv( + // CHECK-LABEL:@_ZN2SSC2ERi( // CHECK: call void ([[IDENT_T_TY]]*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call([[IDENT_T_TY]]* @{{.+}}, i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [[SS_TY]]*, i64, i64, i64)* [[SS_MICROTASK:@.+]] to void // CHECK-NEXT: ret void @@ -385,54 +437,54 @@ // CHECK: define internal void [[COPY_FUNC]](i8* %0, i8* %1) // CHECK: ret void -// CHECK-LABEL: @_ZN3SSTIdEC2Ev -// CHECK: getelementptr inbounds [[SST_TY]], [[SST_TY]]* %{{.+}}, i32 0, i32 0 -// CHECK-NEXT: store double 0.000000e+00, double* % -// CHECK-NEXT: getelementptr inbounds [[SST_TY]], [[SST_TY]]* %{{.+}}, i32 0, i32 0 -// CHECK-NEXT: store double* %{{.+}}, double** % -// CHECK-NEXT: load double*, double** % -// CHECK-NEXT: load double, double* % -// CHECK-NEXT: bitcast i64* %{{.+}} to double* -// CHECK-NEXT: store double %{{.+}}, double* % -// CHECK-NEXT: load i64, i64* % -// CHECK-NEXT: call void ([[IDENT_T_TY]]*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call([[IDENT_T_TY]]* @{{.+}}, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [[SST_TY]]*, i64)* [[SST_MICROTASK:@.+]] to void -// CHECK-NEXT: ret void - -// CHECK: define internal void [[SST_MICROTASK]](i32* {{[^,]+}}, i32* {{[^,]+}}, [[SST_TY]]* {{.+}}, i64 {{.+}}) -// CHECK: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) -// CHECK-NEXT: icmp ne i32 [[RES]], 0 -// CHECK-NEXT: br i1 - -// CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 -// CHECK-NEXT: load double*, double** % -// CHECK-NEXT: store double* % -// CHECK-LABEL: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv( - -// CHECK: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) -// CHECK-NEXT: store i32 1, i32* [[DID_IT]], -// CHECK-NEXT: br label - -// CHECK: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) -// CHECK-NEXT: br label - -// CHECK: getelementptr inbounds [1 x i8*], [1 x i8*]* [[LIST:%.+]], i64 0, i64 0 -// CHECK: load double*, double** % -// CHECK-NEXT: bitcast double* % -// CHECK-NEXT: store i8* % -// CHECK-NEXT: bitcast [1 x i8*]* [[LIST]] to i8* -// CHECK-NEXT: load i32, i32* [[DID_IT]], -// CHECK-NEXT: call void @__kmpc_copyprivate([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}, i64 8, i8* %{{.+}}, void (i8*, i8*)* [[COPY_FUNC:@[^,]+]], i32 %{{.+}}) -// CHECK-NEXT: ret void - -// CHECK-LABEL: @_ZZN3SSTIdEC1EvENKUlvE_clEv( -// CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 -// CHECK-NEXT: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 -// CHECK-NEXT: load double*, double** % -// CHECK-NEXT: store double* % -// CHECK-LABEL: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv( -// CHECK-NEXT: ret void - -// CHECK: define internal void [[COPY_FUNC]](i8* %0, i8* %1) -// CHECK: ret void - -// CHECK-LABEL: @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv( +// NOPCH-LABEL: @_ZN3SSTIdEC2Ev +// NOPCH: getelementptr inbounds [[SST_TY]], [[SST_TY]]* %{{.+}}, i32 0, i32 0 +// NOPCH-NEXT: store double 0.000000e+00, double* % +// NOPCH-NEXT: getelementptr inbounds [[SST_TY]], [[SST_TY]]* %{{.+}}, i32 0, i32 0 +// NOPCH-NEXT: store double* %{{.+}}, double** % +// NOPCH-NEXT: load double*, double** % +// NOPCH-NEXT: load double, double* % +// NOPCH-NEXT: bitcast i64* %{{.+}} to double* +// NOPCH-NEXT: store double %{{.+}}, double* % +// NOPCH-NEXT: load i64, i64* % +// NOPCH-NEXT: call void ([[IDENT_T_TY]]*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call([[IDENT_T_TY]]* @{{.+}}, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [[SST_TY]]*, i64)* [[SST_MICROTASK:@.+]] to void +// NOPCH-NEXT: ret void + +// NOPCH: define internal void [[SST_MICROTASK]](i32* {{[^,]+}}, i32* {{[^,]+}}, [[SST_TY]]* {{.+}}, i64 {{.+}}) +// NOPCH: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) +// NOPCH-NEXT: icmp ne i32 [[RES]], 0 +// NOPCH-NEXT: br i1 + +// NOPCH: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 +// NOPCH-NEXT: load double*, double** % +// NOPCH-NEXT: store double* % +// NOPCH-LABEL: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv( + +// NOPCH: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) +// NOPCH-NEXT: store i32 1, i32* [[DID_IT]], +// NOPCH-NEXT: br label + +// NOPCH: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) +// NOPCH-NEXT: br label + +// NOPCH: getelementptr inbounds [1 x i8*], [1 x i8*]* [[LIST:%.+]], i64 0, i64 0 +// NOPCH: load double*, double** % +// NOPCH-NEXT: bitcast double* % +// NOPCH-NEXT: store i8* % +// NOPCH-NEXT: bitcast [1 x i8*]* [[LIST]] to i8* +// NOPCH-NEXT: load i32, i32* [[DID_IT]], +// NOPCH-NEXT: call void @__kmpc_copyprivate([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}, i64 8, i8* %{{.+}}, void (i8*, i8*)* [[COPY_FUNC:@[^,]+]], i32 %{{.+}}) +// NOPCH-NEXT: ret void + +// NOPCH-LABEL: @_ZZN3SSTIdEC1EvENKUlvE_clEv( +// NOPCH: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 +// NOPCH-NEXT: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 +// NOPCH-NEXT: load double*, double** % +// NOPCH-NEXT: store double* % +// NOPCH-LABEL: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv( +// NOPCH-NEXT: ret void + +// NOPCH: define internal void [[COPY_FUNC]](i8* %0, i8* %1) +// NOPCH: ret void + +// NOPCH-LABEL: @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(