<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">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:<br><blockquote class="gmail_quote" 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-project?rev=276934&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=276934&view=rev</a><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-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=276934&r1=276933&r2=276934&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGOpenMPRuntime.cpp?rev=<wbr>276934&r1=276933&r2=276934&<wbr>view=diff</a><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-project/cfe/trunk/test/OpenMP/target_map_codegen.cpp?rev=276934&r1=276933&r2=276934&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>target_map_codegen.cpp?rev=<wbr>276934&r1=276933&r2=276934&<wbr>view=diff</a><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<br></blockquote><div><br></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><br></div><blockquote class="gmail_quote" 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">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>