<div class="socmaildefaultfont" dir="ltr" style="font-family:Arial, Helvetica, sans-serif;font-size:10.5pt" ><div dir="ltr" >Hi Richard,</div>
<div dir="ltr" > </div>
<div dir="ltr" >The tests in each section of the file use slightly different code, so it is not like the same code is generated multiple times. In each section the same code is compiled 4 times with different configurations Regular/Precompiled Header and 64/32.</div>
<div dir="ltr" > </div>
<div dir="ltr" >If I compile the code in a single go, the result would be very complex, hard to read, and in some cases the order of declarations vary depending on the clang build.</div>
<div dir="ltr" > </div>
<div dir="ltr" >What I can do is partition the test in multiple tests so that they run in parallel. Would that be a better approach?</div>
<div dir="ltr" > </div>
<div dir="ltr" >Let me know your thoughts,</div>
<div dir="ltr" > </div>
<div dir="ltr" >Thanks,</div>
<div dir="ltr" >Samuel</div>
<div dir="ltr" > </div>
<blockquote data-history-content-modified="1" dir="ltr" style="border-left:solid #aaaaaa 2px; margin-left:5px; padding-left:5px; direction:ltr; margin-right:0px" >----- Original message -----<br>From: Richard Smith <richard@metafoo.co.uk><br>Sent by: metafoo@gmail.com<br>To: Samuel F Antao/Watson/IBM@IBMUS<br>Cc: cfe-commits <cfe-commits@lists.llvm.org><br>Subject: Re: r276934 - [OpenMP] Add support to map member expressions with references to pointers.<br>Date: Thu, Nov 3, 2016 10:13 PM<br> 
<div dir="ltr" ><div><div>On Wed, Jul 27, 2016 at 3:52 PM, Samuel Antao via cfe-commits <span dir="ltr" ><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" >cfe-commits@lists.llvm.org</a>></span> wrote:

