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