PIPS
sc_intersection.c File Reference
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "linear_assert.h"
#include "boolean.h"
#include "arithmetique.h"
#include "vecteur.h"
#include "contrainte.h"
#include "sc.h"
+ Include dependency graph for sc_intersection.c:

Go to the source code of this file.

Functions

Psysteme sc_fusion (Psysteme s1, Psysteme s2)
 package sc More...
 
Psysteme sc_intersection (Psysteme s1, Psysteme s2, Psysteme s3)
 Psysteme sc_intersection(Psysteme s1, Psysteme s2, Psysteme s3): calcul d'un systeme de contraintes s1 representant l'intersection des polyedres convexes definis par les systemes de contraintes s2 et s3. More...
 
Psysteme sc_append (Psysteme s1, Psysteme s2)
 Psysteme sc_append(Psysteme s1, Psysteme s2): calcul de l'intersection des polyedres definis par s1 et par s2 sous forme d'un systeme de contraintes et renvoi de s1. More...
 
Psysteme sc_safe_intersection (Psysteme s1, Psysteme s2, Psysteme s3)
 Psysteme sc_safe_intersection(Psysteme s1, Psysteme s2, Psysteme s3) input : output : calcul d'un systeme de contraintes s1 representant l'intersection des polyedres convexes definis par les systemes de contraintes s2 et s3. More...
 
Psysteme sc_safe_append (Psysteme s1, Psysteme s2)
 Psysteme sc_safe_append(Psysteme s1, Psysteme s2) input : output : calcul de l'intersection des polyedres definis par s1 et par s2 sous forme d'un systeme de contraintes et renvoi de s1. More...
 
bool sc_intersection_empty_p_ofl (Psysteme ps1, Psysteme ps2)
 bool sc_intersection_empty_p_ofl(ps1, ps2) input : two polyhedra output : true if their intersection is empty, false otherwise. More...
 
Psysteme extract_common_syst (Psysteme s1, Psysteme s2)
 returns the common subsystem if appropriate... More...
 

Function Documentation

◆ extract_common_syst()

Psysteme extract_common_syst ( Psysteme  s1,
Psysteme  s2 
)

returns the common subsystem if appropriate...

s1 and s2 are modified accordingly.

Definition at line 335 of file sc_intersection.c.

336 {
337  Pcontrainte
338  e = extract_common_constraints(&s1->egalites, &s2->egalites, true),
339  i = extract_common_constraints(&s1->inegalites, &s2->inegalites, false);
340 
341  sc_fix(s1);
342  sc_fix(s2);
343 
344  return sc_make(e, i);
345 }
Pcontrainte extract_common_constraints(Pcontrainte *pc1, Pcontrainte *pc2, bool eq)
common (simply equal) contraints are extracted, whether equalities or inequalities.
Definition: binaires.c:285
Psysteme sc_make(Pcontrainte leg, Pcontrainte lineg)
Psysteme sc_make(Pcontrainte leg, Pcontrainte lineg): allocation et initialisation d'un systeme d'equ...
Definition: sc.c:78
void sc_fix(Psysteme s)
fix system s for coherency of the base and number of things.
Definition: sc_alloc.c:141
s1
Definition: set.c:247
Pcontrainte inegalites
Definition: sc-local.h:71
Pcontrainte egalites
Definition: sc-local.h:70

References Ssysteme::egalites, extract_common_constraints(), Ssysteme::inegalites, s1, sc_fix(), and sc_make().

Referenced by sc_cute_convex_hull().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sc_append()

Psysteme sc_append ( Psysteme  s1,
Psysteme  s2 
)

Psysteme sc_append(Psysteme s1, Psysteme s2): calcul de l'intersection des polyedres definis par s1 et par s2 sous forme d'un systeme de contraintes et renvoi de s1.

s1 := intersection(s1,s2) return s1;

Attention, SC_RN est un element neutre et SC_EMPTY un element absorbant. SC_UNDEFINED devrait aussi etre teste proprement.

Modifications:

  • mise a jour de la base de s1 (FI, 2/1/90)

ne rien faire et renvoyer s2

ne rien faire et renvoyer s1

