From 78409ae6391061f68cdef2ff4096a66da35f00d7 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Fri, 22 Sep 2017 16:56:13 +0000 Subject: [PATCH] [OPENMP] Handle re-declaration of captured variables in CodeGen. If the captured variable has re-declaration we may end up with the situation where the captured variable is the re-declaration while the referenced variable is the canonical declaration (or vice versa). In this case we may generate wrong code. Patch fixes this situation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@313995 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenFunction.h | 6 +++--- test/OpenMP/target_codegen.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 33bf74b5d3..7dca380597 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -263,9 +263,9 @@ public: if (I->capturesThis()) CXXThisFieldDecl = *Field; else if (I->capturesVariable()) - CaptureFields[I->getCapturedVar()] = *Field; + CaptureFields[I->getCapturedVar()->getCanonicalDecl()] = *Field; else if (I->capturesVariableByCopy()) - CaptureFields[I->getCapturedVar()] = *Field; + CaptureFields[I->getCapturedVar()->getCanonicalDecl()] = *Field; } } @@ -279,7 +279,7 @@ public: /// \brief Lookup the captured field decl for a variable. virtual const FieldDecl *lookup(const VarDecl *VD) const { - return CaptureFields.lookup(VD); + return CaptureFields.lookup(VD->getCanonicalDecl()); } bool isCXXThisExprCaptured() const { return getThisFieldDecl() != nullptr; } diff --git a/test/OpenMP/target_codegen.cpp b/test/OpenMP/target_codegen.cpp index 9d68dd4a1e..21c82d1cad 100644 --- a/test/OpenMP/target_codegen.cpp +++ b/test/OpenMP/target_codegen.cpp @@ -110,7 +110,7 @@ int foo(int n) { // CHECK: [[RET2:%.+]] = load i32, i32* [[RHV]], align 4 // CHECK-NEXT: [[ERROR:%.+]] = icmp ne i32 [[RET2]], 0 // CHECK: call void [[HVT1:@.+]](i[[SZ]] {{[^,]+}}) - #pragma omp target if(0) + #pragma omp target if(0) firstprivate(global) { global += 1; } -- 2.40.0