[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