ne rien faire et renvoyer s1

on ne devrait jamais passer la dans le futur proche car SC_EMPTY==SC_RN

desallouer s1 et renvoyer SC_EMPTY

ni s1 ni s2 ne sont des systemes particuliers

update s1 basis with s2's vectors

Definition at line 157 of file sc_intersection.c.

160 {
161  Pcontrainte c;
162 
163  if(SC_RN_P(s1))
164  /* ne rien faire et renvoyer s2 */
165  s1 = sc_copy(s2);
166  else if(SC_RN_P(s2))
167  /* ne rien faire et renvoyer s1 */
168  ;
169  else if(SC_EMPTY_P(s1)) {
170  /* ne rien faire et renvoyer s1 */
171  /* on ne devrait jamais passer la dans le futur proche car
172  SC_EMPTY==SC_RN */
173  assert(false);
174  ;
175  }
176  else if(SC_EMPTY_P(s2)) {
177  /* desallouer s1 et renvoyer SC_EMPTY */
178  assert(false);
179  sc_rm(s1);
180  s1 = SC_EMPTY;
181  }
182  else {
183 
184  /* ni s1 ni s2 ne sont des systemes particuliers */
185  for(c = sc_egalites(s2); c != (Pcontrainte) NULL; c = c->succ) {
187  }
188  for(c = sc_inegalites(s2); c != (Pcontrainte) NULL; c = c->succ) {
190  }
191 
192  /* update s1 basis with s2's vectors */
193  base_append(&s1->base, s2->base);
194  s1->dimension = vect_size(s1->base);
195  }
196 
197  return s1;
198 }
void base_append(Pbase *pb1, Pbase b2)
appends b2 to b1.
Definition: base.c:384
struct Scontrainte * Pcontrainte
Pcontrainte contrainte_copy(Pcontrainte c_in)
Have a look at contrainte_dup and contraintes_dup which reverse the order of the list This copy versi...
Definition: alloc.c:254
int vect_size(Pvecteur v)
package vecteur - reductions
Definition: reductions.c:47
#define assert(ex)
Definition: newgen_assert.h:41
void sc_rm(Psysteme ps)
void sc_rm(Psysteme ps): liberation de l'espace memoire occupe par le systeme de contraintes ps;
Definition: sc_alloc.c:277
void sc_add_egalite(Psysteme p, Pcontrainte e)
void sc_add_egalite(Psysteme p, Pcontrainte e): macro ajoutant une egalite e a un systeme p; la base ...
Definition: sc_alloc.c:389
void sc_add_inegalite(Psysteme p, Pcontrainte i)
void sc_add_inegalite(Psysteme p, Pcontrainte i): macro ajoutant une inegalite i a un systeme p; la b...
Definition: sc_alloc.c:406
Psysteme sc_copy(Psysteme ps)
Psysteme sc_copy(Psysteme ps): duplication d'un systeme (allocation et copie complete des champs sans...
Definition: sc_alloc.c:230
struct Scontrainte * succ
Pbase base
Definition: sc-local.h:75

References assert, Ssysteme::base, base_append(), contrainte_copy(), s1, sc_add_egalite(), sc_add_inegalite(), sc_copy(), sc_rm(), Scontrainte::succ, and vect_size().

Referenced by adg_compact_quast(), adg_dataflowgraph(), adg_dataflowgraph_with_extremities(), adg_get_conjonctions(), adg_make_disjunctions(), adg_suppress_2nd_in_1st_ps(), adg_update_dfg(), algorithm_row_echelon_generic(), analyze_quast(), build_list_of_min(), build_third_comb(), build_third_subcomb(), compatible_pc_p(), dataflows_on_reference(), dj_intersection_ofl_ctrl(), edge_weight(), generate_distributed_io_system(), generate_remapping_system(), generate_shared_io_system(), generate_system_for_distributed_variable(), get_unsatisfied_system(), include_results_in_bdt(), interlaced_basic_workchunk_regions_p(), intersect(), make_causal_external(), make_causal_internal(), make_movements_loop_body_wp65(), make_scanning_over_one_tile(), make_scanning_over_tiles(), pa_intersect_system(), parallel_tiling(), prepare_reindexing(), recompute_loop_transformer(), sc_image_computation(), sc_intersection(), sc_projection_concat_proj_on_variables(), search_scc_bdt(), separate_variables(), separate_variables_2(), standard_whileloop_to_transformer(), suppress_sc_in_sc(), tiling_transformation(), transformer_combine(), transformer_general_intersection(), and transformer_intersect_range_with_domain().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sc_fusion()

