r261080 - [OPENMP] Fix handling loop-based directives with arrays.
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 17 02:29:06 PST 2016
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]));
}
More information about the cfe-commits
mailing list