From dcb5f1dcf602f8d2951fe834a1a49f787dfea95b Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Thu, 18 Sep 2014 11:14:30 +0000 Subject: Allow the IslExprBuilder to build address of expressions llvm-svn: 218045 --- polly/lib/CodeGen/IslExprBuilder.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'polly/lib/CodeGen/IslExprBuilder.cpp') diff --git a/polly/lib/CodeGen/IslExprBuilder.cpp b/polly/lib/CodeGen/IslExprBuilder.cpp index 28c1444f415..fe4be5dc2a8 100644 --- a/polly/lib/CodeGen/IslExprBuilder.cpp +++ b/polly/lib/CodeGen/IslExprBuilder.cpp @@ -91,7 +91,7 @@ Value *IslExprBuilder::createOpNAry(__isl_take isl_ast_expr *Expr) { return V; } -Value *IslExprBuilder::createOpAccess(isl_ast_expr *Expr) { +Value *IslExprBuilder::createAccessAddress(isl_ast_expr *Expr) { assert(isl_ast_expr_get_type(Expr) == isl_ast_expr_op && "isl ast expression not of type isl_ast_op"); assert(isl_ast_expr_get_op_type(Expr) == isl_ast_op_access && @@ -140,6 +140,12 @@ Value *IslExprBuilder::createOpAccess(isl_ast_expr *Expr) { return Access; } +Value *IslExprBuilder::createOpAccess(isl_ast_expr *Expr) { + Value *Addr = createAccessAddress(Expr); + assert(Addr && "Could not create op access address"); + return Builder.CreateLoad(Addr, Addr->getName() + ".load"); +} + Value *IslExprBuilder::createOpBin(__isl_take isl_ast_expr *Expr) { Value *LHS, *RHS, *Res; Type *MaxType; @@ -355,7 +361,6 @@ Value *IslExprBuilder::createOp(__isl_take isl_ast_expr *Expr) { case isl_ast_op_or_else: case isl_ast_op_call: case isl_ast_op_member: - case isl_ast_op_address_of: llvm_unreachable("Unsupported isl ast expression"); case isl_ast_op_access: return createOpAccess(Expr); @@ -383,11 +388,31 @@ 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_address_of: + return createOpAddressOf(Expr); } llvm_unreachable("Unsupported isl_ast_expr_op kind."); } +Value *IslExprBuilder::createOpAddressOf(__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 = createAccessAddress(Op); + + isl_ast_expr_free(Expr); + + return V; +} + Value *IslExprBuilder::createId(__isl_take isl_ast_expr *Expr) { assert(isl_ast_expr_get_type(Expr) == isl_ast_expr_id && "Expression not of type isl_ast_expr_ident"); -- cgit v1.2.3