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@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits