From patchwork Thu Jul 29 20:21:17 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Pop X-Patchwork-Id: 60314 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 07AC1B70B9 for ; Fri, 30 Jul 2010 06:21:58 +1000 (EST) Received: (qmail 8896 invoked by alias); 29 Jul 2010 20:21:54 -0000 Received: (qmail 8648 invoked by uid 22791); 29 Jul 2010 20:21:46 -0000 X-SWARE-Spam-Status: No, hits=-1.0 required=5.0 tests=AWL, BAYES_40, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, TW_GB, T_FRT_BELOW2, T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-gx0-f175.google.com (HELO mail-gx0-f175.google.com) (209.85.161.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 29 Jul 2010 20:21:36 +0000 Received: by gxk2 with SMTP id 2so309576gxk.20 for ; Thu, 29 Jul 2010 13:21:34 -0700 (PDT) Received: by 10.101.107.8 with SMTP id j8mr721803anm.166.1280434894339; Thu, 29 Jul 2010 13:21:34 -0700 (PDT) Received: from napoca (cpe-70-120-196-107.austin.res.rr.com [70.120.196.107]) by mx.google.com with ESMTPS id t30sm2071439ann.27.2010.07.29.13.21.31 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 29 Jul 2010 13:21:33 -0700 (PDT) Received: by napoca (sSMTP sendmail emulation); Thu, 29 Jul 2010 15:21:29 -0500 From: Sebastian Pop To: gcc-patches@gcc.gnu.org Cc: gcc-graphite@googlegroups.com, Sebastian Pop Subject: [PATCH 2/2] Write OpenScop format. Date: Thu, 29 Jul 2010 15:21:17 -0500 Message-Id: <1280434877-24563-3-git-send-email-sebpop@gmail.com> In-Reply-To: <1280434877-24563-1-git-send-email-sebpop@gmail.com> References: <1280434877-24563-1-git-send-email-sebpop@gmail.com> X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 2010-07-29 Riyadh Baghdadi * graphite-cloog-util.c (openscop_print_cloog_matrix): New. (openscop_print_polyhedron_matrix): New. * graphite-cloog-util.h (openscop_print_polyhedron_matrix): Declared. * graphite-poly.c (openscop_print_pdr_polyhedron): Same. (openscop_print_pdr_powerset): New. (openscop_print_powerset_matrix): New. (openscop_print_scattering_function_1): New. (print_scattering_function): Add support for scattering names and OpenScop format. (graphite_write_transforms): Remove. (apply_poly_transforms): Updated to call print_scop. (print_pdr_access_layout): Updated to support OpenScop format. (print_pdr): Same. (openscop_print_pbb_domain): New. (print_pbb_body): Added a parameter to allow indicating that pbb_body is not provided. (print_pbb): Updated to call the new print_pbb_body. (openscop_print_scop_context): New. (print_scop_header): New. (print_scop): Updated to call print_scop_header. * graphite-poly.h: Document OpenScop format. --- gcc/ChangeLog.graphite | 24 ++++ gcc/graphite-cloog-util.c | 39 ++++++ gcc/graphite-cloog-util.h | 2 + gcc/graphite-poly.c | 313 ++++++++++++++++++++++++++++++++++++++++----- gcc/graphite-poly.h | 49 +++++++- 5 files changed, 394 insertions(+), 33 deletions(-) diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite index e040d6e..2b3310d 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,3 +1,27 @@ +2010-07-29 Riyadh Baghdadi + + * graphite-cloog-util.c (openscop_print_cloog_matrix): New. + (openscop_print_polyhedron_matrix): New. + * graphite-cloog-util.h (openscop_print_polyhedron_matrix): Declared. + * graphite-poly.c (openscop_print_pdr_polyhedron): Same. + (openscop_print_pdr_powerset): New. + (openscop_print_powerset_matrix): New. + (openscop_print_scattering_function_1): New. + (print_scattering_function): Add support for scattering names and + OpenScop format. + (graphite_write_transforms): Remove. + (apply_poly_transforms): Updated to call print_scop. + (print_pdr_access_layout): Updated to support OpenScop format. + (print_pdr): Same. + (openscop_print_pbb_domain): New. + (print_pbb_body): Added a parameter to allow indicating that pbb_body is + not provided. + (print_pbb): Updated to call the new print_pbb_body. + (openscop_print_scop_context): New. + (print_scop_header): New. + (print_scop): Updated to call print_scop_header. + * graphite-poly.h: Document OpenScop format. + 2010-07-29 Sebastian Pop * graphite-sese-to-poly.c (rewrite_close_phi_out_of_ssa): Add back diff --git a/gcc/graphite-cloog-util.c b/gcc/graphite-cloog-util.c index 5ea7c3c..97ef73d 100644 --- a/gcc/graphite-cloog-util.c +++ b/gcc/graphite-cloog-util.c @@ -296,4 +296,43 @@ new_Cloog_Domain_from_ppl_Pointset_Powerset return res; } + +/* Print to FILE the matrix MAT in OpenScop format. OUTPUT is the number + of output dimensions, INPUT is the number of input dimensions, LOCALS + is the number of existentially quantified variables and PARAMS is the + number of parameters. */ + +static void +openscop_print_cloog_matrix (FILE *file, CloogMatrix *mat, + int output, int input, int locals, + int params) +{ + int i, j; + + fprintf (file, "%d %d %d %d %d %d \n", cloog_matrix_nrows (mat), + cloog_matrix_ncolumns (mat), output, input, locals, params); + + for (i = 0; i < cloog_matrix_nrows (mat); i++) + { + for (j = 0; j < cloog_matrix_ncolumns (mat); j++) + fprintf (file, "%6ld ", mpz_get_si (mat->p[i][j])); + fprintf (file, "\n"); + } +} + +/* Print to FILE the polyhedron PH in OpenScop format. OUTPUT is the number + of output dimensions, INPUT is the number of input dimensions, LOCALS is + the number of existentially quantified variables and PARAMS is the number + of parameters. */ + +void +openscop_print_polyhedron_matrix (FILE *file, ppl_const_Polyhedron_t ph, + int output, int input, int locals, + int params) +{ + CloogMatrix *mat = new_Cloog_Matrix_from_ppl_Polyhedron (ph); + openscop_print_cloog_matrix (file, mat, output, input, locals, params); + cloog_matrix_free (mat); +} + #endif diff --git a/gcc/graphite-cloog-util.h b/gcc/graphite-cloog-util.h index d7758ce..62e2f94 100644 --- a/gcc/graphite-cloog-util.h +++ b/gcc/graphite-cloog-util.h @@ -32,5 +32,7 @@ CloogScattering *new_Cloog_Scattering_from_ppl_Polyhedron CloogDomain * new_Cloog_Domain_from_ppl_Pointset_Powerset (ppl_Pointset_Powerset_C_Polyhedron_t, int, CloogState *); void new_C_Polyhedron_from_Cloog_Matrix (ppl_Polyhedron_t *, CloogMatrix *); +void openscop_print_polyhedron_matrix (FILE *, ppl_const_Polyhedron_t, int, + int, int, int); #endif /* GRAPHITE_CLOOG_UTIL_H */ diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c index 8718973..c1ac69e 100644 --- a/gcc/graphite-poly.c +++ b/gcc/graphite-poly.c @@ -44,6 +44,7 @@ along with GCC; see the file COPYING3. If not see #include "pointer-set.h" #include "gimple.h" #include "params.h" +#include "graphite-cloog-util.h" #ifdef HAVE_cloog #include "ppl_c.h" @@ -136,6 +137,159 @@ unify_scattering_dimensions (scop_p scop) return max_scattering; } +/* Print to FILE the pdr PH in OpenScop format. NB_SUBSCRIPTS is the number + of subscripts in PH, ALIAS_SET_DIM is the dimension of the alias set and + NB_PARAMS is the number of parameters in PH. */ + +static void +openscop_print_pdr_polyhedron (FILE *file, ppl_const_Polyhedron_t ph, + int nb_subscripts, int alias_set_dimension, + int nb_params) +{ + int input, locals, output; + ppl_dimension_type alias_set_dim = (ppl_dimension_type) alias_set_dimension; + ppl_dimension_type sub_dim_last = alias_set_dim + nb_subscripts; + ppl_dimension_type *map, i, ph_space_dim = sub_dim_last + 1; + ppl_Polyhedron_t pph; + + ppl_new_C_Polyhedron_from_C_Polyhedron (&pph,ph); + + map = (ppl_dimension_type *) XNEWVEC (ppl_dimension_type, ph_space_dim); + + for (i = 0; i < alias_set_dim - 1; i++) + map[i] = nb_subscripts + 1 + i; + + for (i = alias_set_dim - 1; i < sub_dim_last; i++) + map[i] = i - alias_set_dim + 1; + + ppl_Polyhedron_map_space_dimensions (pph, map, ph_space_dim - 1); + + locals = 0; + input = alias_set_dim - nb_params - 1; + + /* According to OpenScop specification, the alias set column is a part of + the output columns. */ + output = nb_subscripts + 1; + + openscop_print_polyhedron_matrix (file, ph, output, input, locals, nb_params); +} + +/* Print to FILE the powerset PDR. NB_SUBSCRIPTS is the number of subscripts + in PDR, ALIAS_SET_DIM is the dimension of the alias set in PDR and + NB_PARAMS is the number of parameters in PDR. */ + +static void +openscop_print_pdr_powerset (FILE *file, + ppl_Pointset_Powerset_C_Polyhedron_t ps, + int nb_subscripts, + int alias_set_dim, + int nb_params) +{ + size_t nb_disjuncts; + ppl_Pointset_Powerset_C_Polyhedron_iterator_t it, end; + + ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&it); + ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&end); + + ppl_Pointset_Powerset_C_Polyhedron_size (ps, &nb_disjuncts); + fprintf (file, "%d\n", (int) nb_disjuncts); + + for (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (ps, it), + ppl_Pointset_Powerset_C_Polyhedron_iterator_end (ps, end); + !ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (it, end); + ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (it)) + { + ppl_const_Polyhedron_t ph; + + ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (it, &ph); + openscop_print_pdr_polyhedron (file, ph, nb_subscripts, alias_set_dim, + nb_params); + } + + ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (it); + ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (end); +} + +/* Print to FILE the powerset PS in its OpenScop matrix form. */ + +static void +openscop_print_powerset_matrix (FILE *file, + ppl_Pointset_Powerset_C_Polyhedron_t ps, + int output, int input, int locals, + int params) +{ + size_t nb_disjuncts; + ppl_Pointset_Powerset_C_Polyhedron_iterator_t it, end; + + ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&it); + ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&end); + + ppl_Pointset_Powerset_C_Polyhedron_size (ps, &nb_disjuncts); + fprintf (file, "%d\n", (int) nb_disjuncts); + + for (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (ps, it), + ppl_Pointset_Powerset_C_Polyhedron_iterator_end (ps, end); + !ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (it, end); + ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (it)) + { + ppl_const_Polyhedron_t ph; + + ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (it, &ph); + openscop_print_polyhedron_matrix (file, ph, output, input, locals, + params); + } + + ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (it); + ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (end); +} + +/* Prints to FILE the scattering function of PBB in OpenScop format, at some + VERBOSITY level. */ + +static void +openscop_print_scattering_function_1 (FILE *file, poly_bb_p pbb, int verbosity) +{ + graphite_dim_t i; + ppl_const_Polyhedron_t ph; + + if (verbosity > 0) + { + fprintf (file, "# scattering bb_%d (\n", pbb_index (pbb)); + fprintf (file, "# eq"); + + for (i = 0; i < pbb_nb_scattering_transform (pbb); i++) + fprintf (file, " s%d", (int) i); + + for (i = 0; i < pbb_nb_local_vars (pbb); i++) + fprintf (file, " lv%d", (int) i); + + for (i = 0; i < pbb_dim_iter_domain (pbb); i++) + fprintf (file, " i%d", (int) i); + + for (i = 0; i < pbb_nb_params (pbb); i++) + fprintf (file, " p%d", (int) i); + + fprintf (file, " cst\n"); + } + + /* Number of disjunct components. Remove this when + PBB_TRANSFORMED_SCATTERING will be a pointset_powerset. */ + fprintf (file, "1\n"); + + ph = PBB_TRANSFORMED_SCATTERING (pbb) + ? PBB_TRANSFORMED_SCATTERING (pbb) + : PBB_ORIGINAL_SCATTERING (pbb); + + openscop_print_polyhedron_matrix (file, ph, + pbb_nb_scattering_transform (pbb), + pbb_dim_iter_domain (pbb), + pbb_nb_local_vars (pbb), + pbb_nb_params (pbb)); + + if (verbosity > 0) + fprintf (file, "#)\n"); +} + /* Prints to FILE the scattering function of PBB, at some VERBOSITY level. */ @@ -201,7 +355,13 @@ print_scattering_function (FILE *file, poly_bb_p pbb, int verbosity) return; } - print_scattering_function_1 (file, pbb, verbosity); + openscop_print_scattering_function_1 (file, pbb, verbosity); + + if (verbosity > 0) + fprintf (file, "# Scattering names are not provided\n"); + + fprintf (file, "0\n"); + } /* Prints to FILE the iteration domain of PBB, at some VERBOSITY @@ -274,14 +434,6 @@ debug_iteration_domains (scop_p scop, int verbosity) print_iteration_domains (stderr, scop, verbosity); } -/* Write to file_name.graphite the transforms for SCOP. */ - -static void -graphite_write_transforms (scop_p scop) -{ - print_scattering_functions (graphite_out_file, scop, 0); -} - /* Read transforms from file_name.graphite and set the transforms on SCOP. */ @@ -338,7 +490,7 @@ apply_poly_transforms (scop_p scop) } if (flag_graphite_write) - graphite_write_transforms (scop); + print_scop (graphite_out_file, scop, 1); return transform_done; } @@ -466,23 +618,23 @@ free_poly_bb (poly_bb_p pbb) } static void -print_pdr_access_layout (FILE *file, poly_dr_p pdr) +print_pdr_access_layout (FILE *file, poly_bb_p pbb, poly_dr_p pdr) { graphite_dim_t i; fprintf (file, "# eq"); - for (i = 0; i < pdr_dim_iter_domain (pdr); i++) - fprintf (file, " i%d", (int) i); - - for (i = 0; i < pdr_nb_params (pdr); i++) - fprintf (file, " p%d", (int) i); - - fprintf (file, " alias"); + fprintf (file, " alias"); for (i = 0; i < PDR_NB_SUBSCRIPTS (pdr); i++) fprintf (file, " sub%d", (int) i); + for (i = 0; i < pbb_dim_iter_domain (pbb); i++) + fprintf (file, " i%d", (int) i); + + for (i = 0; i < pbb_nb_params (pbb); i++) + fprintf (file, " p%d", (int) i); + fprintf (file, " cst\n"); } @@ -492,6 +644,8 @@ print_pdr_access_layout (FILE *file, poly_dr_p pdr) void print_pdr (FILE *file, poly_dr_p pdr, int verbosity) { + int alias_set_dim; + if (verbosity > 1) { fprintf (file, "# pdr_%d (", PDR_ID (pdr)); @@ -520,10 +674,16 @@ print_pdr (FILE *file, poly_dr_p pdr, int verbosity) if (verbosity > 0) { fprintf (file, "# data accesses (\n"); - print_pdr_access_layout (file, pdr); + print_pdr_access_layout (file, PDR_PBB (pdr), pdr); } - ppl_print_powerset_matrix (file, PDR_ACCESSES (pdr)); + alias_set_dim = pdr_alias_set_dim (pdr) + 1; + + openscop_print_pdr_powerset (file, + PDR_ACCESSES (pdr), + PDR_NB_SUBSCRIPTS (pdr), + alias_set_dim, + pbb_nb_params (PDR_PBB (pdr))); if (verbosity > 0) fprintf (file, "#)\n"); @@ -584,6 +744,45 @@ free_scop (scop_p scop) XDELETE (scop); } +/* Print to FILE the domain of PBB in OpenScop format, at some VERBOSITY + level. */ + +static void +openscop_print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity) +{ + graphite_dim_t i; + gimple_bb_p gbb = PBB_BLACK_BOX (pbb); + + if (!PBB_DOMAIN (pbb)) + return; + + if (verbosity > 0) + { + fprintf (file, "\n# Iteration domain of bb_%d (\n", GBB_BB (gbb)->index); + fprintf (file, "# eq"); + + for (i = 0; i < pbb_dim_iter_domain (pbb); i++) + fprintf (file, " i%d", (int) i); + + for (i = 0; i < pbb_nb_params (pbb); i++) + fprintf (file, " p%d", (int) i); + + fprintf (file, " cst\n"); + } + + if (PBB_DOMAIN (pbb)) + openscop_print_powerset_matrix (file, PBB_DOMAIN (pbb), + pbb_dim_iter_domain (pbb), + 0, + 0, + pbb_nb_params (pbb)); + else + fprintf (file, "0\n"); + + if (verbosity > 0) + fprintf (file, "#)\n"); +} + /* Print to FILE the domain of PBB, at some VERBOSITY level. */ void @@ -744,14 +943,25 @@ debug_pdrs (poly_bb_p pbb, int verbosity) print_pdrs (stderr, pbb, verbosity); } -/* Print to FILE the body of PBB, at some VERBOSITY level. */ +/* Print to FILE the body of PBB, at some VERBOSITY level. + If statement_body_provided is false statement body is not printed. */ static void -print_pbb_body (FILE *file, poly_bb_p pbb, int verbosity) +print_pbb_body (FILE *file, poly_bb_p pbb, int verbosity, + bool statement_body_provided) { if (verbosity > 1) fprintf (file, "# Body (\n"); + if (!statement_body_provided) + { + if (verbosity > 0) + fprintf (file, "# Statement body is not provided\n"); + + fprintf (file, "0\n"); + return; + } + if (verbosity > 0) fprintf (file, "# Statement body is provided\n"); fprintf (file, "1\n"); @@ -783,10 +993,10 @@ print_pbb (FILE *file, poly_bb_p pbb, int verbosity) dump_gbb_cases (file, PBB_BLACK_BOX (pbb)); } - print_pbb_domain (file, pbb, verbosity); + openscop_print_pbb_domain (file, pbb, verbosity); print_scattering_function (file, pbb, verbosity); print_pdrs (file, pbb, verbosity); - print_pbb_body (file, pbb, verbosity); + print_pbb_body (file, pbb, verbosity, false); if (verbosity > 1) fprintf (file, "#)\n"); @@ -832,6 +1042,36 @@ print_scop_params (FILE *file, scop_p scop, int verbosity) fprintf (file, "#)\n"); } +/* Print to FILE the context of SCoP in OpenScop format, at some VERBOSITY + level. */ + +static void +openscop_print_scop_context (FILE *file, scop_p scop, int verbosity) +{ + graphite_dim_t i; + + if (verbosity > 0) + { + fprintf (file, "# Context (\n"); + fprintf (file, "# eq"); + + for (i = 0; i < scop_nb_params (scop); i++) + fprintf (file, " p%d", (int) i); + + fprintf (file, " cst\n"); + } + + if (SCOP_CONTEXT (scop)) + openscop_print_powerset_matrix (file, SCOP_CONTEXT (scop), 0, 0, 0, + scop_nb_params (scop)); + else + fprintf (file, "0 %d 0 0 0 %d\n", (int) scop_nb_params (scop) + 2, + (int) scop_nb_params (scop)); + + if (verbosity > 0) + fprintf (file, "# )\n"); +} + /* Print to FILE the context of SCoP, at some VERBOSITY level. */ void @@ -859,23 +1099,32 @@ print_scop_context (FILE *file, scop_p scop, int verbosity) fprintf (file, "# )\n"); } -/* Print to FILE the SCOP, at some VERBOSITY level. */ +/* Print to FILE the SCOP header: context, parameters, and statements + number. */ -void -print_scop (FILE *file, scop_p scop, int verbosity) +static void +print_scop_header (FILE *file, scop_p scop, int verbosity) { - int i; - poly_bb_p pbb; - - fprintf (file, "SCoP #(\n"); + fprintf (file, "SCoP 1\n#(\n"); fprintf (file, "# Language\nGimple\n"); - print_scop_context (file, scop, verbosity); + openscop_print_scop_context (file, scop, verbosity); print_scop_params (file, scop, verbosity); if (verbosity > 0) fprintf (file, "# Number of statements\n"); fprintf (file, "%d\n",VEC_length (poly_bb_p, SCOP_BBS (scop))); +} + +/* Print to FILE the SCOP, at some VERBOSITY level. */ + +void +print_scop (FILE *file, scop_p scop, int verbosity) +{ + int i; + poly_bb_p pbb; + + print_scop_header (file, scop, verbosity); for (i = 0; VEC_iterate (poly_bb_p, SCOP_BBS (scop), i, pbb); i++) print_pbb (file, pbb, verbosity); diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h index 5f858eb..0e1aa1f 100644 --- a/gcc/graphite-poly.h +++ b/gcc/graphite-poly.h @@ -132,7 +132,54 @@ struct poly_dr dimensions. | i j k a 1 - | 0 0 0 -1 15 = 0 */ + | 0 0 0 -1 15 = 0 + + The difference between the graphite internal format for access data and + the OpenSop format is in the order of columns. + Instead of having: + + | i j k a s0 s1 1 + | 0 0 0 1 0 0 -5 = 0 + |-1 0 0 0 1 0 0 = 0 + | 0 -1 -1 0 0 1 0 = 0 + | 0 0 0 0 1 0 0 >= 0 # The last four lines describe the + | 0 0 0 0 0 1 0 >= 0 # array size. + | 0 0 0 0 -1 0 1335 >= 0 + | 0 0 0 0 0 -1 123 >= 0 + + In OpenScop we have: + + | a s0 s1 i j k 1 + | 1 0 0 0 0 0 -5 = 0 + | 0 1 0 -1 0 0 0 = 0 + | 0 0 1 0 -1 -1 0 = 0 + | 0 1 0 0 0 0 0 >= 0 # The last four lines describe the + | 0 0 1 0 0 0 0 >= 0 # array size. + | 0 -1 0 0 0 0 1335 >= 0 + | 0 0 -1 0 0 0 123 >= 0 + + The OpenScop access function is printed as follows: + + | 1 # The number of disjunct components in a union of access functions. + | R C O I L P # Described bellow. + | a s0 s1 i j k 1 + | 1 0 0 0 0 0 -5 = 0 + | 0 1 0 -1 0 0 0 = 0 + | 0 0 1 0 -1 -1 0 = 0 + | 0 1 0 0 0 0 0 >= 0 # The last four lines describe the + | 0 0 1 0 0 0 0 >= 0 # array size. + | 0 -1 0 0 0 0 1335 >= 0 + | 0 0 -1 0 0 0 123 >= 0 + + Where: + - R: Number of rows. + - C: Number of columns. + - O: Number of output dimensions = alias set + number of subscripts. + - I: Number of input dimensions (iterators). + - L: Number of local (existentially quantified) dimensions. + - P: Number of parameters. + + In the example, the vector "R C O I L P" is "7 7 3 2 0 1". */ ppl_Pointset_Powerset_C_Polyhedron_t accesses; /* Data reference's base object set number, we must assure 2 pdrs are in the