Ver código fonte

[OPENMP]Fix crash for the ordered(n) clause.

If the doacross lop construct is used and the loop counter is declare
outside of the loop, the compiler might crash trying to get the address
of the loop counter. Patch fixes this problem.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@356198 91177308-0d34-0410-b5e6-96231b3b80d8
Alexey Bataev 6 anos atrás
pai
commit
bb8bb54e33

+ 3 - 2
lib/CodeGen/CGStmtOpenMP.cpp

@@ -1529,8 +1529,9 @@ void CodeGenFunction::EmitOMPPrivateLoopCounters(
          I < E; ++I) {
          I < E; ++I) {
       const auto *DRE = cast<DeclRefExpr>(C->getLoopCounter(I));
       const auto *DRE = cast<DeclRefExpr>(C->getLoopCounter(I));
       const auto *VD = cast<VarDecl>(DRE->getDecl());
       const auto *VD = cast<VarDecl>(DRE->getDecl());
-      // Override only those variables that are really emitted already.
-      if (LocalDeclMap.count(VD)) {
+      // Override only those variables that can be captured to avoid re-emission
+      // of the variables declared within the loops.
+      if (DRE->refersToEnclosingVariableOrCapture()) {
         (void)LoopScope.addPrivate(VD, [this, DRE, VD]() {
         (void)LoopScope.addPrivate(VD, [this, DRE, VD]() {
           return CreateMemTemp(DRE->getType(), VD->getName());
           return CreateMemTemp(DRE->getType(), VD->getName());
         });
         });

+ 1 - 2
lib/Sema/SemaOpenMP.cpp

@@ -4758,8 +4758,7 @@ DeclRefExpr *OpenMPIterationSpaceChecker::buildCounterVar(
       Captures.insert(std::make_pair(LCRef, Ref));
       Captures.insert(std::make_pair(LCRef, Ref));
     return Ref;
     return Ref;
   }
   }
-  return buildDeclRefExpr(SemaRef, VD, VD->getType().getNonReferenceType(),
-                          DefaultLoc);
+  return cast<DeclRefExpr>(LCRef);
 }
 }
 
 
 Expr *OpenMPIterationSpaceChecker::buildPrivateCounterVar() const {
 Expr *OpenMPIterationSpaceChecker::buildPrivateCounterVar() const {

+ 12 - 1
test/OpenMP/ordered_doacross_codegen.cpp

@@ -16,6 +16,17 @@ extern int n;
 int a[10], b[10], c[10], d[10];
 int a[10], b[10], c[10], d[10];
 void foo();
 void foo();
 
 
+// CHECK-LABEL:bar
+void bar() {
+  int i,j;
+// CHECK: call void @__kmpc_doacross_init(
+// CHECK: call void @__kmpc_doacross_fini(
+#pragma omp parallel for ordered(2)
+  for (i = 0; i < n; ++i)
+  for (j = 0; j < n; ++j)
+    a[i] = b[i] + 1;
+}
+
 // CHECK-LABEL: @main()
 // CHECK-LABEL: @main()
 int main() {
 int main() {
   int i;
   int i;
@@ -35,7 +46,7 @@ int main() {
 // CHECK: call void @__kmpc_doacross_init([[IDENT]], i32 [[GTID]], i32 1, i8* [[CAST]])
 // CHECK: call void @__kmpc_doacross_init([[IDENT]], i32 [[GTID]], i32 1, i8* [[CAST]])
 // CHECK: call void @__kmpc_for_static_init_4(
 // CHECK: call void @__kmpc_for_static_init_4(
 #pragma omp for ordered(1)
 #pragma omp for ordered(1)
-  for (i = 0; i < n; ++i) {
+  for (int i = 0; i < n; ++i) {
     a[i] = b[i] + 1;
     a[i] = b[i] + 1;
     foo();
     foo();
 // CHECK: invoke void [[FOO:.+]](
 // CHECK: invoke void [[FOO:.+]](