Commit e37f165f by Sebastian Pop Committed by Sebastian Pop

graphite-dependences.c (new_poly_dr_pair): Renamed new_poly_ddr.

2009-08-28  Sebastian Pop  <sebastian.pop@amd.com>

	* graphite-dependences.c (new_poly_dr_pair): Renamed new_poly_ddr.
	(eq_poly_dr_pair_p): Renamed eq_poly_ddr_p.
	(hash_poly_dr_pair_p): Renamed hash_poly_ddr_p.
	(free_poly_ddr): New.
	(pddr_is_empty): New.
	(dependence_polyhedron_1): Now returns a poly_ddr_p.
	(dependence_polyhedron): Same.  Remove useless gcc_assert.
	Remove fprintfs.
	(graphite_legal_transform_dr): Call pddr_is_empty and free_poly_ddr.
	(graphite_carried_dependence_level_k): Call pddr_is_empty.
	* graphite-dependences.h (enum poly_dependence_kind): New.
	(poly_dr_pair): Renamed poly_ddr.  Added a field kind.
	(PDRP_SOURCE): Renamed PDDR_SOURCE.
	(PDRP_SINK): Renamed PDDR_SINK.
	(PDRP_DDP): Renamed PDDR_DDP.
	(PDDR_KIND): New.
	(free_poly_ddr): Declared.
	* graphite-poly.c (new_scop): Use the new hash function names.
	* graphite-poly.h (struct scop): Renamed field original_pdr_pairs
	into original_pddrs.
	(SCOP_ORIGINAL_PDR_PAIRS): Renamed SCOP_ORIGINAL_PDDRS.

