r246278 - [OPENMP 4.0] Codegen for array sections.

Daniel Jasper via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 28 00:10:47 PDT 2015


This fails on the bot, reverting:
http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_check/12747/

On Fri, Aug 28, 2015 at 8:09 AM, Alexey Bataev via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

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


More information about the cfe-commits mailing list