<div dir="ltr">Sorry, totally forgot that your are in the right timezone. Will not revert for now and hope that you can figure this out :-)</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 28, 2015 at 9:10 AM, Daniel Jasper <span dir="ltr"><<a href="mailto:djasper@google.com" target="_blank">djasper@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">This fails on the bot, reverting:<div><a href="http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_check/12747/" target="_blank">http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_check/12747/</a><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 28, 2015 at 8:09 AM, Alexey Bataev 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: abataev<br>
Date: Fri Aug 28 01:09:05 2015<br>
New Revision: 246278<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=246278&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=246278&view=rev</a><br>
Log:<br>
[OPENMP 4.0] Codegen for array sections.<br>
Added codegen for array section in 'depend' clause of 'task' directive. It emits to pointers, one for the begin of array section and another for the end of array section. Size of the section is calculated as (end + 1 - start) * sizeof(basic_element_type).<br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGExpr.cpp<br>
    cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp<br>
    cfe/trunk/lib/CodeGen/CodeGenFunction.h<br>
    cfe/trunk/test/OpenMP/task_codegen.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=246278&r1=246277&r2=246278&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=246278&r1=246277&r2=246278&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Fri Aug 28 01:09:05 2015<br>
@@ -911,6 +911,8 @@ LValue CodeGenFunction::EmitLValue(const<br>
     return EmitUnaryOpLValue(cast<UnaryOperator>(E));<br>
   case Expr::ArraySubscriptExprClass:<br>
     return EmitArraySubscriptExpr(cast<ArraySubscriptExpr>(E));<br>
+  case Expr::OMPArraySectionExprClass:<br>
+    return EmitOMPArraySectionExpr(cast<OMPArraySectionExpr>(E));<br>
   case Expr::ExtVectorElementExprClass:<br>
     return EmitExtVectorElementExpr(cast<ExtVectorElementExpr>(E));<br>
   case Expr::MemberExprClass:<br>
@@ -2559,6 +2561,131 @@ LValue CodeGenFunction::EmitArraySubscri<br>
   return LV;<br>
 }<br>
