[polly] r225464 - Add support for pointer types in expressions
Johannes Doerfert
doerfert at cs.uni-saarland.de
Wed Jan 28 16:38:01 PST 2015
Hey Tobias,
I just looked at a lnt run and realized that we fail quite a few tests.
This is also represented in the state of the buildbots for quite a while
now.
I believe this patch is at least part of the problem. I will push a fix
but I also wanted to add some comments on this patch.
On 01/08, Tobias Grosser wrote:
> Author: grosser
> Date: Thu Jan 8 13:26:53 2015
> New Revision: 225464
>
> URL: http://llvm.org/viewvc/llvm-project?rev=225464&view=rev
> Log:
> Add support for pointer types in expressions
>
> Added:
> polly/trunk/test/Isl/CodeGen/pointer-type-expressions.ll
> polly/trunk/test/ScopInfo/pointer-type-expressions.ll
> Modified:
> polly/trunk/lib/Analysis/ScopInfo.cpp
> polly/trunk/lib/CodeGen/IslCodeGeneration.cpp
> polly/trunk/lib/CodeGen/IslExprBuilder.cpp
> polly/trunk/lib/Support/SCEVValidator.cpp
>
> Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=225464&r1=225463&r2=225464&view=diff
> ==============================================================================
> --- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
> +++ polly/trunk/lib/Analysis/ScopInfo.cpp Thu Jan 8 13:26:53 2015
> @@ -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();
I don't see why you removed the context information for pointer types.
We could generate the same as for integer types.
>
> V = isl_val_int_from_si(IslCtx, Width - 1);
> V = isl_val_2exp(V);
>
> Modified: polly/trunk/lib/CodeGen/IslCodeGeneration.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslCodeGeneration.cpp?rev=225464&r1=225463&r2=225464&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/IslCodeGeneration.cpp (original)
> +++ polly/trunk/lib/CodeGen/IslCodeGeneration.cpp Thu Jan 8 13:26:53 2015
> @@ -871,8 +871,7 @@ void IslNodeBuilder::addParameters(__isl
>
> 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 {
>
> Modified: polly/trunk/lib/CodeGen/IslExprBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslExprBuilder.cpp?rev=225464&r1=225463&r2=225464&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/IslExprBuilder.cpp (original)
> +++ polly/trunk/lib/CodeGen/IslExprBuilder.cpp Thu Jan 8 13:26:53 2015
> @@ -280,13 +280,16 @@ Value *IslExprBuilder::createOpICmp(__is
> 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);
This handles the case for <pointer> <cmp> <null>, however, the problem we
run in lnt into is different:
if (PtrA != PtrB)
will be translated into:
if (PtrA >= PtrB + 1)
...
else if (PtrB >= PtrA + 1)
now the IslExprBuilder will fail to build the appropriate pointer + integer
expression which then should result again in a pointer type.
> if (LHS->getType() != I8PtrTy)
> LHS = Builder.CreateBitCast(LHS, I8PtrTy);
> if (RHS->getType() != I8PtrTy)
>
> Modified: polly/trunk/lib/Support/SCEVValidator.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Support/SCEVValidator.cpp?rev=225464&r1=225463&r2=225464&view=diff
> ==============================================================================
> --- polly/trunk/lib/Support/SCEVValidator.cpp (original)
> +++ polly/trunk/lib/Support/SCEVValidator.cpp Thu Jan 8 13:26:53 2015
> @@ -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);
> }
>
>
> Added: polly/trunk/test/Isl/CodeGen/pointer-type-expressions.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/pointer-type-expressions.ll?rev=225464&view=auto
> ==============================================================================
> --- polly/trunk/test/Isl/CodeGen/pointer-type-expressions.ll (added)
> +++ polly/trunk/test/Isl/CodeGen/pointer-type-expressions.ll Thu Jan 8 13:26:53 2015
> @@ -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)
The IR code below is actually:
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"
Why do you still have triple strings in here? Don't you use the
create_ll.sh script?
> +
> +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*)
> +
>
> Added: polly/trunk/test/ScopInfo/pointer-type-expressions.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/pointer-type-expressions.ll?rev=225464&view=auto
> ==============================================================================
> --- polly/trunk/test/ScopInfo/pointer-type-expressions.ll (added)
> +++ polly/trunk/test/ScopInfo/pointer-type-expressions.ll Thu Jan 8 13:26:53 2015
> @@ -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)
Same as above.
> +; 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"
Same as above.
> +
> +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] };
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
--
Johannes Doerfert
Researcher / PhD Student
Compiler Design Lab (Prof. Hack)
Saarland University, Computer Science
Building E1.3, Room 4.26
Tel. +49 (0)681 302-57521 : doerfert at cs.uni-saarland.de
Fax. +49 (0)681 302-3065 : http://www.cdl.uni-saarland.de/people/doerfert
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 213 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150129/532e10a3/attachment.sig>
More information about the llvm-commits
mailing list