Thanks, will fix this ASAP. Best regards, Alexey Bataev
> 24 июня 2019 г., в 1:37, Yvan Roux <yvan.r...@linaro.org> написал(а): > > Hi Alexey, > > This commit broke ARM bots, logs are availabale here: > > http://lab.llvm.org:8011/builders/clang-cmake-armv8-quick/builds/13627/steps/ninja%20check%201/logs/FAIL%3A%20Clang%3A%3Aparallel_codegen.cpp > > Thanks, > Yvan > > On Fri, 21 Jun 2019 at 19:25, Alexey Bataev via cfe-commits > <cfe-commits@lists.llvm.org> wrote: >> >> Author: abataev >> Date: Fri Jun 21 10:28:41 2019 >> New Revision: 364080 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=364080&view=rev >> Log: >> [OPENMP]Fix PR42068: Vla type is not captured. >> >> If the variably modified type is declared outside of the captured region >> and then used in the cast expression along with array subscript >> expression, the type is not captured and it leads to the compiler crash. >> >> Modified: >> cfe/trunk/lib/Sema/SemaExpr.cpp >> cfe/trunk/test/OpenMP/parallel_codegen.cpp >> >> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=364080&r1=364079&r2=364080&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jun 21 10:28:41 2019 >> @@ -4737,6 +4737,33 @@ Sema::CreateBuiltinArraySubscriptExpr(Ex >> assert(VK == VK_RValue || LangOpts.CPlusPlus || >> !ResultType.isCForbiddenLValueType()); >> >> + if (LHSExp->IgnoreParenImpCasts()->getType()->isVariablyModifiedType() && >> + FunctionScopes.size() > 1) { >> + if (auto *TT = >> + LHSExp->IgnoreParenImpCasts()->getType()->getAs<TypedefType>()) >> { >> + for (auto I = FunctionScopes.rbegin(), >> + E = std::prev(FunctionScopes.rend()); >> + I != E; ++I) { >> + auto *CSI = dyn_cast<CapturingScopeInfo>(*I); >> + if (CSI == nullptr) >> + break; >> + DeclContext *DC = nullptr; >> + if (auto *LSI = dyn_cast<LambdaScopeInfo>(CSI)) >> + DC = LSI->CallOperator; >> + else if (auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) >> + DC = CRSI->TheCapturedDecl; >> + else if (auto *BSI = dyn_cast<BlockScopeInfo>(CSI)) >> + DC = BSI->TheDecl; >> + if (DC) { >> + if (DC->containsDecl(TT->getDecl())) >> + break; >> + captureVariablyModifiedType( >> + Context, LHSExp->IgnoreParenImpCasts()->getType(), CSI); >> + } >> + } >> + } >> + } >> + >> return new (Context) >> ArraySubscriptExpr(LHSExp, RHSExp, ResultType, VK, OK, RLoc); >> } >> >> Modified: cfe/trunk/test/OpenMP/parallel_codegen.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_codegen.cpp?rev=364080&r1=364079&r2=364080&view=diff >> ============================================================================== >> --- cfe/trunk/test/OpenMP/parallel_codegen.cpp (original) >> +++ cfe/trunk/test/OpenMP/parallel_codegen.cpp Fri Jun 21 10:28:41 2019 >> @@ -15,16 +15,20 @@ >> // CHECK-DEBUG-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } >> // CHECK-DEBUG-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] >> c";unknown;unknown;0;0;;\00" >> // CHECK-DEBUG-DAG: [[DEF_LOC_2:@.+]] = private unnamed_addr global >> %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds >> ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } >> -// CHECK-DEBUG-DAG: [[LOC1:@.+]] = private unnamed_addr constant [{{.+}} x >> i8] c";{{.*}}parallel_codegen.cpp;main;[[@LINE+15]];1;;\00" >> -// CHECK-DEBUG-DAG: [[LOC2:@.+]] = private unnamed_addr constant [{{.+}} x >> i8] c";{{.*}}parallel_codegen.cpp;tmain;[[@LINE+7]];1;;\00" >> +// CHECK-DEBUG-DAG: [[LOC1:@.+]] = private unnamed_addr constant [{{.+}} x >> i8] c";{{.*}}parallel_codegen.cpp;main;[[@LINE+19]];1;;\00" >> +// CHECK-DEBUG-DAG: [[LOC2:@.+]] = private unnamed_addr constant [{{.+}} x >> i8] c";{{.*}}parallel_codegen.cpp;tmain;[[@LINE+8]];1;;\00" >> >> template <class T> >> void foo(T argc) {} >> >> template <typename T> >> int tmain(T argc) { >> + typedef double (*chunk_t)[argc[0][0]]; >> #pragma omp parallel >> + { >> foo(argc); >> + chunk_t var;(void)var[0][0]; >> + } >> return 0; >> } >> >> @@ -90,7 +94,7 @@ int main (int argc, char **argv) { >> >> // CHECK: define linkonce_odr {{[a-z\_\b]*[ ]?i32}} [[TMAIN]](i8** >> %argc) >> // CHECK: store i8** %argc, i8*** [[ARGC_ADDR:%.+]], >> -// CHECK-NEXT: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, >> ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC_2]], i32 1, void >> (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***)* [[OMP_OUTLINED:@.+]] >> to void (i32*, i32*, ...)*), i8*** [[ARGC_ADDR]]) >> +// CHECK: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, >> ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC_2]], i32 2, void >> (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***, i64)* >> [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*), i8*** [[ARGC_ADDR]], i64 >> %{{.+}}) >> // CHECK-NEXT: ret i32 0 >> // CHECK-NEXT: } >> // CHECK-DEBUG: define linkonce_odr i32 [[TMAIN]](i8** %argc) >> @@ -101,23 +105,23 @@ int main (int argc, char **argv) { >> // CHECK-DEBUG-NEXT: store i8** %argc, i8*** [[ARGC_ADDR:%.+]], >> // CHECK-DEBUG: [[KMPC_LOC_PSOURCE_REF:%.+]] = getelementptr inbounds >> %struct.ident_t, %struct.ident_t* [[LOC_2_ADDR]], i32 0, i32 4 >> // CHECK-DEBUG-NEXT: store i8* getelementptr inbounds ([{{.+}} x i8], >> [{{.+}} x i8]* [[LOC2]], i32 0, i32 0), i8** [[KMPC_LOC_PSOURCE_REF]] >> -// CHECK-DEBUG-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, >> ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[LOC_2_ADDR]], i32 1, void >> (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***)* [[OMP_OUTLINED:@.+]] >> to void (i32*, i32*, ...)*), i8*** [[ARGC_ADDR]]) >> +// CHECK-DEBUG-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, >> ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[LOC_2_ADDR]], i32 2, void >> (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***, i64)* >> [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*), i8*** [[ARGC_ADDR]], i64 >> %{{.+}}) >> // CHECK-DEBUG-NEXT: ret i32 0 >> // CHECK-DEBUG-NEXT: } >> >> -// CHECK: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias >> %.global_tid., i32* noalias %.bound_tid., i8*** dereferenceable({{4|8}}) >> %argc) >> +// CHECK: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias >> %.global_tid., i32* noalias %.bound_tid., i8*** dereferenceable({{4|8}}) >> %argc, i64 %{{.+}}) >> // CHECK: store i8*** %argc, i8**** [[ARGC_PTR_ADDR:%.+]], >> // CHECK: [[ARGC_REF:%.+]] = load i8***, i8**** [[ARGC_PTR_ADDR]] >> -// CHECK-NEXT: [[ARGC:%.+]] = load i8**, i8*** [[ARGC_REF]] >> +// CHECK: [[ARGC:%.+]] = load i8**, i8*** [[ARGC_REF]] >> // CHECK-NEXT: invoke {{.*}}void [[FOO1:@.+foo.+]](i8** [[ARGC]]) >> // CHECK: ret void >> // CHECK: call {{.*}}void @{{.+terminate.*|abort}}( >> // CHECK-NEXT: unreachable >> // CHECK-NEXT: } >> -// CHECK-DEBUG: define internal void [[OMP_OUTLINED_DEBUG:@.+]](i32* >> noalias %.global_tid., i32* noalias %.bound_tid., i8*** >> dereferenceable({{4|8}}) %argc) >> +// CHECK-DEBUG: define internal void [[OMP_OUTLINED_DEBUG:@.+]](i32* >> noalias %.global_tid., i32* noalias %.bound_tid., i8*** >> dereferenceable({{4|8}}) %argc, i64 %{{.+}}) >> // CHECK-DEBUG: store i8*** %argc, i8**** [[ARGC_PTR_ADDR:%.+]], >> // CHECK-DEBUG: [[ARGC_REF:%.+]] = load i8***, i8**** [[ARGC_PTR_ADDR]] >> -// CHECK-DEBUG-NEXT: [[ARGC:%.+]] = load i8**, i8*** [[ARGC_REF]] >> +// CHECK-DEBUG: [[ARGC:%.+]] = load i8**, i8*** [[ARGC_REF]] >> // CHECK-DEBUG-NEXT: invoke void [[FOO1:@.+foo.+]](i8** [[ARGC]]) >> // CHECK-DEBUG: ret void >> // CHECK-DEBUG: call void @{{.+terminate.*|abort}}( >> @@ -126,7 +130,7 @@ int main (int argc, char **argv) { >> >> // CHECK: define linkonce_odr {{.*}}void [[FOO1]](i8** %argc) >> // CHECK-DEBUG-DAG: define linkonce_odr void [[FOO1]](i8** %argc) >> -// CHECK-DEBUG-DAG: define internal void [[OMP_OUTLINED]](i32* noalias >> %.global_tid., i32* noalias %.bound_tid., i8*** dereferenceable({{4|8}}) >> %argc) >> +// CHECK-DEBUG-DAG: define internal void [[OMP_OUTLINED]](i32* noalias >> %.global_tid., i32* noalias %.bound_tid., i8*** dereferenceable({{4|8}}) >> %argc, i64 %{{.+}}) >> // CHECK-DEBUG-DAG: call void [[OMP_OUTLINED_DEBUG]]({{[^)]+}}){{[^,]*}}, >> !dbg >> >> // CHECK: attributes #[[FN_ATTRS]] = {{.+}} nounwind >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits