forked from OSchip/llvm-project
Add support for pointer types in expressions
llvm-svn: 225464
This commit is contained in:
parent
20c321caf8
commit
55bc4c0767
|
@ -1168,14 +1168,18 @@ void Scop::addParameterBounds() {
|
|||
isl_id *Id;
|
||||
const SCEV *Scev;
|
||||
const IntegerType *T;
|
||||
int Width;
|
||||
|
||||
Id = isl_set_get_dim_id(Context, isl_dim_param, i);
|
||||
Scev = (const SCEV *)isl_id_get_user(Id);
|
||||
T = dyn_cast<IntegerType>(Scev->getType());
|
||||
isl_id_free(Id);
|
||||
|
||||
assert(T && "Not an integer type");
|
||||
int Width = T->getBitWidth();
|
||||
T = dyn_cast<IntegerType>(Scev->getType());
|
||||
|
||||
if (!T)
|
||||
continue;
|
||||
|
||||
Width = T->getBitWidth();
|
||||
|
||||
V = isl_val_int_from_si(IslCtx, Width - 1);
|
||||
V = isl_val_2exp(V);
|
||||
|
|
|
@ -871,8 +871,7 @@ void IslNodeBuilder::addParameters(__isl_take isl_set *Context) {
|
|||
|
||||
Value *IslNodeBuilder::generateSCEV(const SCEV *Expr) {
|
||||
Instruction *InsertLocation = --(Builder.GetInsertBlock()->end());
|
||||
return Rewriter->expandCodeFor(Expr, cast<IntegerType>(Expr->getType()),
|
||||
InsertLocation);
|
||||
return Rewriter->expandCodeFor(Expr, Expr->getType(), InsertLocation);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
|
|
@ -280,13 +280,16 @@ Value *IslExprBuilder::createOpICmp(__isl_take isl_ast_expr *Expr) {
|
|||
LHS = create(isl_ast_expr_get_op_arg(Expr, 0));
|
||||
RHS = create(isl_ast_expr_get_op_arg(Expr, 1));
|
||||
|
||||
bool IsPtrType = LHS->getType()->isPointerTy();
|
||||
assert((!IsPtrType || RHS->getType()->isPointerTy()) &&
|
||||
"Both ICmp operators should be pointer types or none of them");
|
||||
bool IsPtrType =
|
||||
LHS->getType()->isPointerTy() || RHS->getType()->isPointerTy();
|
||||
|
||||
if (LHS->getType() != RHS->getType()) {
|
||||
if (IsPtrType) {
|
||||
Type *I8PtrTy = Builder.getInt8PtrTy();
|
||||
if (!LHS->getType()->isPointerTy())
|
||||
LHS = Builder.CreateIntToPtr(LHS, I8PtrTy);
|
||||
if (!RHS->getType()->isPointerTy())
|
||||
RHS = Builder.CreateIntToPtr(RHS, I8PtrTy);
|
||||
if (LHS->getType() != I8PtrTy)
|
||||
LHS = Builder.CreateBitCast(LHS, I8PtrTy);
|
||||
if (RHS->getType() != I8PtrTy)
|
||||
|
|
|
@ -336,8 +336,8 @@ public:
|
|||
// A[i] = 1;
|
||||
//
|
||||
// See test/CodeGen/20120316-InvalidCast.ll
|
||||
if (!Expr->getType()->isIntegerTy()) {
|
||||
DEBUG(dbgs() << "INVALID: UnknownExpr is not an integer type");
|
||||
if (!(Expr->getType()->isIntegerTy() || Expr->getType()->isPointerTy())) {
|
||||
DEBUG(dbgs() << "INVALID: UnknownExpr is not an integer or pointer type");
|
||||
return ValidatorResult(SCEVType::INVALID);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
; RUN: opt %loadPolly -polly-ast -analyze < %s | FileCheck %s
|
||||
; RUN: opt %loadPolly -polly-codegen-isl -S < %s | FileCheck %s -check-prefix=CODEGEN
|
||||
|
||||
; void f(int a[], int N, float *P) {
|
||||
; int i;
|
||||
; for (i = 0; i < N; ++i)
|
||||
; if (*P != 0)
|
||||
; a[i] = i;
|
||||
; }
|
||||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define void @f(i64* nocapture %a, i64 %N, float * %P) nounwind {
|
||||
entry:
|
||||
br label %bb
|
||||
|
||||
bb:
|
||||
%i = phi i64 [ 0, %entry ], [ %i.inc, %bb.backedge ]
|
||||
%brcond = icmp ne float* %P, null
|
||||
br i1 %brcond, label %store, label %bb.backedge
|
||||
|
||||
store:
|
||||
%scevgep = getelementptr i64* %a, i64 %i
|
||||
store i64 %i, i64* %scevgep
|
||||
br label %bb.backedge
|
||||
|
||||
bb.backedge:
|
||||
%i.inc = add nsw i64 %i, 1
|
||||
%exitcond = icmp eq i64 %i.inc, %N
|
||||
br i1 %exitcond, label %return, label %bb
|
||||
|
||||
return:
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: if (P <= -1) {
|
||||
; CHECK: for (int c0 = 0; c0 < N; c0 += 1)
|
||||
; CHECK: Stmt_store(c0);
|
||||
; CHECK: } else if (P >= 1)
|
||||
; CHECK: for (int c0 = 0; c0 < N; c0 += 1)
|
||||
; CHECK: Stmt_store(c0);
|
||||
; CHECK: }
|
||||
|
||||
; CODEGEN: %0 = bitcast float* %P to i8*
|
||||
; CODEGEN: %1 = icmp ule i8* %0, inttoptr (i64 -1 to i8*)
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
|
||||
|
||||
; void f(int a[], int N, float *P) {
|
||||
; int i;
|
||||
; for (i = 0; i < N; ++i)
|
||||
; if (*P != 0)
|
||||
; a[i] = i;
|
||||
; }
|
||||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define void @f(i64* nocapture %a, i64 %N, float * %P) nounwind {
|
||||
entry:
|
||||
br label %bb
|
||||
|
||||
bb:
|
||||
%i = phi i64 [ 0, %entry ], [ %i.inc, %bb.backedge ]
|
||||
%brcond = icmp ne float* %P, null
|
||||
br i1 %brcond, label %store, label %bb.backedge
|
||||
|
||||
store:
|
||||
%scevgep = getelementptr i64* %a, i64 %i
|
||||
store i64 %i, i64* %scevgep
|
||||
br label %bb.backedge
|
||||
|
||||
bb.backedge:
|
||||
%i.inc = add nsw i64 %i, 1
|
||||
%exitcond = icmp eq i64 %i.inc, %N
|
||||
br i1 %exitcond, label %return, label %bb
|
||||
|
||||
return:
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: Assumed Context:
|
||||
; CHECK: { : }
|
||||
|
||||
; CHECK: Stmt_store
|
||||
; CHECK: Domain :=
|
||||
; CHECK: [N, P] -> { Stmt_store[i0] :
|
||||
; CHECK: (P <= -1 and i0 >= 0 and i0 <= -1 + N)
|
||||
; CHECK: or
|
||||
; CHECK: (P >= 1 and i0 >= 0 and i0 <= -1 + N)
|
||||
; CHECK: };
|
||||
; CHECK: Scattering :=
|
||||
; CHECK: [N, P] -> { Stmt_store[i0] -> scattering[i0] };
|
||||
; CHECK: MustWriteAccess := [Reduction Type: NONE]
|
||||
; CHECK: [N, P] -> { Stmt_store[i0] -> MemRef_a[i0] };
|
Loading…
Reference in New Issue