Author: abataev Date: Wed Feb 17 04:29:05 2016 New Revision: 261080 URL: http://llvm.org/viewvc/llvm-project?rev=261080&view=rev Log: [OPENMP] Fix handling loop-based directives with arrays. Patch fixes possible problems with correct handling arrays as expressions in initialization, conditions etc in loop-based constructs.
Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/test/OpenMP/for_ast_print.cpp Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=261080&r1=261079&r2=261080&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Wed Feb 17 04:29:05 2016 @@ -3628,7 +3628,7 @@ public: NewVD->setInitStyle(VD->getInitStyle()); NewVD->setExceptionVariable(VD->isExceptionVariable()); NewVD->setNRVOVariable(VD->isNRVOVariable()); - NewVD->setCXXForRangeDecl(VD->isInExternCXXContext()); + NewVD->setCXXForRangeDecl(VD->isCXXForRangeDecl()); NewVD->setConstexpr(VD->isConstexpr()); NewVD->setInitCapture(VD->isInitCapture()); NewVD->setPreviousDeclInSameBlockScope( @@ -3673,14 +3673,20 @@ OpenMPIterationSpaceChecker::BuildNumIte Expr *Lower = Transform.TransformExpr(LBExpr).get(); if (!Upper || !Lower) return nullptr; - Upper = SemaRef.PerformImplicitConversion(Upper, UBExpr->getType(), - Sema::AA_Converting, - /*AllowExplicit=*/true) - .get(); - Lower = SemaRef.PerformImplicitConversion(Lower, LBExpr->getType(), - Sema::AA_Converting, - /*AllowExplicit=*/true) - .get(); + if (!SemaRef.Context.hasSameType(Upper->getType(), UBExpr->getType())) { + Upper = SemaRef + .PerformImplicitConversion(Upper, UBExpr->getType(), + Sema::AA_Converting, + /*AllowExplicit=*/true) + .get(); + } + if (!SemaRef.Context.hasSameType(Lower->getType(), LBExpr->getType())) { + Lower = SemaRef + .PerformImplicitConversion(Lower, LBExpr->getType(), + Sema::AA_Converting, + /*AllowExplicit=*/true) + .get(); + } if (!Upper || !Lower) return nullptr; @@ -3707,14 +3713,18 @@ OpenMPIterationSpaceChecker::BuildNumIte return nullptr; // Upper - Lower [- 1] + Step - auto NewStep = Transform.TransformExpr(Step->IgnoreImplicit()); - if (NewStep.isInvalid()) - return nullptr; - NewStep = SemaRef.PerformImplicitConversion( - NewStep.get(), Step->IgnoreImplicit()->getType(), Sema::AA_Converting, - /*AllowExplicit=*/true); + auto *StepNoImp = Step->IgnoreImplicit(); + auto NewStep = Transform.TransformExpr(StepNoImp); if (NewStep.isInvalid()) return nullptr; + if (!SemaRef.Context.hasSameType(NewStep.get()->getType(), + StepNoImp->getType())) { + NewStep = SemaRef.PerformImplicitConversion( + NewStep.get(), StepNoImp->getType(), Sema::AA_Converting, + /*AllowExplicit=*/true); + if (NewStep.isInvalid()) + return nullptr; + } Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Add, Diff.get(), NewStep.get()); if (!Diff.isUsable()) return nullptr; @@ -3725,14 +3735,17 @@ OpenMPIterationSpaceChecker::BuildNumIte return nullptr; // (Upper - Lower [- 1] + Step) / Step - NewStep = Transform.TransformExpr(Step->IgnoreImplicit()); - if (NewStep.isInvalid()) - return nullptr; - NewStep = SemaRef.PerformImplicitConversion( - NewStep.get(), Step->IgnoreImplicit()->getType(), Sema::AA_Converting, - /*AllowExplicit=*/true); + NewStep = Transform.TransformExpr(StepNoImp); if (NewStep.isInvalid()) return nullptr; + if (!SemaRef.Context.hasSameType(NewStep.get()->getType(), + StepNoImp->getType())) { + NewStep = SemaRef.PerformImplicitConversion( + NewStep.get(), StepNoImp->getType(), Sema::AA_Converting, + /*AllowExplicit=*/true); + if (NewStep.isInvalid()) + return nullptr; + } Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Div, Diff.get(), NewStep.get()); if (!Diff.isUsable()) return nullptr; @@ -3748,10 +3761,12 @@ OpenMPIterationSpaceChecker::BuildNumIte bool IsSigned = UseVarType ? VarType->hasSignedIntegerRepresentation() : Type->hasSignedIntegerRepresentation(); Type = C.getIntTypeForBitwidth(NewSize, IsSigned); - Diff = SemaRef.PerformImplicitConversion( - Diff.get(), Type, Sema::AA_Converting, /*AllowExplicit=*/true); - if (!Diff.isUsable()) - return nullptr; + if (!SemaRef.Context.hasSameType(Diff.get()->getType(), Type)) { + Diff = SemaRef.PerformImplicitConversion( + Diff.get(), Type, Sema::AA_Converting, /*AllowExplicit=*/true); + if (!Diff.isUsable()) + return nullptr; + } } if (LimitedType) { unsigned NewSize = (C.getTypeSize(Type) > 32) ? 64 : 32; @@ -3764,10 +3779,12 @@ OpenMPIterationSpaceChecker::BuildNumIte QualType NewType = C.getIntTypeForBitwidth( NewSize, Type->hasSignedIntegerRepresentation() || C.getTypeSize(Type) < NewSize); - Diff = SemaRef.PerformImplicitConversion(Diff.get(), NewType, - Sema::AA_Converting, true); - if (!Diff.isUsable()) - return nullptr; + if (!SemaRef.Context.hasSameType(Diff.get()->getType(), NewType)) { + Diff = SemaRef.PerformImplicitConversion(Diff.get(), NewType, + Sema::AA_Converting, true); + if (!Diff.isUsable()) + return nullptr; + } } } @@ -3784,12 +3801,16 @@ Expr *OpenMPIterationSpaceChecker::Build auto NewUB = Transform.TransformExpr(UB); if (NewLB.isInvalid() || NewUB.isInvalid()) return Cond; - NewLB = SemaRef.PerformImplicitConversion(NewLB.get(), LB->getType(), - Sema::AA_Converting, - /*AllowExplicit=*/true); - NewUB = SemaRef.PerformImplicitConversion(NewUB.get(), UB->getType(), - Sema::AA_Converting, - /*AllowExplicit=*/true); + if (!SemaRef.Context.hasSameType(NewLB.get()->getType(), LB->getType())) { + NewLB = SemaRef.PerformImplicitConversion(NewLB.get(), LB->getType(), + Sema::AA_Converting, + /*AllowExplicit=*/true); + } + if (!SemaRef.Context.hasSameType(NewUB.get()->getType(), UB->getType())) { + NewUB = SemaRef.PerformImplicitConversion(NewUB.get(), UB->getType(), + Sema::AA_Converting, + /*AllowExplicit=*/true); + } if (NewLB.isInvalid() || NewUB.isInvalid()) return Cond; auto CondExpr = SemaRef.BuildBinOp( @@ -3797,9 +3818,11 @@ Expr *OpenMPIterationSpaceChecker::Build : (TestIsStrictOp ? BO_GT : BO_GE), NewLB.get(), NewUB.get()); if (CondExpr.isUsable()) { - CondExpr = SemaRef.PerformImplicitConversion( - CondExpr.get(), SemaRef.Context.BoolTy, /*Action=*/Sema::AA_Casting, - /*AllowExplicit=*/true); + if (!SemaRef.Context.hasSameType(CondExpr.get()->getType(), + SemaRef.Context.BoolTy)) + CondExpr = SemaRef.PerformImplicitConversion( + CondExpr.get(), SemaRef.Context.BoolTy, /*Action=*/Sema::AA_Casting, + /*AllowExplicit=*/true); } SemaRef.getDiagnostics().setSuppressAllDiagnostics(Suppress); // Otherwise use original loop conditon and evaluate it in runtime. @@ -4026,20 +4049,26 @@ static ExprResult BuildCounterInit(Sema ExprResult VarRef, ExprResult Start) { TransformToNewDefs Transform(SemaRef); // Build 'VarRef = Start. - auto NewStart = Transform.TransformExpr(Start.get()->IgnoreImplicit()); - if (NewStart.isInvalid()) - return ExprError(); - NewStart = SemaRef.PerformImplicitConversion( - NewStart.get(), Start.get()->IgnoreImplicit()->getType(), - Sema::AA_Converting, - /*AllowExplicit=*/true); + auto *StartNoImp = Start.get()->IgnoreImplicit(); + auto NewStart = Transform.TransformExpr(StartNoImp); if (NewStart.isInvalid()) return ExprError(); - NewStart = SemaRef.PerformImplicitConversion( - NewStart.get(), VarRef.get()->getType(), Sema::AA_Converting, - /*AllowExplicit=*/true); - if (!NewStart.isUsable()) - return ExprError(); + if (!SemaRef.Context.hasSameType(NewStart.get()->getType(), + StartNoImp->getType())) { + NewStart = SemaRef.PerformImplicitConversion( + NewStart.get(), StartNoImp->getType(), Sema::AA_Converting, + /*AllowExplicit=*/true); + if (NewStart.isInvalid()) + return ExprError(); + } + if (!SemaRef.Context.hasSameType(NewStart.get()->getType(), + VarRef.get()->getType())) { + NewStart = SemaRef.PerformImplicitConversion( + NewStart.get(), VarRef.get()->getType(), Sema::AA_Converting, + /*AllowExplicit=*/true); + if (!NewStart.isUsable()) + return ExprError(); + } auto Init = SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), NewStart.get()); @@ -4057,16 +4086,19 @@ static ExprResult BuildCounterUpdate(Sem !Step.isUsable()) return ExprError(); + auto *StepNoImp = Step.get()->IgnoreImplicit(); TransformToNewDefs Transform(SemaRef); - auto NewStep = Transform.TransformExpr(Step.get()->IgnoreImplicit()); - if (NewStep.isInvalid()) - return ExprError(); - NewStep = SemaRef.PerformImplicitConversion( - NewStep.get(), Step.get()->IgnoreImplicit()->getType(), - Sema::AA_Converting, - /*AllowExplicit=*/true); + auto NewStep = Transform.TransformExpr(StepNoImp); if (NewStep.isInvalid()) return ExprError(); + if (!SemaRef.Context.hasSameType(NewStep.get()->getType(), + StepNoImp->getType())) { + NewStep = SemaRef.PerformImplicitConversion( + NewStep.get(), StepNoImp->getType(), Sema::AA_Converting, + /*AllowExplicit=*/true); + if (NewStep.isInvalid()) + return ExprError(); + } ExprResult Update = SemaRef.BuildBinOp(S, Loc, BO_Mul, Iter.get(), NewStep.get()); if (!Update.isUsable()) @@ -4074,15 +4106,18 @@ static ExprResult BuildCounterUpdate(Sem // Try to build 'VarRef = Start, VarRef (+|-)= Iter * Step' or // 'VarRef = Start (+|-) Iter * Step'. - auto NewStart = Transform.TransformExpr(Start.get()->IgnoreImplicit()); - if (NewStart.isInvalid()) - return ExprError(); - NewStart = SemaRef.PerformImplicitConversion( - NewStart.get(), Start.get()->IgnoreImplicit()->getType(), - Sema::AA_Converting, - /*AllowExplicit=*/true); + auto *StartNoImp = Start.get()->IgnoreImplicit(); + auto NewStart = Transform.TransformExpr(StartNoImp); if (NewStart.isInvalid()) return ExprError(); + if (!SemaRef.Context.hasSameType(NewStart.get()->getType(), + StartNoImp->getType())) { + NewStart = SemaRef.PerformImplicitConversion( + NewStart.get(), StartNoImp->getType(), Sema::AA_Converting, + /*AllowExplicit=*/true); + if (NewStart.isInvalid()) + return ExprError(); + } // First attempt: try to build 'VarRef = Start, VarRef += Iter * Step'. ExprResult SavedUpdate = Update; @@ -4113,10 +4148,13 @@ static ExprResult BuildCounterUpdate(Sem if (!Update.isUsable()) return ExprError(); - Update = SemaRef.PerformImplicitConversion( - Update.get(), VarRef.get()->getType(), Sema::AA_Converting, true); - if (!Update.isUsable()) - return ExprError(); + if (!SemaRef.Context.hasSameType(Update.get()->getType(), + VarRef.get()->getType())) { + Update = SemaRef.PerformImplicitConversion( + Update.get(), VarRef.get()->getType(), Sema::AA_Converting, true); + if (!Update.isUsable()) + return ExprError(); + } Update = SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), Update.get()); } Modified: cfe/trunk/test/OpenMP/for_ast_print.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_ast_print.cpp?rev=261080&r1=261079&r2=261080&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/for_ast_print.cpp (original) +++ cfe/trunk/test/OpenMP/for_ast_print.cpp Wed Feb 17 04:29:05 2016 @@ -119,6 +119,18 @@ int main(int argc, char **argv) { // CHECK-NEXT: for (int i = 0; i < 10; ++i) // CHECK-NEXT: for (int j = 0; j < 10; ++j) // CHECK-NEXT: foo(); + char buf[9] = "01234567"; + char *p, *q; +#pragma omp parallel +#pragma omp for + for (p = buf; p < &buf[8]; p++) + for (q = &buf[0]; q <= buf + 7; q++) + foo(); + // CHECK: #pragma omp parallel + // CHECK-NEXT: #pragma omp for + // CHECK-NEXT: for (p = buf; p < &buf[8]; p++) + // CHECK-NEXT: for (q = &buf[0]; q <= buf + 7; q++) + // CHECK-NEXT: foo(); return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits