Index: polly/trunk/lib/Analysis/ScopDetection.cpp =================================================================== --- polly/trunk/lib/Analysis/ScopDetection.cpp +++ polly/trunk/lib/Analysis/ScopDetection.cpp @@ -512,11 +512,21 @@ Context.ElementSize[BasePointer]); if (!AllowNonAffine) - for (const SCEV *DelinearizedSize : Shape->DelinearizedSizes) + for (const SCEV *DelinearizedSize : Shape->DelinearizedSizes) { + if (auto *Unknown = dyn_cast(DelinearizedSize)) { + auto *value = dyn_cast(Unknown->getValue()); + if (isa(value)) { + invalid( + Context, /*Assert=*/true, + Context.Accesses[BasePointer].front().first, BaseValue); + return false; + } + } if (hasScalarDepsInsideRegion(DelinearizedSize, &CurRegion)) invalid( Context, /*Assert=*/true, DelinearizedSize, Context.Accesses[BasePointer].front().first, BaseValue); + } // No array shape derived. if (Shape->DelinearizedSizes.empty()) { Index: polly/trunk/test/ScopDetect/restrict-undef-size-scopdetect.ll =================================================================== --- polly/trunk/test/ScopDetect/restrict-undef-size-scopdetect.ll +++ polly/trunk/test/ScopDetect/restrict-undef-size-scopdetect.ll @@ -0,0 +1,33 @@ +; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s +; CHECK-NOT: Valid Region for Scop: + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +%struct.bar = type { i32, [4 x i32] } + +define void @f(%struct.bar* %arg) { +bb: + %tmp = alloca [4 x i32], align 16 + br label %bb1 + +bb1: ; preds = %bb8, %bb + %tmp2 = phi i64 [ 0, %bb ], [ %tmp9, %bb8 ] + br i1 false, label %bb3, label %bb6 + +bb3: ; preds = %bb1 + %tmp4 = getelementptr inbounds [4 x i32], [4 x i32]* %tmp, i64 0, i64 0 + %tmp5 = load i32, i32* %tmp4 + br label %bb8 + +bb6: ; preds = %bb1 + %tmp7 = getelementptr inbounds %struct.bar, %struct.bar* %arg, i64 0, i32 1, i64 undef + store i32 42, i32* %tmp7 + br label %bb8 + +bb8: ; preds = %bb6, %bb3 + %tmp9 = add nuw nsw i64 %tmp2, 1 + br i1 false, label %bb1, label %bb10 + +bb10: ; preds = %bb8 + ret void +}