[Polly][PATCH 5/8] Allow the IslExprBuilder to build address of expressions
Johannes Doerfert
doerfert at cs.uni-saarland.de
Mon Aug 11 01:52:27 PDT 2014
On 08/11, Tobias Grosser wrote:
> On 11/08/2014 09:36, Johannes Doerfert wrote:
> >On 08/11, Tobias Grosser wrote:
> >>On 10/08/2014 09:50, Johannes Doerfert wrote:
> >>>---
> >>> include/polly/CodeGen/IslExprBuilder.h | 1 +
> >>> lib/CodeGen/IslExprBuilder.cpp | 26 ++++++++++++++++++++++++++
> >>> 2 files changed, 27 insertions(+)
> >>>
> >>>diff --git a/include/polly/CodeGen/IslExprBuilder.h b/include/polly/CodeGen/IslExprBuilder.h
> >>>index c87cd57..39e7044 100644
> >>>--- a/include/polly/CodeGen/IslExprBuilder.h
> >>>+++ b/include/polly/CodeGen/IslExprBuilder.h
> >>>@@ -128,6 +128,7 @@ private:
> >>> llvm::Value *createOpBoolean(__isl_take isl_ast_expr *Expr);
> >>> llvm::Value *createId(__isl_take isl_ast_expr *Expr);
> >>> llvm::Value *createInt(__isl_take isl_ast_expr *Expr);
> >>>+ llvm::Value *createOpAddrOf(__isl_take isl_ast_expr *Expr);
> >>> };
> >>> }
> >>>
> >>>diff --git a/lib/CodeGen/IslExprBuilder.cpp b/lib/CodeGen/IslExprBuilder.cpp
> >>>index b9bdabe..5eeab39 100644
> >>>--- a/lib/CodeGen/IslExprBuilder.cpp
> >>>+++ b/lib/CodeGen/IslExprBuilder.cpp
> >>>@@ -389,11 +389,37 @@ Value *IslExprBuilder::createOp(__isl_take isl_ast_expr *Expr) {
> >>> case isl_ast_op_ge:
> >>> case isl_ast_op_gt:
> >>> return createOpICmp(Expr);
> >>>+ case isl_ast_op_addr_of:
> >>>+ return createOpAddrOf(Expr);
> >>
> >>I would prefer AddressOf
> >Sure.
> >
> >>> }
> >>>
> >>> llvm_unreachable("Unsupported isl_ast_expr_op kind.");
> >>> }
> >>>
> >>>+Value *IslExprBuilder::createOpAddrOf(__isl_take isl_ast_expr *Expr) {
> >>>+ assert(isl_ast_expr_get_type(Expr) == isl_ast_expr_op &&
> >>>+ "Expected an isl_ast_expr_op expression.");
> >>>+ assert(isl_ast_expr_get_op_n_arg(Expr) == 1 && "Address of should be unary.");
> >>>+
> >>>+ isl_ast_expr *Op = isl_ast_expr_get_op_arg(Expr, 0);
> >>>+ assert(isl_ast_expr_get_type(Op) == isl_ast_expr_op &&
> >>>+ "Expected address of operator to be an isl_ast_expr_op expression.");
> >>>+ assert(isl_ast_expr_get_op_type(Op) == isl_ast_op_access &&
> >>>+ "Expected address of operator to be an access expression.");
> >>>+
> >>>+ Value *V = create(Op);
> >>>+
> >>>+ LoadInst *LI = dyn_cast<LoadInst>(V);
> >>>+ assert(LI && "Address of operand should result in a load.");
> >>>+
> >>>+ V = LI->getPointerOperand();
> >>>+ LI->eraseFromParent();
> >>
> >>This is a little hackish. I would prefer that we factor out the code that
> >>computes the address of an access and that we just call it from both, this
> >>location and the location where we generate the load.
> >This is not as hackish as it looks like. The reason is the restriction on
> >the new isl_ast_expr address_of operator. So far it is only applicable to access
> >operations (I can add a comment as the assert seems not to explain it
> >very well).
>
> Still, adding an instruction to just remove it a second later seems hackish.
Granted.
> > In the future it might be applicable to more but the "types"
> >still have to match, thus in our code generation the operand should
> >result in a load/store (the store case is missing at the moment though).
> >If you want me to factor it out, sure...
> >
> >>Also, I am surprised that create(Op) actually returns a load instruction? My
> >>understanding is that we do not create load/stores for access expressions,
> >>but that we only create the ptr value?
> >I change the behaviour of createOpAccess to generate the load and the
> >reason is pretty simple:
> > A isl_ast_expr which dumps like MemRef_sum[0] or MemRef_A[i] should
> > not result in a LLVM-Value representing &MemRef_sum[0] or
> > &MemRef_A[i]. What we did before for isl ast access expressions was
> > actually implementing the address of the access not the actual
> > access.
>
> Right. You should mention such things in your commit message. They are very
> helpful to understand what you are doing.
>
> Nevertheless, you change just makes the behaviour unintuitive in a different
> way.
>
> As proposed before, I would just assert if we see an isl_ast_access that
> is not surrounded by the address_of instruction.
How is that going to work?
> And the address_of instruction could directly compute the address (using a
> subfunction), without having to create a load that is later removed.
We can do that.
> Tobias
--
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/20140811/7fcea6ef/attachment.sig>
More information about the llvm-commits
mailing list