Psysteme sc_fusion ( Psysteme  s1,
Psysteme  s2 
)

package sc

Psysteme sc_fusion(Psysteme s1, Psysteme s2): fusion de deux systemes de contraintes afin d'obtenir un systeme contenant les egalites et les inegalites des deux systemes donnes; aucune elimination de redondance n'est effectuee.

attention: les deux systemes donnes, s1 et s2, sont detruits.

Note: sc_fusion() est considere comme obsolete; voir sc_intersection() et sc_append().

The base is not updated.

Definition at line 54 of file sc_intersection.c.

55 {
57 
58  if (SC_UNDEFINED_P(s1))
59  return s2;
60 
61  if (sc_rn_p(s1)) {
62  free(s1);
63  return s2;
64  }
65 
66  if (SC_UNDEFINED_P(s2))
67  return s1;
68 
69  if (sc_rn_p(s2)) {
70  free(s2);
71  return s1;
72  }
73 
74  if (s1->nb_eq != 0)
75  {
76  for (eq = s1->egalites;
77  eq->succ != (Pcontrainte) NULL;
78  eq = eq->succ)
79  ;
80  eq->succ = s2->egalites,
81  s1->nb_eq += s2->nb_eq;
82  }
83  else
84  s1->egalites = s2->egalites,
85  s1->nb_eq = s2->nb_eq;
86 
87  if (s1->nb_ineq != 0)
88  {
89  for (eq = s1->inegalites;
90  eq->succ != (Pcontrainte)NULL;
91  eq = eq->succ)
92  ;
93  eq->succ = s2->inegalites,
94  s1->nb_ineq += s2->nb_ineq;
95  }
96  else
97  s1->inegalites = s2->inegalites,
98  s1->nb_ineq = s2->nb_ineq;
99 
100  s2->inegalites = NULL;
101  s2->egalites = NULL;
102  sc_rm(s2);
103 
104  return(s1);
105 }
void free(void *)
bool sc_rn_p(Psysteme sc)
bool sc_rn_p(Psysteme sc): check if the set associated to sc is the whole space, rn
Definition: sc_alloc.c:369
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108
int nb_ineq
Definition: sc-local.h:73
int nb_eq
Definition: sc-local.h:72

References Ssysteme::egalites, eq, free(), Ssysteme::inegalites, Ssysteme::nb_eq, Ssysteme::nb_ineq, s1, sc_rm(), sc_rn_p(), and Scontrainte::succ.

Referenced by build_and_test_dependence_context(), new_loop_bound(), and sc_cute_convex_hull().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sc_intersection()

Psysteme sc_intersection ( Psysteme  s1,
Psysteme  s2,
Psysteme  s3 
)

Psysteme sc_intersection(Psysteme s1, Psysteme s2, Psysteme s3): calcul d'un systeme de contraintes s1 representant l'intersection des polyedres convexes definis par les systemes de contraintes s2 et s3.

s1 := intersection(s2,s3); return s1;

Les listes d'egalites et d'inegalites de s2 et de s3 sont simplement concatenees. Aucun test de redondance n'est effectuee. Cependant, les valeurs particulieres SC_RN (element neutre) et SC_EMPTY (element absorbant) sont traitees de maniere a donner des resultats corrects.

Attention: le systeme s1 est d'abord vide de ses egalites et inegalites s'il est different de s2 et de s3; sinon, les modifications sont faites en place, sur s2 ou sur s3.

on pourrait se contenter de desallouer les deux listes d'egalites et d'inegalites a condition d'avoir un sc_copy()

Definition at line 124 of file sc_intersection.c.

