diff options
Diffstat (limited to 'polly/lib/Analysis')
-rw-r--r-- | polly/lib/Analysis/ScopDetection.cpp | 14 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopDetectionDiagnostic.cpp | 18 |
2 files changed, 30 insertions, 2 deletions
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index 5122c2024b1..3d24596d45d 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -121,6 +121,11 @@ static cl::opt<bool> cl::desc("Print information about the activities of Polly"), cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory)); +static cl::opt<bool> AllowDifferentTypes( + "polly-allow-differing-element-types", + cl::desc("Allow different element types for array accesses"), cl::Hidden, + cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory)); + static cl::opt<bool> AllowNonAffine("polly-allow-nonaffine", cl::desc("Allow non affine access functions in arrays"), @@ -787,11 +792,16 @@ bool ScopDetection::isValidMemoryAccess(MemAccInst Inst, AccessFunction = SE->getMinusSCEV(AccessFunction, BasePointer); const SCEV *Size = SE->getElementSize(Inst); - if (Context.ElementSize[BasePointer]) + if (Context.ElementSize[BasePointer]) { + if (!AllowDifferentTypes && Context.ElementSize[BasePointer] != Size) + return invalid<ReportDifferentArrayElementSize>(Context, /*Assert=*/true, + Inst, BaseValue); + Context.ElementSize[BasePointer] = SE->getSMinExpr(Size, Context.ElementSize[BasePointer]); - else + } else { Context.ElementSize[BasePointer] = Size; + } bool isVariantInNonAffineLoop = false; SetVector<const Loop *> Loops; diff --git a/polly/lib/Analysis/ScopDetectionDiagnostic.cpp b/polly/lib/Analysis/ScopDetectionDiagnostic.cpp index 879449bef7a..5d5a1a43f8e 100644 --- a/polly/lib/Analysis/ScopDetectionDiagnostic.cpp +++ b/polly/lib/Analysis/ScopDetectionDiagnostic.cpp @@ -270,6 +270,24 @@ bool ReportVariantBasePtr::classof(const RejectReason *RR) { } //===----------------------------------------------------------------------===// +// ReportDifferentArrayElementSize + +std::string ReportDifferentArrayElementSize::getMessage() const { + return "Access to one array through data types of different size"; +} + +bool ReportDifferentArrayElementSize::classof(const RejectReason *RR) { + return RR->getKind() == rrkDifferentElementSize; +} + +std::string ReportDifferentArrayElementSize::getEndUserMessage() const { + llvm::StringRef BaseName = BaseValue->getName(); + std::string Name = (BaseName.size() > 0) ? BaseName : "UNKNOWN"; + return "The array \"" + Name + "\" is accessed through elements that differ " + "in size"; +} + +//===----------------------------------------------------------------------===// // ReportNonAffineAccess. std::string ReportNonAffineAccess::getMessage() const { |