<br>
+LValue CodeGenFunction::EmitOMPArraySectionExpr(const OMPArraySectionExpr *E,<br>
+                                                bool LowerBound) {<br>
+  LValue Base;<br>
+  if (auto *ASE =<br>
+          dyn_cast<OMPArraySectionExpr>(E->getBase()->IgnoreParenImpCasts()))<br>
+    Base = EmitOMPArraySectionExpr(ASE, LowerBound);<br>
+  else<br>
+    Base = EmitLValue(E->getBase());<br>
+  QualType BaseTy = Base.getType();<br>
+  llvm::Value *Idx;<br>
+  QualType ResultExprTy;<br>
+  if (auto *AT = getContext().getAsArrayType(BaseTy))<br>
+    ResultExprTy = AT->getElementType();<br>
+  else<br>
+    ResultExprTy = BaseTy->getPointeeType();<br>
+  if (LowerBound) {<br>
+    Idx = E->getLowerBound()<br>
+              ? Builder.CreateIntCast(EmitScalarExpr(E->getLowerBound()),<br>
+                                      IntPtrTy,<br>
+                                      E->getLowerBound()<br>
+                                          ->getType()<br>
+                                          ->hasSignedIntegerRepresentation())<br>
+              : llvm::ConstantInt::getNullValue(IntPtrTy);<br>
+  } else {<br>
+    auto &C = CGM.getContext();<br>
+    auto *Length = E->getLength();<br>
+    if (Length || E->getColonLoc().isInvalid()) {<br>
+      // Idx = LowerBound + Length - 1;<br>
+      auto *One = llvm::ConstantInt::get(IntPtrTy, /*V=*/1);<br>
+      if (Length) {<br>
+        Idx = Builder.CreateIntCast(<br>
+            EmitScalarExpr(Length), IntPtrTy,<br>
+            Length->getType()->hasSignedIntegerRepresentation());<br>
+      }<br>
+      auto *LowerBound = E->getLowerBound();<br>
+      llvm::APSInt ConstLowerBound;<br>
+      if (LowerBound && LowerBound->isIntegerConstantExpr(ConstLowerBound, C))<br>
+        LowerBound = nullptr;<br>
+      if (LowerBound && ConstLowerBound.getZExtValue() != 0) {<br>
+        auto *LowerBoundVal = Builder.CreateIntCast(<br>
+            EmitScalarExpr(LowerBound), IntPtrTy,<br>
+            LowerBound->getType()->hasSignedIntegerRepresentation());<br>
+        if (E->getColonLoc().isValid()) {<br>
+          if (getLangOpts().isSignedOverflowDefined())<br>
+            Idx = Builder.CreateAdd(Idx, LowerBoundVal);<br>
+          else<br>
+            Idx = Builder.CreateNSWAdd(Idx, LowerBoundVal);<br>
+        } else<br>
+          Idx = LowerBoundVal;<br>
+      }<br>
+      if (E->getColonLoc().isValid()) {<br>
+        if (getLangOpts().isSignedOverflowDefined())<br>
+          Idx = Builder.CreateSub(Idx, One);<br>
+        else<br>
+          Idx = Builder.CreateNSWSub(Idx, One);<br>
+      }<br>
+    } else if (auto *VAT = C.getAsVariableArrayType(BaseTy)) {<br>
+      // Idx = ArrSize - 1;<br>
+      Length = VAT->getSizeExpr();<br>
+      Idx = Builder.CreateIntCast(<br>
+          EmitScalarExpr(Length), IntPtrTy,<br>
+          Length->getType()->hasSignedIntegerRepresentation());<br>
+      auto *One = llvm::ConstantInt::get(IntPtrTy, /*V=*/1);<br>
+      if (getLangOpts().isSignedOverflowDefined())<br>
+        Idx = Builder.CreateSub(Idx, One);<br>
+      else<br>
+        Idx = Builder.CreateNSWSub(Idx, One);<br>
+    } else {<br>
+      // Idx = ArrSize - 1;<br>
+      auto *CAT = C.getAsConstantArrayType(BaseTy);<br>
+      Idx = llvm::ConstantInt::get(IntPtrTy, CAT->getSize().getZExtValue() - 1);<br>
+    }<br>
+  }<br>
+<br>
+  llvm::Value *Address;<br>
+  CharUnits ArrayAlignment;<br>
+  if (auto *VLA = getContext().getAsVariableArrayType(ResultExprTy)) {<br>
+    // The element count here is the total number of non-VLA elements.<br>
+    llvm::Value *numElements = getVLASize(VLA).first;<br>
+<br>
+    // Effectively, the multiply by the VLA size is part of the GEP.<br>
+    // GEP indexes are signed, and scaling an index isn't permitted to<br>
+    // signed-overflow, so we use the same semantics for our explicit<br>
+    // multiply.  We suppress this if overflow is not undefined behavior.<br>
+    if (getLangOpts().isSignedOverflowDefined()) {<br>
+      Idx = Builder.CreateMul(Idx, numElements);<br>
+      Address = Builder.CreateGEP(Base.getAddress(), Idx, "arrayidx");<br>
+    } else {<br>
+      Idx = Builder.CreateNSWMul(Idx, numElements);<br>
+      Address = Builder.CreateInBoundsGEP(Base.getAddress(), Idx, "arrayidx");<br>
+    }<br>
+  } else if (BaseTy->isConstantArrayType()) {<br>
+    llvm::Value *ArrayPtr = Base.getAddress();<br>
+    llvm::Value *Zero = llvm::ConstantInt::getNullValue(IntPtrTy);<br>
+    llvm::Value *Args[] = {Zero, Idx};<br>
+<br>
+    // Propagate the alignment from the array itself to the result.<br>
+    ArrayAlignment = Base.getAlignment();<br>
+<br>
+    if (getLangOpts().isSignedOverflowDefined())<br>
+      Address = Builder.CreateGEP(ArrayPtr, Args, "arrayidx");<br>
+    else<br>
+      Address = Builder.CreateInBoundsGEP(ArrayPtr, Args, "arrayidx");<br>
+  } else {<br>
+    // The base must be a pointer, which is not an aggregate.  Emit it.<br>
+    if (getLangOpts().isSignedOverflowDefined())<br>
+      Address = Builder.CreateGEP(Base.getAddress(), Idx, "arrayidx");<br>
+    else<br>
+      Address = Builder.CreateInBoundsGEP(Base.getAddress(), Idx, "arrayidx");<br>
+  }<br>
+<br>
+  // Limit the alignment to that of the result type.<br>
+  LValue LV;<br>
+  if (!ArrayAlignment.isZero()) {<br>
+    CharUnits Align = getContext().getTypeAlignInChars(ResultExprTy);<br>
+    ArrayAlignment = std::min(Align, ArrayAlignment);<br>
+    LV = MakeAddrLValue(Address, ResultExprTy, ArrayAlignment);<br>
+  } else<br>
+    LV = MakeNaturalAlignAddrLValue(Address, ResultExprTy);<br>
+<br>
+  LV.getQuals().setAddressSpace(BaseTy.getAddressSpace());<br>
+<br>
+  return LV;<br>
+}<br>
+<br>
 LValue CodeGenFunction::<br>
 EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {<br>
   // Emit the base vector as an l-value.<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=246278&r1=246277&r2=246278&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=246278&r1=246277&r2=246278&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp Fri Aug 28 01:09:05 2015<br>
@@ -2091,6 +2091,27 @@ emitTaskPrivateMappingFunction(CodeGenMo<br>
   return TaskPrivatesMap;<br>
 }<br>
<br>
+llvm::Value *getTypeSize(CodeGenFunction &CGF, QualType Ty) {<br>
+  auto &C = CGF.getContext();<br>
+  llvm::Value *Size;<br>
+  auto SizeInChars = C.getTypeSizeInChars(Ty);<br>
+  if (SizeInChars.isZero()) {<br>
+    // getTypeSizeInChars() returns 0 for a VLA.<br>
+    Size = nullptr;<br>
+    while (auto *VAT = C.getAsVariableArrayType(Ty)) {<br>
+      llvm::Value *ArraySize;<br>
+      std::tie(ArraySize, Ty) = CGF.getVLASize(VAT);<br>
+      Size = Size ? CGF.Builder.CreateNUWMul(Size, ArraySize) : ArraySize;<br>
+    }<br>
+    SizeInChars = C.getTypeSizeInChars(Ty);<br>
+    assert(!SizeInChars.isZero());<br>
+    Size = CGF.Builder.CreateNUWMul(<br>
+        Size, llvm::ConstantInt::get(CGF.SizeTy, SizeInChars.getQuantity()));<br>
+  } else<br>
+    Size = llvm::ConstantInt::get(CGF.SizeTy, SizeInChars.getQuantity());<br>
+  return Size;<br>
+}<br>
+<br>
 static int array_pod_sort_comparator(const PrivateDataTy *P1,<br>
                                      const PrivateDataTy *P2) {<br>
   return P1->first < P2->first ? 1 : (P2->first < P1->first ? -1 : 0);<br>
@@ -2328,19 +2349,30 @@ void CGOpenMPRuntime::emitTaskCall(<br>
     // kmp_depend_info[<Dependences.size()>] deps;<br>
     DependInfo = CGF.CreateMemTemp(KmpDependInfoArrayTy);<br>
     for (unsigned i = 0; i < DependencesNumber; ++i) {<br>
-      auto Addr = CGF.EmitLValue(Dependences[i].second);<br>
-      auto *Size = llvm::ConstantInt::get(<br>
-          CGF.SizeTy,<br>
-          C.getTypeSizeInChars(Dependences[i].second->getType()).getQuantity());<br>
+      auto *E = Dependences[i].second;<br>
+      LValue Addr = CGF.EmitLValue(E);<br>
+      llvm::Value *Size;<br>
+      QualType Ty = E->getType();<br>
+      auto *DestAddr = Addr.getAddress();<br>
+      if (auto *ASE = dyn_cast<OMPArraySectionExpr>(E->IgnoreParenImpCasts())) {<br>
+        LValue UpAddrLVal =<br>
+            CGF.EmitOMPArraySectionExpr(ASE, /*LowerBound=*/false);<br>
+        llvm::Value *UpAddr =<br>
+            CGF.Builder.CreateConstGEP1_32(UpAddrLVal.getAddress(), /*Idx0=*/1);<br>
+        llvm::Value *LowIntPtr =<br>
+            CGF.Builder.CreatePtrToInt(DestAddr, CGM.SizeTy);<br>
+        llvm::Value *UpIntPtr = CGF.Builder.CreatePtrToInt(UpAddr, CGM.SizeTy);<br>
+        Size = CGF.Builder.CreateNUWSub(UpIntPtr, LowIntPtr);<br>
+      } else<br>
+        Size = getTypeSize(CGF, Ty);<br>
       auto Base = CGF.MakeNaturalAlignAddrLValue(<br>
           CGF.Builder.CreateStructGEP(/*Ty=*/nullptr, DependInfo, i),<br>
           KmpDependInfoTy);<br>
       // deps[i].base_addr = &<Dependences[i].second>;<br>
       auto BaseAddrLVal = CGF.EmitLValueForField(<br>
           Base, *std::next(KmpDependInfoRD->field_begin(), BaseAddr));<br>
-      CGF.EmitStoreOfScalar(<br>
-          CGF.Builder.CreatePtrToInt(Addr.getAddress(), CGF.IntPtrTy),<br>
-          BaseAddrLVal);<br>
+      CGF.EmitStoreOfScalar(CGF.Builder.CreatePtrToInt(DestAddr, CGF.IntPtrTy),<br>
+                            BaseAddrLVal);<br>
       // deps[i].len = sizeof(<Dependences[i].second>);<br>
       auto LenLVal = CGF.EmitLValueForField(<br>
           Base, *std::next(KmpDependInfoRD->field_begin(), Len));<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=246278&r1=246277&r2=246278&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=246278&r1=246277&r2=246278&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Fri Aug 28 01:09:05 2015<br>
@@ -24,6 +24,7 @@<br>
 #include "clang/AST/CharUnits.h"<br>
 #include "clang/AST/ExprCXX.h"<br>
 #include "clang/AST/ExprObjC.h"<br>
+#include "clang/AST/ExprOpenMP.h"<br>
 #include "clang/AST/Type.h"<br>
 #include "clang/Basic/ABI.h"<br>
 #include "clang/Basic/CapturedStmt.h"<br>
@@ -2427,6 +2428,8 @@ public:<br>
   LValue EmitUnaryOpLValue(const UnaryOperator *E);<br>
   LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E,<br>
                                 bool Accessed = false);<br>
+  LValue EmitOMPArraySectionExpr(const OMPArraySectionExpr *E,<br>
+                                 bool LowerBound = true);<br>
   LValue EmitExtVectorElementExpr(const ExtVectorElementExpr *E);<br>
   LValue EmitMemberExpr(const MemberExpr *E);<br>
   LValue EmitObjCIsaExpr(const ObjCIsaExpr *E);<br>
<br>
Modified: cfe/trunk/test/OpenMP/task_codegen.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/task_codegen.cpp?rev=246278&r1=246277&r2=246278&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/task_codegen.cpp?rev=246278&r1=246277&r2=246278&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/OpenMP/task_codegen.cpp (original)<br>
+++ cfe/trunk/test/OpenMP/task_codegen.cpp Fri Aug 28 01:09:05 2015<br>
@@ -24,6 +24,7 @@ int main() {<br>
 // CHECK: [[S:%.+]] = alloca [2 x [[STRUCT_S]]]<br>
   char b;<br>
   S s[2];<br>
+  int arr[10][a];<br>
 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num([[IDENT_T]]* @{{.+}})<br>
 // CHECK: [[B_REF:%.+]] = getelementptr inbounds [[STRUCT_SHAREDS]], [[STRUCT_SHAREDS]]* [[CAPTURES:%.+]], i32 0, i32 0<br>
 // CHECK: store i8* [[B]], i8** [[B_REF]]<br>
@@ -52,14 +53,14 @@ int main() {<br>
 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[SHAREDS_REF]], i8* [[BITCAST]], i64 8, i32 8, i1 false)<br>
 // CHECK: [[DESTRUCTORS_REF_PTR:%.+]] = getelementptr inbounds [[KMP_TASK_T]], [[KMP_TASK_T]]* [[TASK_PTR]], i32 0, i32 3<br>
 // CHECK: store i32 (i32, i8*)* null, i32 (i32, i8*)** [[DESTRUCTORS_REF_PTR]]<br>
-// CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: store i64 ptrtoint (i32* @{{.+}} to i64), i64*<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1<br>
 // CHECK: store i64 4, i64*<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
 // CHECK: store i8 1, i8*<br>
-// CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 1<br>
+// CHECK: getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 1<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: ptrtoint i8* [[B]] to i64<br>
 // CHECK: store i64 %{{[^,]+}}, i64*<br>
@@ -67,7 +68,7 @@ int main() {<br>
 // CHECK: store i64 1, i64*<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
 // CHECK: store i8 1, i8*<br>
-// CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 2<br>
+// CHECK: getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 2<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: ptrtoint [2 x [[STRUCT_S]]]* [[S]] to i64<br>
 // CHECK: store i64 %{{[^,]+}}, i64*<br>
@@ -75,10 +76,26 @@ int main() {<br>
 // CHECK: store i64 8, i64*<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
 // CHECK: store i8 1, i8*<br>
-// CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: [[IDX1:%.+]] = mul nsw i64 0, [[A_VAL:%.+]]<br>
+// CHECK: [[START:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]<br>
+// CHECK: [[IDX1:%.+]] = mul nsw i64 9, [[A_VAL]]<br>
+// CHECK: [[END:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]<br>
+// CHECK: [[END1:%.+]] = getelementptr i32, i32* [[END]], i32 1<br>
+// CHECK: [[START_INT:%.+]] = ptrtoint i32* [[START]] to i64<br>
+// CHECK: [[END_INT:%.+]] = ptrtoint i32* [[END1]] to i64<br>
+// CHECK: [[SIZEOF:%.+]] = sub nuw i64 [[END_INT]], [[START_INT]]<br>
+// CHECK: getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 3<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: ptrtoint i32* [[START]] to i64<br>
+// CHECK: store i64 %{{[^,]+}}, i64*<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1<br>
+// CHECK: store i64 [[SIZEOF]], i64*<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
+// CHECK: store i8 1, i8*<br>
+// CHECK: getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: bitcast [[KMP_DEPEND_INFO]]* %{{.+}} to i8*<br>
-// CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 3, i8* %{{[^,]+}}, i32 0, i8* null)<br>
-#pragma omp task shared(a, s) depend(in : a, b, s)<br>
+// CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 4, i8* %{{[^,]+}}, i32 0, i8* null)<br>
+#pragma omp task shared(a, s) depend(in : a, b, s, arr[:])<br>
   {<br>
     a = 15;<br>
     s[1].a = 10;<br>
@@ -95,7 +112,7 @@ int main() {<br>
 // CHECK: [[DESTRUCTORS_REF_PTR:%.+]] = getelementptr inbounds [[KMP_TASK_T]]{{.*}}* {{%.+}}, i32 0, i32 3<br>
 // CHECK: store i32 (i32, i8*)* null, i32 (i32, i8*)** [[DESTRUCTORS_REF_PTR]]<br>
 // CHECK: getelementptr inbounds [2 x [[STRUCT_S]]], [2 x [[STRUCT_S]]]* [[S]], i32 0, i64 0<br>
-// CHECK: getelementptr inbounds [1 x [[KMP_DEPEND_INFO]]], [1 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: ptrtoint [[STRUCT_S]]* %{{.+}} to i64<br>
 // CHECK: store i64 %{{[^,]+}}, i64*<br>
@@ -103,17 +120,39 @@ int main() {<br>
 // CHECK: store i64 4, i64*<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
 // CHECK: store i8 2, i8*<br>
-// CHECK: getelementptr inbounds [1 x [[KMP_DEPEND_INFO]]], [1 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: [[IDX1:%.+]] = mul nsw i64 4, [[A_VAL]]<br>
+// CHECK: [[START:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]<br>
+// CHECK: [[B_VAL:%.+]] = load i8, i8* [[B]]<br>
+// CHECK: [[IDX2:%.+]] = sext i8 [[B_VAL]] to i64<br>
+// CHECK: [[START1:%.+]] = getelementptr inbounds i32, i32* [[START]], i64 [[IDX2]]<br>
+// CHECK: [[IDX1:%.+]] = mul nsw i64 9, [[A_VAL]]<br>
+// CHECK: [[END:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]<br>
+// CHECK: [[B_VAL:%.+]] = load i8, i8* [[B]]<br>
+// CHECK: [[IDX2:%.+]] = sext i8 [[B_VAL]] to i64<br>
+// CHECK: [[END1:%.+]] = getelementptr inbounds i32, i32* [[END]], i64 [[IDX2]]<br>
+// CHECK: [[END2:%.+]] = getelementptr i32, i32* [[END1]], i32 1<br>
+// CHECK: [[START_INT:%.+]] = ptrtoint i32* [[START1]] to i64<br>
+// CHECK: [[END_INT:%.+]] = ptrtoint i32* [[END2]] to i64<br>
+// CHECK: [[SIZEOF:%.+]] = sub nuw i64 [[END_INT]], [[START_INT]]<br>
+// CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 1<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: ptrtoint i32* [[START1]] to i64<br>
+// CHECK: store i64 %{{[^,]+}}, i64*<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1<br>
+// CHECK: store i64 [[SIZEOF]], i64*<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
+// CHECK: store i8 2, i8*<br>
+// CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: bitcast [[KMP_DEPEND_INFO]]* %{{.+}} to i8*<br>
-// CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* %{{[^,]+}}, i32 0, i8* null)<br>
-#pragma omp task untied depend(out : s[0])<br>
+// CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 2, i8* %{{[^,]+}}, i32 0, i8* null)<br>
+#pragma omp task untied depend(out : s[0], arr[4:][b])<br>
   {<br>
     a = 1;<br>
   }<br>
 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 3, i64 32, i64 1,<br>
 // CHECK: [[DESTRUCTORS_REF_PTR:%.+]] = getelementptr inbounds [[KMP_TASK_T]]{{.*}}* {{%.+}}, i32 0, i32 3<br>
 // CHECK: store i32 (i32, i8*)* null, i32 (i32, i8*)** [[DESTRUCTORS_REF_PTR]]<br>
-// CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: store i64 ptrtoint (i32* @{{.+}} to i64), i64*<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1<br>
@@ -121,7 +160,7 @@ int main() {<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
 // CHECK: store i8 3, i8*<br>
 // CHECK: getelementptr inbounds [2 x [[STRUCT_S]]], [2 x [[STRUCT_S]]]* [[S]], i32 0, i64 1<br>
-// CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 1<br>
+// CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 1<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: ptrtoint [[STRUCT_S]]* %{{.+}} to i64<br>
 // CHECK: store i64 %{{[^,]+}}, i64*<br>
@@ -129,10 +168,34 @@ int main() {<br>
 // CHECK: store i64 4, i64*<br>
 // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
 // CHECK: store i8 3, i8*<br>
-// CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: [[IDX1:%.+]] = mul nsw i64 0, [[A_VAL]]<br>
+// CHECK: [[START:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]<br>
+// CHECK: [[START1:%.+]] = getelementptr inbounds i32, i32* [[START]], i64 3<br>
+// CHECK: [[NEW_A_VAL:%.+]] = load i32, i32* @{{.+}},<br>
+// CHECK: [[NEW_A_VAL_I64:%.+]] = sext i32 [[NEW_A_VAL]] to i64<br>
+// CHECK: [[SUB:%.+]] = sub nsw i64 [[NEW_A_VAL_I64]], 1<br>
+// CHECK: [[IDX1:%.+]] = mul nsw i64 [[SUB]], [[A_VAL]]<br>
+// CHECK: [[END:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]<br>
+// CHECK: [[NEW_A_VAL:%.+]] = load i32, i32* @{{.+}},<br>
+// CHECK: [[NEW_A_VAL_I64:%.+]] = sext i32 [[NEW_A_VAL]] to i64<br>
+// CHECK: [[IDX2:%.+]] = sub nsw i64 [[NEW_A_VAL_I64]], 1<br>
+// CHECK: [[END1:%.+]] = getelementptr inbounds i32, i32* [[END]], i64 [[IDX2]]<br>
+// CHECK: [[END2:%.+]] = getelementptr i32, i32* [[END1]], i32 1<br>
+// CHECK: [[START_INT:%.+]] = ptrtoint i32* [[START1]] to i64<br>
+// CHECK: [[END_INT:%.+]] = ptrtoint i32* [[END2]] to i64<br>
+// CHECK: [[SIZEOF:%.+]] = sub nuw i64 [[END_INT]], [[START_INT]]<br>
+// CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 2<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0<br>
+// CHECK: ptrtoint i32* [[START1]] to i64<br>
+// CHECK: store i64 %{{[^,]+}}, i64*<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1<br>
+// CHECK: store i64 [[SIZEOF]], i64*<br>
+// CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2<br>
+// CHECK: store i8 3, i8*<br>
+// CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0<br>
 // CHECK: bitcast [[KMP_DEPEND_INFO]]* %{{.+}} to i8*<br>
-// CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 2, i8* %{{[^,]+}}, i32 0, i8* null)<br>
-#pragma omp task final(true) depend(inout: a, s[1])<br>
+// CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 3, i8* %{{[^,]+}}, i32 0, i8* null)<br>
+#pragma omp task final(true) depend(inout: a, s[1], arr[:a][3:])<br>
   {<br>
     a = 2;<br>
   }<br>
<br>
<br>
_______________________________________________<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/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>