125 {
126  if(s1==s2) {
127  s1 = sc_append(s2,s3);
128  }
129  else if(s1==s3) {
130  s1 = sc_append(s3,s2);
131  }
132  else {
133  if(!SC_EMPTY_P(s1)) {
134  /* on pourrait se contenter de desallouer les deux listes
135  d'egalites et d'inegalites a condition d'avoir un sc_copy() */
136  sc_rm(s1);
137  }
138  s1 = sc_copy(s2);
139  s1 = sc_append(s1,s3);
140  }
141  return(s1);
142 }
Psysteme sc_append(Psysteme s1, Psysteme s2)
Psysteme sc_append(Psysteme s1, Psysteme s2): calcul de l'intersection des polyedres definis par s1 e...

References s1, sc_append(), sc_copy(), and sc_rm().

Referenced by broadcast_of_dataflow(), contexts_mapping_of_statement(), effects_to_dma(), movement_computation(), parallel_tiling(), and plc_make_distance().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sc_intersection_empty_p_ofl()

bool sc_intersection_empty_p_ofl ( Psysteme  ps1,
Psysteme  ps2 
)

bool sc_intersection_empty_p_ofl(ps1, ps2) input : two polyhedra output : true if their intersection is empty, false otherwise.

modifies : nothing comment : calls sc_faisabilite_ofl in order to trap overflow errors BC, 1994.

Definition at line 316 of file sc_intersection.c.

318 {
319  Psysteme ps = SC_UNDEFINED;
320  bool result;
321  ps1 = sc_copy(ps1);
322  ps2 = sc_copy(ps2);
323  ps = sc_safe_intersection(ps,ps1,ps2);
324  result = !(sc_faisabilite_ofl(ps));
325  sc_rm(ps1);
326  sc_rm(ps2);
327  sc_rm(ps);
328  ps1 = ps2 = ps = NULL;
329  return result;
330 }
Psysteme sc_safe_intersection(Psysteme s1, Psysteme s2, Psysteme s3)
Psysteme sc_safe_intersection(Psysteme s1, Psysteme s2, Psysteme s3) input : output : calcul d'un sys...

References sc_copy(), sc_rm(), and sc_safe_intersection().

Referenced by region_sup_difference().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sc_safe_append()

Psysteme sc_safe_append ( Psysteme  s1,
Psysteme  s2 
)

Psysteme sc_safe_append(Psysteme s1, Psysteme s2) input : output : calcul de l'intersection des polyedres definis par s1 et par s2 sous forme d'un systeme de contraintes et renvoi de s1.

s1 := intersection(s1,s2) return s1; modifies : s1. comment : sc_rn et sc_empty sont traite's de maniere particuliere pour tenir compte de leur se'mantique.

ne rien faire et renvoyer s2 apres mise a jour de la base

ne rien faire et renvoyer s1 apres mise a jour de la base

ne rien faire et renvoyer s1 apres mise a jour de la base

ne rien faire et renvoyer s2 apres mise a jour de la base

ni s1 ni s2 ne sont des systemes particuliers : on ajoute a` s1 les e'galite's et ine'galite's de s2

update s1 basis with s2's vectors

Definition at line 259 of file sc_intersection.c.

262 {
263  Pcontrainte c;
264  Pbase b;
265  Pvecteur coord;
266 
267  assert(!SC_UNDEFINED_P(s1) && !SC_UNDEFINED_P(s2));
268 
269  if(sc_rn_p(s1)) {
270  /* ne rien faire et renvoyer s2 apre`s mise a` jour de la base */
271  sc_rm(s1);
272  s1 = sc_copy(s2);
273  }
274  else if(sc_rn_p(s2))
275  /* ne rien faire et renvoyer s1 apre`s mise a` jour de la base */
276  ;
277  else if(sc_empty_p(s1))
278  /* ne rien faire et renvoyer s1 apre`s mise a` jour de la base */
279  ;
280  else if(sc_empty_p(s2)) {
281  /* ne rien faire et renvoyer s2 apre`s mise a` jour de la base */
282  sc_rm(s1);
283  s1 = sc_copy(s2);
284  }
285  else {
286  /* ni s1 ni s2 ne sont des systemes particuliers :
287  * on ajoute a` s1 les e'galite's et ine'galite's de s2 */
288  for(c = sc_egalites(s2); c != (Pcontrainte) NULL; c = c->succ) {
290  }
291  for(c = sc_inegalites(s2); c != (Pcontrainte) NULL; c = c->succ) {
293  }
294  }
295 
296  /* update s1 basis with s2's vectors */
297  b = s1->base;
298  for(coord = s2->base; !VECTEUR_NUL_P(coord); coord = coord->succ) {
299  Variable v = vecteur_var(coord);
300  b = base_add_variable(b, v);
301  }
302  s1->base = b;
303  s1->dimension = vect_size(b);
304 
305  return(s1);
306 }
Pbase base_add_variable(Pbase b, Variable var)
Pbase base_add_variable(Pbase b, Variable v): add variable v as a new dimension to basis b at the end...
Definition: base.c:88
bool sc_empty_p(Psysteme sc)
bool sc_empty_p(Psysteme sc): check if the set associated to sc is the constant sc_empty or not.
Definition: sc_alloc.c:350
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
struct Svecteur * succ
Definition: vecteur-local.h:92
#define vecteur_var(v)
#define VECTEUR_NUL_P(v)
void * Variable
arithmetique is a requirement for vecteur, but I do not want to inforce it in all pips files....
Definition: vecteur-local.h:60

