r246278 - [OPENMP 4.0] Codegen for array sections.

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


Sorry, totally forgot that your are in the right timezone. Will not revert
for now and hope that you can figure this out :-)

On Fri, Aug 28, 2015 at 9:10 AM, Daniel Jasper <djasper at google.com> wrote:

> 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/cc80048f/attachment-0001.html>


More information about the cfe-commits mailing list