diff --git a/polly/lib/Support/SCEVValidator.cpp b/polly/lib/Support/SCEVValidator.cpp index eb26424cf60c..a70cf1a33844 100644 --- a/polly/lib/Support/SCEVValidator.cpp +++ b/polly/lib/Support/SCEVValidator.cpp @@ -279,6 +279,16 @@ public: ValidatorResult visitUnknown(const SCEVUnknown *Expr) { Value *V = Expr->getValue(); + // We currently only support integer types. It may be useful to support + // pointer types, e.g. to support code like: + // + // if (A) + // A[i] = 1; + // + // See test/CodeGen/20120316-InvalidCast.ll + if (!Expr->getType()->isIntegerTy()) + return ValidatorResult(SCEVType::INVALID); + if (isa(V)) return ValidatorResult(SCEVType::INVALID); diff --git a/polly/test/CodeGen/20120316-InvalidCast.ll b/polly/test/CodeGen/20120316-InvalidCast.ll new file mode 100644 index 000000000000..962887774f7e --- /dev/null +++ b/polly/test/CodeGen/20120316-InvalidCast.ll @@ -0,0 +1,20 @@ +; RUN: opt %loadPolly %defaultOpts -polly-codegen %s + +target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32f64:64:64-f32:32:32-a0:0-n32" +target triple = "hexagon-unknown-linux-gnu" + +define void @fixup_gotos(i32* %A, i32* %data) nounwind { +entry: + br label %if + +if: + %cond = icmp eq i32* %A, null + br i1 %cond, label %last, label %then + +then: + store i32 1, i32* %data, align 4 + br label %last + +last: + ret void +}