PR middle-end/77357 - strlen of constant strings not folded
[official-gcc.git] / gcc / testsuite / gcc.dg / ipa / pr57539.c
blob514b60079293a206d1992d587d9a95d0eda42b08
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 int agnnodes (graph_t *);
95 int overlaps (nitem *, int);
96 static int
97 cmpitem (Dt_t * d, int *p1, int *p2, Dtdisc_t * disc)
100 static Dtdisc_t constr =
101 { __builtin_offsetof (nitem, val), sizeof (int), __builtin_offsetof (nitem,
102 link),
103 ((Dtmake_f) 0), ((Dtfree_f) 0), (Dtcompar_f) cmpitem, ((Dthash_f) 0), ((Dtmemory_f) 0),
104 ((Dtevent_f) 0) };
105 static int
106 distX (box * b1, box * b2)
110 static int
111 intersectY0 (nitem * p, nitem * q)
115 static int
116 intersectY (nitem * p, nitem * q)
120 static void
121 mapGraphs (graph_t * g, graph_t * cg, distfn dist)
123 node_t *n;
124 edge_t *e;
125 edge_t *ce;
126 node_t *t;
127 node_t *h;
128 nitem *tp;
129 nitem *hp;
130 int delta;
131 for (n = agfstnode (g); n; n = agnxtnode (g, n))
133 for (e = agfstout (g, n); e; e = agnxtout (g, e))
135 delta = dist (&tp->bb, &hp->bb);
136 ce = agedge (cg, t, h, ((void *) 0), 1);
137 if ((((Agedgeinfo_t *) (((Agobj_t *) (ce))->data))->minlen) < delta)
139 if ((((Agedgeinfo_t *) (((Agobj_t *) (ce))->data))->minlen) ==
140 0.0)
148 static graph_t *
149 mkNConstraintG (graph_t * g, Dt_t * list, intersectfn intersect, distfn dist)
151 nitem *p;
152 nitem *nxp;
153 edge_t *e;
154 graph_t *cg = agopen ("cg", Agstrictdirected, ((Agdisc_t *) 0));
155 for (p = (nitem *) dtflatten (list); p;
156 p = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right))
158 for (nxp = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right); nxp;
159 nxp = (nitem *) (((Dtlink_t *) ((Dtlink_t *) nxp))->right))
161 if (intersect (p, nxp))
163 e = agedge (cg, p->cnode, nxp->cnode, ((void *) 0), 1);
165 }} for (p = (nitem *) dtflatten (list); p;
166 p = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right))
171 static graph_t *
172 mkConstraintG (graph_t * g, Dt_t * list, intersectfn intersect, distfn dist)
174 graph_t *vg;
175 graph_t *cg = agopen ("cg", Agstrictdirected, ((Agdisc_t *) 0));
176 mapGraphs (vg, cg, dist);
179 static void
180 constrainX (graph_t * g, nitem * nlist, int nnodes, intersectfn ifn,
181 int ortho)
183 Dt_t *list = dtopen (&constr, Dtobag);
184 nitem *p = nlist;
185 graph_t *cg;
186 int i;
187 for (i = 0; i < nnodes; i++)
189 (*(((Dt_t *) (list))->searchf)) ((list), (void *) (p), 0000001);
190 p++;
191 } if (ortho)
192 cg = mkConstraintG (g, list, ifn, distX);
193 else
194 cg = mkNConstraintG (g, list, ifn, distX);
198 cAdjust (graph_t * g, int mode)
200 int ret, i, nnodes = agnnodes (g);
201 nitem *nlist = (nitem *) gmalloc ((nnodes) * sizeof (nitem));
202 node_t *n;
203 for (n = agfstnode (g); n; n = agnxtnode (g, n))
206 if (overlaps (nlist, nnodes))
208 switch ((adjust_mode) mode)
210 case AM_ORTHOXY:
211 constrainX (g, nlist, nnodes, intersectY, 1);
212 case AM_ORTHO:
213 constrainX (g, nlist, nnodes, intersectY0, 1);
214 constrainX (g, nlist, nnodes, intersectY, 1);
215 case AM_PORTHO:
216 default:
217 constrainX (g, nlist, nnodes, intersectY0, 0);