References assert, Ssysteme::base, base_add_variable(), contrainte_copy(), s1, sc_add_egalite(), sc_add_inegalite(), sc_copy(), sc_empty_p(), sc_rm(), sc_rn_p(), Scontrainte::succ, Svecteur::succ, vect_size(), VECTEUR_NUL_P, and vecteur_var.

Referenced by array_must_fully_written_by_regions_p(), do_array_expansion(), loop_regions_normalize(), pa_path_to_few_disjunct_ofl_ctrl(), pa_reduce_simple_complement(), region_translation(), sc_safe_intersection(), sc_strong_normalize2(), and sc_strong_normalize_and_check_feasibility2().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sc_safe_intersection()

Psysteme sc_safe_intersection ( Psysteme  s1,
Psysteme  s2,
Psysteme  s3 
)

Psysteme sc_safe_intersection(Psysteme s1, Psysteme s2, Psysteme s3) input : output : calcul d'un systeme de contraintes s1 representant l'intersection des polyedres convexes definis par les systemes de contraintes s2 et s3.

s1 := intersection(s2,s3); return s1;

modifies : s1 is modified if it is not undefined. comment :
calcul d'un systeme de contraintes s1 representant l'intersection des polyedres convexes definis par les systemes de contraintes s2 et s3.

Les listes d'egalites et d'inegalites de s2 et de s3 sont simplement concatenees. Aucun test de redondance n'est effectuee. Cependant, les valeurs particulieres sc_rn (element neutre) et sc_empty (element absorbant) sont traitees de maniere a donner des resultats corrects ( different de sc_intercestion).

Attention: le systeme s1 est d'abord vide de ses egalites et inegalites s'il est different de s2 et de s3; sinon, les modifications sont faites en place, sur s2 ou sur s3.

on pourrait se contenter de desallouer les deux listes d'egalites et d'inegalites a condition d'avoir un sc_copy()

Definition at line 224 of file sc_intersection.c.

228 {
229  if(s1==s2) {
230  s1 = sc_safe_append(s2,s3);
231  }
232  else if(s1==s3) {
233  s1 = sc_safe_append(s3,s2);
234  }
235  else {
236  if(!SC_UNDEFINED_P(s1)) {
237  /* on pourrait se contenter de desallouer les deux listes
238  d'egalites et d'inegalites a condition d'avoir un sc_copy() */
239  sc_rm(s1);
240  }
241  s1 = sc_copy(s2);
242  s1 = sc_safe_append(s1,s3);
243  }
244  return(s1);
245 }
Psysteme sc_safe_append(Psysteme s1, Psysteme s2)
Psysteme sc_safe_append(Psysteme s1, Psysteme s2) input : output : calcul de l'intersection des polye...

References s1, sc_copy(), sc_rm(), and sc_safe_append().

Referenced by algorithm_tiling(), and sc_intersection_empty_p_ofl().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: