2013-10-21 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.dg / ipa / pr57539.c
blobe02018eb872135f1f16169e8288b9f6dd60aaf3f
1 /* { dg-do compile } */
2 /* { dg-options "-O3" } */
4 typedef long unsigned int size_t;
5 typedef struct
8 box;
9 typedef struct
12 textpara_t;
13 typedef struct _dtlink_s Dtlink_t;
14 typedef struct _dtdisc_s Dtdisc_t;
15 typedef struct _dtmethod_s Dtmethod_t;
16 typedef struct _dt_s Dt_t;
17 typedef void *(*Dtmemory_f) (Dt_t *, void *, size_t, Dtdisc_t *);
18 typedef void *(*Dtsearch_f) (Dt_t *, void *, int);
19 typedef void *(*Dtmake_f) (Dt_t *, void *, Dtdisc_t *);
20 typedef void (*Dtfree_f) (Dt_t *, void *, Dtdisc_t *);
21 typedef int (*Dtcompar_f) (Dt_t *, void *, void *, Dtdisc_t *);
22 typedef unsigned int (*Dthash_f) (Dt_t *, void *, Dtdisc_t *);
23 typedef int (*Dtevent_f) (Dt_t *, int, void *, Dtdisc_t *);
24 struct _dtlink_s
26 Dtlink_t *right;
28 struct _dtdisc_s
30 int key;
31 int size;
32 int link;
33 Dtmake_f makef;
34 Dtfree_f freef;
35 Dtcompar_f comparf;
36 Dthash_f hashf;
37 Dtmemory_f memoryf;
38 Dtevent_f eventf;
40 struct _dt_s
42 Dtsearch_f searchf;
44 extern Dtmethod_t *Dtobag;
45 extern Dt_t *dtopen (Dtdisc_t *, Dtmethod_t *);
46 extern Dtlink_t *dtflatten (Dt_t *);
47 typedef struct Agobj_s Agobj_t;
48 typedef struct Agraph_s Agraph_t;
49 typedef struct Agnode_s Agnode_t;
50 typedef struct Agedge_s Agedge_t;
51 typedef struct Agdesc_s Agdesc_t;
52 typedef struct Agdisc_s Agdisc_t;
53 typedef struct Agrec_s Agrec_t;
54 struct Agobj_s
56 Agrec_t *data;
58 struct Agdesc_s
61 extern Agraph_t *agopen (char *name, Agdesc_t desc, Agdisc_t * disc);
62 extern Agnode_t *agfstnode (Agraph_t * g);
63 extern Agnode_t *agnxtnode (Agraph_t * g, Agnode_t * n);
64 extern Agedge_t *agedge (Agraph_t * g, Agnode_t * t, Agnode_t * h, char *name,
65 int createflag);
66 extern Agedge_t *agfstout (Agraph_t * g, Agnode_t * n);
67 extern Agedge_t *agnxtout (Agraph_t * g, Agedge_t * e);
68 extern Agdesc_t Agdirected, Agstrictdirected, Agundirected,
69 Agstrictundirected;
70 typedef struct Agraph_s graph_t;
71 typedef struct Agnode_s node_t;
72 typedef struct Agedge_s edge_t;
73 typedef union inside_t
75 unsigned short minlen;
77 Agedgeinfo_t;
78 extern void *gmalloc (size_t);
79 typedef enum
80 { AM_NONE, AM_VOR, AM_SCALE, AM_NSCALE, AM_SCALEXY, AM_PUSH, AM_PUSHPULL,
81 AM_ORTHO, AM_ORTHO_YX, AM_ORTHOXY, AM_ORTHOYX, AM_PORTHO, AM_PORTHO_YX,
82 AM_PORTHOXY, AM_PORTHOYX, AM_COMPRESS, AM_VPSC, AM_IPSEP, AM_PRISM }
83 adjust_mode;
84 typedef struct nitem
86 Dtlink_t link;
87 int val;
88 node_t *cnode;
89 box bb;
91 nitem;
92 typedef int (*distfn) (box *, box *);
93 typedef int (*intersectfn) (nitem *, nitem *);
94 static int
95 cmpitem (Dt_t * d, int *p1, int *p2, Dtdisc_t * disc)
98 static Dtdisc_t constr =
99 { __builtin_offsetof (nitem, val), sizeof (int), __builtin_offsetof (nitem,
100 link),
101 ((Dtmake_f) 0), ((Dtfree_f) 0), (Dtcompar_f) cmpitem, ((Dthash_f) 0), ((Dtmemory_f) 0),
102 ((Dtevent_f) 0) };
103 static int
104 distX (box * b1, box * b2)
108 static int
109 intersectY0 (nitem * p, nitem * q)
113 static int
114 intersectY (nitem * p, nitem * q)
118 static void
119 mapGraphs (graph_t * g, graph_t * cg, distfn dist)
121 node_t *n;
122 edge_t *e;
123 edge_t *ce;
124 node_t *t;
125 node_t *h;
126 nitem *tp;
127 nitem *hp;
128 int delta;
129 for (n = agfstnode (g); n; n = agnxtnode (g, n))
131 for (e = agfstout (g, n); e; e = agnxtout (g, e))
133 delta = dist (&tp->bb, &hp->bb);
134 ce = agedge (cg, t, h, ((void *) 0), 1);
135 if ((((Agedgeinfo_t *) (((Agobj_t *) (ce))->data))->minlen) < delta)
137 if ((((Agedgeinfo_t *) (((Agobj_t *) (ce))->data))->minlen) ==
138 0.0)
146 static graph_t *
147 mkNConstraintG (graph_t * g, Dt_t * list, intersectfn intersect, distfn dist)
149 nitem *p;
150 nitem *nxp;
151 edge_t *e;
152 graph_t *cg = agopen ("cg", Agstrictdirected, ((Agdisc_t *) 0));
153 for (p = (nitem *) dtflatten (list); p;
154 p = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right))
156 for (nxp = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right); nxp;
157 nxp = (nitem *) (((Dtlink_t *) ((Dtlink_t *) nxp))->right))
159 if (intersect (p, nxp))
161 e = agedge (cg, p->cnode, nxp->cnode, ((void *) 0), 1);
163 }} for (p = (nitem *) dtflatten (list); p;
164 p = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right))
169 static graph_t *
170 mkConstraintG (graph_t * g, Dt_t * list, intersectfn intersect, distfn dist)
172 graph_t *vg;
173 graph_t *cg = agopen ("cg", Agstrictdirected, ((Agdisc_t *) 0));
174 mapGraphs (vg, cg, dist);
177 static void
178 constrainX (graph_t * g, nitem * nlist, int nnodes, intersectfn ifn,
179 int ortho)
181 Dt_t *list = dtopen (&constr, Dtobag);
182 nitem *p = nlist;
183 graph_t *cg;
184 int i;
185 for (i = 0; i < nnodes; i++)
187 (*(((Dt_t *) (list))->searchf)) ((list), (void *) (p), 0000001);
188 p++;
189 } if (ortho)
190 cg = mkConstraintG (g, list, ifn, distX);
191 else
192 cg = mkNConstraintG (g, list, ifn, distX);
196 cAdjust (graph_t * g, int mode)
198 int ret, i, nnodes = agnnodes (g);
199 nitem *nlist = (nitem *) gmalloc ((nnodes) * sizeof (nitem));
200 node_t *n;
201 for (n = agfstnode (g); n; n = agnxtnode (g, n))
204 if (overlaps (nlist, nnodes))
206 switch ((adjust_mode) mode)
208 case AM_ORTHOXY:
209 constrainX (g, nlist, nnodes, intersectY, 1);
210 case AM_ORTHO:
211 constrainX (g, nlist, nnodes, intersectY0, 1);
212 constrainX (g, nlist, nnodes, intersectY, 1);
213 case AM_PORTHO:
214 default:
215 constrainX (g, nlist, nnodes, intersectY0, 0);