<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex" >Author: sfantao<br>Date: Wed Jul 27 17:52:16 2016<br>New Revision: 276934<br><br>URL: <a href="http://llvm.org/viewvc/llvm" target="_blank" >http://llvm.org/viewvc/llvm</a>-<wbr>project?rev=276934&view=rev<br>Log:<br>[OpenMP] Add support to map member expressions with references to pointers.<br><br>Summary: This patch add support to map pointers through references in class members. Although a reference does not have storage that a user can access, it still has to be mapped in order to get the deep copy right and the dereferencing code work properly.<br><br>Reviewers: hfinkel, carlo.bertolli, arpith-jacob, kkwli0, ABataev<br><br>Subscribers: caomhin, cfe-commits<br><br>Differential Revision: <a href="https://reviews.llvm.org/D22787" rel="noreferrer" target="_blank" >https://reviews.llvm.org/<wbr>D22787</a><br><br>Modified:<br>    cfe/trunk/lib/CodeGen/<wbr>CGOpenMPRuntime.cpp<br>    cfe/trunk/test/OpenMP/target_<wbr>map_codegen.cpp<br><br>Modified: cfe/trunk/lib/CodeGen/<wbr>CGOpenMPRuntime.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm" target="_blank" >http://llvm.org/viewvc/llvm</a>-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGOpenMPRuntime.cpp?rev=<wbr>276934&r1=276933&r2=276934&<wbr>view=diff<br>==============================<wbr>==============================<wbr>==================<br>--- cfe/trunk/lib/CodeGen/<wbr>CGOpenMPRuntime.cpp (original)<br>+++ cfe/trunk/lib/CodeGen/<wbr>CGOpenMPRuntime.cpp Wed Jul 27 17:52:16 2016<br>@@ -5320,14 +5320,34 @@ private:<br>                 isa<OMPArraySectionExpr>(Next-<wbr>>getAssociatedExpression())) &&<br>                "Unexpected expression");<br><br>-        // Save the base we are currently using.<br>-        BasePointers.push_back(BP);<br>-<br>         auto *LB = CGF.EmitLValue(I-><wbr>getAssociatedExpression()).<wbr>getPointer();<br>         auto *Size = getExprTypeSize(I-><wbr>getAssociatedExpression());<br><br>+        // If we have a member expression and the current component is a<br>+        // reference, we have to map the reference too. Whenever we have a<br>+        // reference, the section that reference refers to is going to be a<br>+        // load instruction from the storage assigned to the reference.<br>+        if (isa<MemberExpr>(I-><wbr>getAssociatedExpression()) &&<br>+            I->getAssociatedDeclaration()-<wbr>>getType()->isReferenceType()) {<br>+          auto *LI = cast<llvm::LoadInst>(LB);<br>+          auto *RefAddr = LI->getPointerOperand();<br>+<br>+          BasePointers.push_back(BP);<br>+          Pointers.push_back(RefAddr);<br>+          Sizes.push_back(CGF.<wbr>getTypeSize(CGF.getContext().<wbr>VoidPtrTy));<br>+          Types.push_back(<wbr>getMapTypeBits(<br>+              /*MapType*/ OMPC_MAP_alloc, /*MapTypeModifier=*/OMPC_MAP_<wbr>unknown,<br>+              !IsExpressionFirstInfo, IsCaptureFirstInfo));<br>+          IsExpressionFirstInfo = false;<br>+          IsCaptureFirstInfo = false;<br>+          // The reference will be the next base address.<br>+          BP = RefAddr;<br>+        }<br>+<br>+        BasePointers.push_back(BP);<br>         Pointers.push_back(LB);<br>         Sizes.push_back(Size);<br>+<br>         // We need to add a pointer flag for each map that comes from the<br>         // same expression except for the first one. We also need to signal<br>         // this map is the first one that relates with the current capture<br><br>Modified: cfe/trunk/test/OpenMP/target_<wbr>map_codegen.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm" target="_blank" >http://llvm.org/viewvc/llvm</a>-<wbr>project/cfe/trunk/test/OpenMP/<wbr>target_map_codegen.cpp?rev=<wbr>276934&r1=276933&r2=276934&<wbr>view=diff<br>==============================<wbr>==============================<wbr>==================<br>--- cfe/trunk/test/OpenMP/target_<wbr>map_codegen.cpp (original)<br>+++ cfe/trunk/test/OpenMP/target_<wbr>map_codegen.cpp Wed Jul 27 17:52:16 2016</blockquote>
<div> </div>
<div>This test file now takes 30s to run with a debug binary, and is one of Clang's slowest tests (tests are typically expected to finish in well under a second).</div>
<div> </div>
<div>Can you take a look? Instead of running the compiler 174 times on the same inputs with the same flags, how about just running it once and -- if necessary -- storing the output to a temporary file and passing that to FileCheck multiple times?</div>
<div> </div>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex" >@@ -4564,4 +4564,193 @@ void explicit_maps_pointer_<wbr>references (i<br>   }<br> }<br> #endif<br>+///==========================<wbr>==============================<wbr>==================///<br>+// RUN: %clang_cc1 -DCK29 -verify -fopenmp -fopenmp-targets=powerpc64le-<wbr>ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK29 --check-prefix CK29-64<br>+// RUN: %clang_cc1 -DCK29 -fopenmp -fopenmp-targets=powerpc64le-<wbr>ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s<br>+// RUN: %clang_cc1 -fopenmp -fopenmp-targets=powerpc64le-<wbr>ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s  --check-prefix CK29 --check-prefix CK29-64<br>+// RUN: %clang_cc1 -DCK29 -verify -fopenmp -fopenmp-targets=i386-pc-<wbr>linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK29 --check-prefix CK29-32<br>+// RUN: %clang_cc1 -DCK29 -fopenmp -fopenmp-targets=i386-pc-<wbr>linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s<br>+// RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-<wbr>linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s  --check-prefix CK29 --check-prefix CK29-32<br>+#ifdef CK29<br>+<br>+// CK29: [[SSA:%.+]] = type { double*, double** }<br>+// CK29: [[SSB:%.+]]  = type { [[SSA]]*, [[SSA]]** }<br>+<br>+// CK29: [[SIZE00:@.+]] = private {{.*}}constant [4 x i[[Z:64|32]]] [i[[Z:64|32]] {{8|4}}, i[[Z:64|32]] {{8|4}}, i[[Z:64|32]] {{8|4}}, i[[Z:64|32]] 80]<br>+// CK29: [[MTYPE00:@.+]] = private {{.*}}constant [4 x i32] [i32 35, i32 16, i32 19, i32 19]<br>+<br>+// CK29: [[SIZE01:@.+]] = private {{.*}}constant [4 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 80]<br>+// CK29: [[MTYPE01:@.+]] = private {{.*}}constant [4 x i32] [i32 32, i32 19, i32 19, i32 19]<br>+<br>+// CK29: [[SIZE02:@.+]] = private {{.*}}constant [5 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 80]<br>+// CK29: [[MTYPE02:@.+]] = private {{.*}}constant [5 x i32] [i32 32, i32 19, i32 16, i32 19, i32 19]<br>+<br>+struct SSA{<br>+  double *p;<br>+  double *&pr;<br>+  SSA(double *&pr) : pr(pr) {}<br>+};<br>+<br>+struct SSB{<br>+  SSA *p;<br>+  SSA *&pr;<br>+  SSB(SSA *&pr) : pr(pr) {}<br>+<br>+  // CK29-LABEL: define {{.+}}foo<br>+  void foo() {<br>+<br>+    // Region 00<br>+    // CK29-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE00]]{{.+}})<br>+<br>+    // CK29-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]<br>+    // CK29-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]<br>+<br>+    // CK29-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0<br>+    // CK29-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0<br>+    // CK29-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]<br>+    // CK29-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]<br>+    // CK29-DAG: [[CBPVAL0]] = bitcast [[SSB]]* [[VAR0:%.+]] to i8*<br>+    // CK29-DAG: [[CPVAL0]] = bitcast [[SSA]]** [[VAR00:%.+]] to i8*<br>+    // CK29-DAG: [[VAR0]] = load [[SSB]]*, [[SSB]]** %<br>+    // CK29-DAG: [[VAR00]] = getelementptr inbounds [[SSB]], [[SSB]]* [[VAR0]], i32 0, i32 0<br>+<br>+    // CK29-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1<br>+    // CK29-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1<br>+    // CK29-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]<br>+    // CK29-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]<br>+    // CK29-DAG: [[CBPVAL1]] = bitcast [[SSA]]** [[VAR00]] to i8*<br>+    // CK29-DAG: [[CPVAL1]] = bitcast double*** [[VAR1:%.+]] to i8*<br>+    // CK29-DAG: [[VAR1]] = getelementptr inbounds [[SSA]], [[SSA]]* %{{.+}}, i32 0, i32 1<br>+<br>+    // CK29-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2<br>+    // CK29-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2<br>+    // CK29-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]<br>+    // CK29-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]<br>+    // CK29-DAG: [[CBPVAL2]] = bitcast double*** [[VAR1]] to i8*<br>+    // CK29-DAG: [[CPVAL2]] = bitcast double** [[VAR2:%.+]] to i8*<br>+    // CK29-DAG: [[VAR2]] = load double**, double*** [[VAR22:%.+]],<br>+    // CK29-DAG: [[VAR22]] = getelementptr inbounds [[SSA]], [[SSA]]* %{{.+}}, i32 0, i32 1<br>+<br>+    // CK29-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3<br>+    // CK29-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3<br>+    // CK29-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]]<br>+    // CK29-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]]<br>+    // CK29-DAG: [[CBPVAL3]] = bitcast double** [[VAR2]] to i8*<br>+    // CK29-DAG: [[CPVAL3]] = bitcast double* [[VAR3:%.+]] to i8*<br>+    // CK29-DAG: [[VAR3]] = getelementptr inbounds double, double* [[VAR33:%.+]], i{{.+}} 0<br>+    // CK29-DAG: [[VAR33]] = load double*, double** %{{.+}},<br>+<br>+    // CK29: call void [[CALL00:@.+]]([[SSB]]* {{[^,]+}})<br>+    #pragma omp target map(p->pr[:10])<br>+    {<br>+      p->pr++;<br>+    }<br>+<br>+    // Region 01<br>+    // CK29-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE01]]{{.+}})<br>+<br>+    // CK29-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]<br>+    // CK29-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]<br>+<br>+    // CK29-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0<br>+    // CK29-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0<br>+    // CK29-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]<br>+    // CK29-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]<br>+    // CK29-DAG: [[CBPVAL0]] = bitcast [[SSB]]* [[VAR0:%.+]] to i8*<br>+    // CK29-DAG: [[CPVAL0]] = bitcast [[SSA]]*** [[VAR00:%.+]] to i8*<br>+    // CK29-DAG: [[VAR00]] = getelementptr inbounds [[SSB]], [[SSB]]* [[VAR0]], i32 0, i32 1<br>+<br>+    // CK29-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1<br>+    // CK29-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1<br>+    // CK29-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]<br>+    // CK29-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]<br>+    // CK29-DAG: [[CBPVAL1]] = bitcast [[SSA]]*** [[VAR00]] to i8*<br>+    // CK29-DAG: [[CPVAL1]] = bitcast [[SSA]]** [[VAR1:%.+]] to i8*<br>+    // CK29-DAG: [[VAR1]] = load [[SSA]]**, [[SSA]]*** [[VAR00]],<br>+<br>+    // CK29-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2<br>+    // CK29-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2<br>+    // CK29-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]<br>+    // CK29-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]<br>+    // CK29-DAG: [[CBPVAL2]] = bitcast [[SSA]]** [[VAR1]] to i8*<br>+    // CK29-DAG: [[CPVAL2]] = bitcast double** [[VAR2:%.+]] to i8*<br>+    // CK29-DAG: [[VAR2]] = getelementptr inbounds [[SSA]], [[SSA]]* %{{.+}}, i32 0, i32 0<br>+<br>+    // CK29-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3<br>+    // CK29-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3<br>+    // CK29-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]]<br>+    // CK29-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]]<br>+    // CK29-DAG: [[CBPVAL3]] = bitcast double** [[VAR2]] to i8*<br>+    // CK29-DAG: [[CPVAL3]] = bitcast double* [[VAR3:%.+]] to i8*<br>+    // CK29-DAG: [[VAR3]] = getelementptr inbounds double, double* [[VAR33:%.+]], i{{.+}} 0<br>+    // CK29-DAG: [[VAR33]] = load double*, double** %{{.+}},<br>+<br>+    // CK29: call void [[CALL00:@.+]]([[SSB]]* {{[^,]+}})<br>+    #pragma omp target map(pr->p[:10])<br>+    {<br>+      pr->p++;<br>+    }<br>+<br>+    // Region 02<br>+    // CK29-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 5, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[5 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[5 x i{{.+}}]* [[MTYPE02]]{{.+}})<br>+<br>+    // CK29-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]<br>+    // CK29-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]<br>+<br>+    // CK29-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0<br>+    // CK29-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0<br>+    // CK29-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]<br>+    // CK29-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]<br>+    // CK29-DAG: [[CBPVAL0]] = bitcast [[SSB]]* [[VAR0:%.+]] to i8*<br>+    // CK29-DAG: [[CPVAL0]] = bitcast [[SSA]]*** [[VAR00:%.+]] to i8*<br>+    // CK29-DAG: [[VAR00]] = getelementptr inbounds [[SSB]], [[SSB]]* [[VAR0]], i32 0, i32 1<br>+<br>+    // CK29-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1<br>+    // CK29-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1<br>+    // CK29-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]<br>+    // CK29-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]<br>+    // CK29-DAG: [[CBPVAL1]] = bitcast [[SSA]]*** [[VAR00]] to i8*<br>+    // CK29-DAG: [[CPVAL1]] = bitcast [[SSA]]** [[VAR1:%.+]] to i8*<br>+    // CK29-DAG: [[VAR1]] = load [[SSA]]**, [[SSA]]*** [[VAR00]],<br>+<br>+    // CK29-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2<br>+    // CK29-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2<br>+    // CK29-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]<br>+    // CK29-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]<br>+    // CK29-DAG: [[CBPVAL2]] = bitcast [[SSA]]** [[VAR1]] to i8*<br>+    // CK29-DAG: [[CPVAL2]] = bitcast double*** [[VAR2:%.+]] to i8*<br>+    // CK29-DAG: [[VAR2]] = getelementptr inbounds [[SSA]], [[SSA]]* %{{.+}}, i32 0, i32 1<br>+<br>+    // CK29-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3<br>+    // CK29-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3<br>+    // CK29-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]]<br>+    // CK29-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]]<br>+    // CK29-DAG: [[CBPVAL3]] = bitcast double*** [[VAR2]] to i8*<br>+    // CK29-DAG: [[CPVAL3]] = bitcast double** [[VAR3:%.+]] to i8*<br>+    // CK29-DAG: [[VAR3]] = load double**, double*** [[VAR2]],<br>+<br>+    // CK29-DAG: [[BP4:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 4<br>+    // CK29-DAG: [[P4:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 4<br>+    // CK29-DAG: store i8* [[CBPVAL4:%[^,]+]], i8** [[BP4]]<br>+    // CK29-DAG: store i8* [[CPVAL4:%[^,]+]], i8** [[P4]]<br>+    // CK29-DAG: [[CBPVAL4]] = bitcast double** [[VAR3]] to i8*<br>+    // CK29-DAG: [[CPVAL4]] = bitcast double* [[VAR4:%.+]] to i8*<br>+    // CK29-DAG: [[VAR4]] = getelementptr inbounds double, double* [[VAR44:%.+]], i{{.+}} 0<br>+    // CK29-DAG: [[VAR44]] = load double*, double**<br>+<br>+    // CK29: call void [[CALL00:@.+]]([[SSB]]* {{[^,]+}})<br>+    #pragma omp target map(pr->pr[:10])<br>+    {<br>+      pr->pr++;<br>+    }<br>+  }<br>+};<br>+<br>+void explicit_maps_member_pointer_<wbr>references(SSA *sap) {<br>+  double *d;<br>+  SSA sa(d);<br>+  SSB sb(sap);<br>+  sb.foo();<br>+}<br>+#endif<br> #endif<br><br><br>______________________________<wbr>_________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@lists.llvm.org" target="_blank" >cfe-commits@lists.llvm.org</a><br><a href="http://lists.llvm.org/cgi-bin" target="_blank" >http://lists.llvm.org/cgi-bin</a>/<wbr>mailman/listinfo/cfe-commits</blockquote></div></div></div></blockquote>
<div dir="ltr" > </div></div><BR>