From-SVN: r151181
parent 45e76e9f
2009-08-28 Sebastian Pop <sebastian.pop@amd.com> 2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (new_poly_dr_pair): Renamed new_poly_ddr.
(eq_poly_dr_pair_p): Renamed eq_poly_ddr_p.
(hash_poly_dr_pair_p): Renamed hash_poly_ddr_p.
(free_poly_ddr): New.
(pddr_is_empty): New.
(dependence_polyhedron_1): Now returns a poly_ddr_p.
(dependence_polyhedron): Same. Remove useless gcc_assert.
Remove fprintfs.
(graphite_legal_transform_dr): Call pddr_is_empty and free_poly_ddr.
(graphite_carried_dependence_level_k): Call pddr_is_empty.
* graphite-dependences.h (enum poly_dependence_kind): New.
(poly_dr_pair): Renamed poly_ddr. Added a field kind.
(PDRP_SOURCE): Renamed PDDR_SOURCE.
(PDRP_SINK): Renamed PDDR_SINK.
(PDRP_DDP): Renamed PDDR_DDP.
(PDDR_KIND): New.
(free_poly_ddr): Declared.
* graphite-poly.c (new_scop): Use the new hash function names.
* graphite-poly.h (struct scop): Renamed field original_pdr_pairs
into original_pddrs.
(SCOP_ORIGINAL_PDR_PAIRS): Renamed SCOP_ORIGINAL_PDDRS.
2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
* cfgloopmanip.c (create_empty_loop_on_edge): Generate upper * cfgloopmanip.c (create_empty_loop_on_edge): Generate upper
bounds with LT_EXPR to make niter analysis more precise on code bounds with LT_EXPR to make niter analysis more precise on code
generated by Graphite. generated by Graphite.
......
2009-08-21 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (new_poly_dr_pair): Renamed new_poly_ddr.
(eq_poly_dr_pair_p): Renamed eq_poly_ddr_p.
(hash_poly_dr_pair_p): Renamed hash_poly_ddr_p.
(free_poly_ddr): New.
(pddr_is_empty): New.
(dependence_polyhedron_1): Now returns a poly_ddr_p.
(dependence_polyhedron): Same. Remove useless gcc_assert.
Remove fprintfs.
(graphite_legal_transform_dr): Call pddr_is_empty and free_poly_ddr.
(graphite_carried_dependence_level_k): Call pddr_is_empty.
* graphite-dependences.h (enum poly_dependence_kind): New.
(poly_dr_pair): Renamed poly_ddr. Added a field kind.
(PDRP_SOURCE): Renamed PDDR_SOURCE.
(PDRP_SINK): Renamed PDDR_SINK.
(PDRP_DDP): Renamed PDDR_DDP.
(PDDR_KIND): New.
(free_poly_ddr): Declared.
* graphite-poly.c (new_scop): Use the new hash function names.
* graphite-poly.h (struct scop): Renamed field original_pdr_pairs
into original_pddrs.
(SCOP_ORIGINAL_PDR_PAIRS): Renamed SCOP_ORIGINAL_PDDRS.
2009-08-21 Sebastian Pop <sebastian.pop@amd.com>
* Merge from mainline (150764:150992).
2009-08-18 Sebastian Pop <sebastian.pop@amd.com> 2009-08-18 Sebastian Pop <sebastian.pop@amd.com>
* cfgloopmanip.c (create_empty_loop_on_edge): Generate upper * cfgloopmanip.c (create_empty_loop_on_edge): Generate upper
......
...@@ -50,47 +50,73 @@ along with GCC; see the file COPYING3. If not see ...@@ -50,47 +50,73 @@ along with GCC; see the file COPYING3. If not see
#include "graphite-poly.h" #include "graphite-poly.h"
#include "graphite-dependences.h" #include "graphite-dependences.h"
/* Creates a new polyhedral data reference pair and /* Returns a new polyhedral Data Dependence Relation (DDR). SOURCE is
returns it. Parameter SOURCE denotes a source data reference the source data reference, SINK is the sink data reference. SOURCE
while parameter SINK denotes a sink data reference. Both and SINK define an edge in the Data Dependence Graph (DDG). */
SOURCE and SINK define a pair of references, thus they
define an edge in DDG (Data Dependence Graph). */ static poly_ddr_p
new_poly_ddr (poly_dr_p source, poly_dr_p sink,
static poly_dr_pair_p ppl_Pointset_Powerset_C_Polyhedron_t ddp)
new_poly_dr_pair (poly_dr_p source,
poly_dr_p sink,
ppl_Pointset_Powerset_C_Polyhedron_t ddp)
{ {
poly_dr_pair_p pdrpp; poly_ddr_p pddr;
pddr = XNEW (struct poly_ddr);
PDDR_SOURCE (pddr) = source;
PDDR_SINK (pddr) = sink;
PDDR_DDP (pddr) = ddp;
PDDR_KIND (pddr) = unknown_dependence;
return pddr;
}
pdrpp = XNEW (struct poly_dr_pair); /* Free the poly_ddr_p P. */
pdrpp->source = source;
pdrpp->sink = sink;
pdrpp->ddp = ddp;
return pdrpp; void
free_poly_ddr (void *p)
{
poly_ddr_p pddr = (poly_ddr_p) p;
ppl_delete_Pointset_Powerset_C_Polyhedron (PDDR_DDP (pddr));
free (pddr);
} }
/* Comparison function for poly_dr_pair hash table. */ /* Comparison function for poly_ddr hash table. */
int int
eq_poly_dr_pair_p (const void *pdrpp1, const void *pdrpp2) eq_poly_ddr_p (const void *pddr1, const void *pddr2)
{ {
const struct poly_dr_pair *p1 = (const struct poly_dr_pair *) pdrpp1; const struct poly_ddr *p1 = (const struct poly_ddr *) pddr1;
const struct poly_dr_pair *p2 = (const struct poly_dr_pair *) pdrpp2; const struct poly_ddr *p2 = (const struct poly_ddr *) pddr2;
return (p1->source == p2->source return (PDDR_SOURCE (p1) == PDDR_SOURCE (p2)
&& p1->sink == p2->sink); && PDDR_SINK (p1) == PDDR_SINK (p2));
} }
/* Hash function for poly_dr_pair hashtable. */ /* Hash function for poly_ddr hashtable. */
hashval_t hashval_t
hash_poly_dr_pair_p (const void *pdrpp) hash_poly_ddr_p (const void *pddr)
{ {
const struct poly_dr_pair *p = (const struct poly_dr_pair *) pdrpp; const struct poly_ddr *p = (const struct poly_ddr *) pddr;
return (hashval_t) ((long) PDDR_SOURCE (p) + (long) PDDR_SINK (p));
}
/* Returns true when PDDR has no dependence. */
return (hashval_t) ((long) p->source + (long) p->sink); static bool
pddr_is_empty (poly_ddr_p pddr)
{
if (PDDR_KIND (pddr) != unknown_dependence)
return PDDR_KIND (pddr) == no_dependence ? true : false;
if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (PDDR_DDP (pddr)))
{
PDDR_KIND (pddr) = no_dependence;
return true;
}
PDDR_KIND (pddr) = has_dependence;
return false;
} }
/* Returns a polyhedron of dimension DIM. /* Returns a polyhedron of dimension DIM.
...@@ -364,7 +390,7 @@ build_lexicographically_gt_constraint (ppl_Pointset_Powerset_C_Polyhedron_t *res ...@@ -364,7 +390,7 @@ build_lexicographically_gt_constraint (ppl_Pointset_Powerset_C_Polyhedron_t *res
/* Build the dependence polyhedron for data references PDR1 and PDR2. */ /* Build the dependence polyhedron for data references PDR1 and PDR2. */
static ppl_Pointset_Powerset_C_Polyhedron_t static poly_ddr_p
dependence_polyhedron_1 (poly_bb_p pbb1, poly_bb_p pbb2, dependence_polyhedron_1 (poly_bb_p pbb1, poly_bb_p pbb2,
ppl_Pointset_Powerset_C_Polyhedron_t d1, ppl_Pointset_Powerset_C_Polyhedron_t d1,
ppl_Pointset_Powerset_C_Polyhedron_t d2, ppl_Pointset_Powerset_C_Polyhedron_t d2,
...@@ -427,13 +453,14 @@ dependence_polyhedron_1 (poly_bb_p pbb1, poly_bb_p pbb2, ...@@ -427,13 +453,14 @@ dependence_polyhedron_1 (poly_bb_p pbb1, poly_bb_p pbb2,
if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (res)) if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (res))
build_lexicographically_gt_constraint (&res, dim, MIN (tdim1, tdim2), build_lexicographically_gt_constraint (&res, dim, MIN (tdim1, tdim2),
tdim1 + ddim1, direction); tdim1 + ddim1, direction);
return res;
return new_poly_ddr (pdr1, pdr2, res);
} }
/* Build the dependence polyhedron for data references PDR1 and PDR2. /* Build the dependence polyhedron for data references PDR1 and PDR2.
If possible use already cached information. */ If possible use already cached information. */
static ppl_Pointset_Powerset_C_Polyhedron_t static poly_ddr_p
dependence_polyhedron (poly_bb_p pbb1, poly_bb_p pbb2, dependence_polyhedron (poly_bb_p pbb1, poly_bb_p pbb2,
ppl_Pointset_Powerset_C_Polyhedron_t d1, ppl_Pointset_Powerset_C_Polyhedron_t d1,
ppl_Pointset_Powerset_C_Polyhedron_t d2, ppl_Pointset_Powerset_C_Polyhedron_t d2,
...@@ -442,38 +469,27 @@ dependence_polyhedron (poly_bb_p pbb1, poly_bb_p pbb2, ...@@ -442,38 +469,27 @@ dependence_polyhedron (poly_bb_p pbb1, poly_bb_p pbb2,
bool direction, bool direction,
bool original_scattering_p) bool original_scattering_p)
{ {
poly_dr_pair tmp;
PTR *x = NULL; PTR *x = NULL;
ppl_Pointset_Powerset_C_Polyhedron_t res; poly_ddr_p res;
if (original_scattering_p) if (original_scattering_p)
{ {
struct poly_ddr tmp;
tmp.source = pdr1; tmp.source = pdr1;
tmp.sink = pdr2; tmp.sink = pdr2;
x = htab_find_slot (SCOP_ORIGINAL_PDR_PAIRS (PBB_SCOP (pbb1)), x = htab_find_slot (SCOP_ORIGINAL_PDDRS (PBB_SCOP (pbb1)),
&tmp, INSERT); &tmp, INSERT);
if (x && *x) if (x && *x)
{ return (poly_ddr_p) *x;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\nddp cache: hit.\n");
return ((poly_dr_pair *)*x)->ddp;
}
else if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\nddp cache: miss.\n");
} }
res = dependence_polyhedron_1 (pbb1, pbb2, d1, d2, pdr1, pdr2, res = dependence_polyhedron_1 (pbb1, pbb2, d1, d2, pdr1, pdr2,
s1, s2, direction, original_scattering_p); s1, s2, direction, original_scattering_p);
if (original_scattering_p) if (original_scattering_p)
{ *x = res;
gcc_assert (x && *x == NULL);
*x = new_poly_dr_pair (pdr1, pdr2, res);
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\nddp cache: add element.\n");
}
return res; return res;
} }
...@@ -487,12 +503,12 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2, ...@@ -487,12 +503,12 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
poly_dr_p pdr1, poly_dr_p pdr2) poly_dr_p pdr1, poly_dr_p pdr2)
{ {
ppl_Polyhedron_t st1, st2; ppl_Polyhedron_t st1, st2;
ppl_Pointset_Powerset_C_Polyhedron_t pt; ppl_Pointset_Powerset_C_Polyhedron_t po, pt;
graphite_dim_t ddim1, otdim1, otdim2, ttdim1, ttdim2; graphite_dim_t ddim1, otdim1, otdim2, ttdim1, ttdim2;
ppl_Pointset_Powerset_C_Polyhedron_t temp; ppl_Pointset_Powerset_C_Polyhedron_t temp;
ppl_dimension_type pdim; ppl_dimension_type pdim;
bool is_empty_p; bool is_empty_p;
ppl_Pointset_Powerset_C_Polyhedron_t po; poly_ddr_p pddr;
ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1); ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1);
ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2); ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2);
...@@ -504,12 +520,13 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2, ...@@ -504,12 +520,13 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
if (sdim1 != sdim2) if (sdim1 != sdim2)
return true; return true;
po = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2, pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
true, true); true, true);
if (pddr_is_empty (pddr))
if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (po))
return true; return true;
po = PDDR_DDP (pddr);
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\nloop carries dependency.\n"); fprintf (dump_file, "\nloop carries dependency.\n");
...@@ -528,8 +545,9 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2, ...@@ -528,8 +545,9 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (&temp, pdim, 0); ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (&temp, pdim, 0);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (temp, po); ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (temp, po);
pt = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, st1, st2, pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, st1, st2,
false, false); false, false);
pt = PDDR_DDP (pddr);
/* Extend PO and PT to have the same dimensions. */ /* Extend PO and PT to have the same dimensions. */
ppl_insert_dimensions_pointset (temp, otdim1, ttdim1); ppl_insert_dimensions_pointset (temp, otdim1, ttdim1);
...@@ -541,7 +559,8 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2, ...@@ -541,7 +559,8 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
is_empty_p = ppl_Pointset_Powerset_C_Polyhedron_is_empty (temp); is_empty_p = ppl_Pointset_Powerset_C_Polyhedron_is_empty (temp);
ppl_delete_Pointset_Powerset_C_Polyhedron (temp); ppl_delete_Pointset_Powerset_C_Polyhedron (temp);
ppl_delete_Pointset_Powerset_C_Polyhedron (pt); free_poly_ddr (pddr);
return is_empty_p; return is_empty_p;
} }
...@@ -646,8 +665,7 @@ poly_drs_may_alias_p (poly_dr_p pdr1, poly_dr_p pdr2) ...@@ -646,8 +665,7 @@ poly_drs_may_alias_p (poly_dr_p pdr1, poly_dr_p pdr2)
} }
/* Returns TRUE when the dependence polyhedron between PDR1 and /* Returns TRUE when the dependence polyhedron between PDR1 and
PDR2 represents a loop carried dependence at level LEVEL. Otherwise PDR2 represents a loop carried dependence at level LEVEL. */
return FALSE. */
static bool static bool
graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2, graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2,
...@@ -667,6 +685,7 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2, ...@@ -667,6 +685,7 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2,
graphite_dim_t ddim1 = pbb_dim_iter_domain (pbb1); graphite_dim_t ddim1 = pbb_dim_iter_domain (pbb1);
ppl_dimension_type dim; ppl_dimension_type dim;
bool empty_p; bool empty_p;
poly_ddr_p pddr;
if ((PDR_TYPE (pdr1) == PDR_READ && PDR_TYPE (pdr2) == PDR_READ) if ((PDR_TYPE (pdr1) == PDR_READ && PDR_TYPE (pdr2) == PDR_READ)
|| !poly_drs_may_alias_p (pdr1, pdr2)) || !poly_drs_may_alias_p (pdr1, pdr2))
...@@ -675,14 +694,17 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2, ...@@ -675,14 +694,17 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2,
if (sdim1 != sdim2) if (sdim1 != sdim2)
return true; return true;
po = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2, pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
true, false); true, false);
if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (po))
if (pddr_is_empty (pddr))
{ {
ppl_delete_Pointset_Powerset_C_Polyhedron (po); ppl_delete_Pointset_Powerset_C_Polyhedron (po);
return false; return false;
} }
po = PDDR_DDP (pddr);
ppl_Pointset_Powerset_C_Polyhedron_space_dimension (po, &dim); ppl_Pointset_Powerset_C_Polyhedron_space_dimension (po, &dim);
eqpp = build_pairwise_scheduling_inequality (dim, level, tdim1 + ddim1, 1); eqpp = build_pairwise_scheduling_inequality (dim, level, tdim1 + ddim1, 1);
......
...@@ -24,27 +24,31 @@ along with GCC; see the file COPYING3. If not see ...@@ -24,27 +24,31 @@ along with GCC; see the file COPYING3. If not see
extern bool graphite_legal_transform (scop_p); extern bool graphite_legal_transform (scop_p);
extern bool dependency_between_pbbs_p (poly_bb_p, poly_bb_p, int); extern bool dependency_between_pbbs_p (poly_bb_p, poly_bb_p, int);
typedef struct poly_dr_pair *poly_dr_pair_p; enum poly_dependence_kind {
unknown_dependence,
no_dependence,
has_dependence
};
typedef struct poly_dr_pair typedef struct poly_ddr
{ {
/* Source polyhedral data reference of the dependence. */ /* Source and sink data references of the dependence. */
poly_dr_p source; poly_dr_p source, sink;
/* Sink data reference of the dependence. */ /* Data dependence polyhedron. */
poly_dr_p sink;
/* Data dependence polyhedron descibing dependence
between SOURCE and SINK data references. */
ppl_Pointset_Powerset_C_Polyhedron_t ddp; ppl_Pointset_Powerset_C_Polyhedron_t ddp;
}poly_dr_pair;
enum poly_dependence_kind kind;
} *poly_ddr_p;
#define PDRP_SOURCE(PDRP) (PDR->source) #define PDDR_SOURCE(PDDR) (PDDR->source)
#define PDRP_SINK(PDRP) (PDR->sink) #define PDDR_SINK(PDDR) (PDDR->sink)
#define PDRP_DDP(PDRP) (PDR->ddp) #define PDDR_DDP(PDDR) (PDDR->ddp)
#define PDDR_KIND(PDDR) (PDDR->kind)
extern int eq_poly_dr_pair_p (const void *, const void *); extern int eq_poly_ddr_p (const void *, const void *);
extern hashval_t hash_poly_dr_pair_p (const void *); extern hashval_t hash_poly_ddr_p (const void *);
extern void free_poly_ddr (void *);
#endif #endif
...@@ -410,8 +410,8 @@ new_scop (void *region) ...@@ -410,8 +410,8 @@ new_scop (void *region)
SCOP_CONTEXT (scop) = NULL; SCOP_CONTEXT (scop) = NULL;
scop_set_region (scop, region); scop_set_region (scop, region);
SCOP_BBS (scop) = VEC_alloc (poly_bb_p, heap, 3); SCOP_BBS (scop) = VEC_alloc (poly_bb_p, heap, 3);
SCOP_ORIGINAL_PDR_PAIRS (scop) = htab_create (10, hash_poly_dr_pair_p, SCOP_ORIGINAL_PDDRS (scop) = htab_create (10, hash_poly_ddr_p,
eq_poly_dr_pair_p, free); eq_poly_ddr_p, free_poly_ddr);
return scop; return scop;
} }
...@@ -431,7 +431,7 @@ free_scop (scop_p scop) ...@@ -431,7 +431,7 @@ free_scop (scop_p scop)
if (SCOP_CONTEXT (scop)) if (SCOP_CONTEXT (scop))
ppl_delete_Pointset_Powerset_C_Polyhedron (SCOP_CONTEXT (scop)); ppl_delete_Pointset_Powerset_C_Polyhedron (SCOP_CONTEXT (scop));
htab_delete (SCOP_ORIGINAL_PDR_PAIRS (scop)); htab_delete (SCOP_ORIGINAL_PDDRS (scop));
XDELETE (scop); XDELETE (scop);
} }
......
...@@ -525,17 +525,16 @@ struct scop ...@@ -525,17 +525,16 @@ struct scop
c = 2a + b */ c = 2a + b */
ppl_Pointset_Powerset_C_Polyhedron_t context; ppl_Pointset_Powerset_C_Polyhedron_t context;
/* A hashtable of the original pairs of dependent data references. /* A hashtable of the data dependence relations for the original
For each pair of dependent data references, the dependence scattering. */
polyhedron is stored also. */ htab_t original_pddrs;
htab_t original_pdr_pairs;
}; };
#define SCOP_BBS(S) (S->bbs) #define SCOP_BBS(S) (S->bbs)
#define SCOP_REGION(S) ((sese) S->region) #define SCOP_REGION(S) ((sese) S->region)
#define SCOP_DEP_GRAPH(S) (S->dep_graph) #define SCOP_DEP_GRAPH(S) (S->dep_graph)
#define SCOP_CONTEXT(S) (S->context) #define SCOP_CONTEXT(S) (S->context)
#define SCOP_ORIGINAL_PDR_PAIRS(S) (S->original_pdr_pairs) #define SCOP_ORIGINAL_PDDRS(S) (S->original_pddrs)
extern scop_p new_scop (void *); extern scop_p new_scop (void *);
extern void free_scop (scop_p); extern void free_scop (scop_p);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment