xref: /dflybsd-src/contrib/gcc-4.7/gcc/sel-sched-dump.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Instruction scheduling pass.   Log dumping infrastructure.
2*e4b17023SJohn Marino    Copyright (C) 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
3*e4b17023SJohn Marino 
4*e4b17023SJohn Marino This file is part of GCC.
5*e4b17023SJohn Marino 
6*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
7*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
8*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
9*e4b17023SJohn Marino version.
10*e4b17023SJohn Marino 
11*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*e4b17023SJohn Marino for more details.
15*e4b17023SJohn Marino 
16*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
17*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
18*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
19*e4b17023SJohn Marino 
20*e4b17023SJohn Marino #include "config.h"
21*e4b17023SJohn Marino #include "system.h"
22*e4b17023SJohn Marino #include "coretypes.h"
23*e4b17023SJohn Marino #include "tm.h"
24*e4b17023SJohn Marino #include "diagnostic-core.h"
25*e4b17023SJohn Marino #include "rtl.h"
26*e4b17023SJohn Marino #include "tm_p.h"
27*e4b17023SJohn Marino #include "hard-reg-set.h"
28*e4b17023SJohn Marino #include "regs.h"
29*e4b17023SJohn Marino #include "function.h"
30*e4b17023SJohn Marino #include "flags.h"
31*e4b17023SJohn Marino #include "insn-config.h"
32*e4b17023SJohn Marino #include "insn-attr.h"
33*e4b17023SJohn Marino #include "params.h"
34*e4b17023SJohn Marino #include "output.h"
35*e4b17023SJohn Marino #include "basic-block.h"
36*e4b17023SJohn Marino #include "cselib.h"
37*e4b17023SJohn Marino #include "target.h"
38*e4b17023SJohn Marino 
39*e4b17023SJohn Marino #ifdef INSN_SCHEDULING
40*e4b17023SJohn Marino #include "sel-sched-ir.h"
41*e4b17023SJohn Marino #include "sel-sched-dump.h"
42*e4b17023SJohn Marino 
43*e4b17023SJohn Marino 
44*e4b17023SJohn Marino /* These variables control high-level pretty printing.  */
45*e4b17023SJohn Marino static int sel_dump_cfg_flags = SEL_DUMP_CFG_FLAGS;
46*e4b17023SJohn Marino static int sel_debug_cfg_flags = SEL_DUMP_CFG_FLAGS;
47*e4b17023SJohn Marino 
48*e4b17023SJohn Marino /* True when a cfg should be dumped.  */
49*e4b17023SJohn Marino static bool sel_dump_cfg_p;
50*e4b17023SJohn Marino 
51*e4b17023SJohn Marino /* Variables that are used to build the cfg dump file name.  */
52*e4b17023SJohn Marino static const char * const sel_debug_cfg_root = "./";
53*e4b17023SJohn Marino static const char * const sel_debug_cfg_root_postfix_default = "";
54*e4b17023SJohn Marino static const char *sel_debug_cfg_root_postfix = "";
55*e4b17023SJohn Marino static int sel_dump_cfg_fileno = -1;
56*e4b17023SJohn Marino static int sel_debug_cfg_fileno = -1;
57*e4b17023SJohn Marino 
58*e4b17023SJohn Marino /* When this flag is on, we are dumping to the .dot file.
59*e4b17023SJohn Marino    When it is off, we are dumping to log.
60*e4b17023SJohn Marino    This is useful to differentiate formatting between log and .dot
61*e4b17023SJohn Marino    files.  */
62*e4b17023SJohn Marino bool sched_dump_to_dot_p = false;
63*e4b17023SJohn Marino 
64*e4b17023SJohn Marino /* Controls how insns from a fence list should be dumped.  */
65*e4b17023SJohn Marino static int dump_flist_insn_flags = (DUMP_INSN_UID | DUMP_INSN_BBN
66*e4b17023SJohn Marino                                     | DUMP_INSN_SEQNO);
67*e4b17023SJohn Marino 
68*e4b17023SJohn Marino 
69*e4b17023SJohn Marino /* The variable used to hold the value of sched_dump when temporarily
70*e4b17023SJohn Marino    switching dump output to the other source, e.g. the .dot file.  */
71*e4b17023SJohn Marino static FILE *saved_sched_dump = NULL;
72*e4b17023SJohn Marino 
73*e4b17023SJohn Marino /* Switch sched_dump to TO.  It must not be called twice.  */
74*e4b17023SJohn Marino static void
switch_dump(FILE * to)75*e4b17023SJohn Marino switch_dump (FILE *to)
76*e4b17023SJohn Marino {
77*e4b17023SJohn Marino   gcc_assert (saved_sched_dump == NULL);
78*e4b17023SJohn Marino 
79*e4b17023SJohn Marino   saved_sched_dump = sched_dump;
80*e4b17023SJohn Marino   sched_dump = to;
81*e4b17023SJohn Marino }
82*e4b17023SJohn Marino 
83*e4b17023SJohn Marino /* Restore previously switched dump.  */
84*e4b17023SJohn Marino static void
restore_dump(void)85*e4b17023SJohn Marino restore_dump (void)
86*e4b17023SJohn Marino {
87*e4b17023SJohn Marino   sched_dump = saved_sched_dump;
88*e4b17023SJohn Marino   saved_sched_dump = NULL;
89*e4b17023SJohn Marino }
90*e4b17023SJohn Marino 
91*e4b17023SJohn Marino 
92*e4b17023SJohn Marino /* Functions for dumping instructions, av sets, and exprs.  */
93*e4b17023SJohn Marino 
94*e4b17023SJohn Marino /* Default flags for dumping insns.  */
95*e4b17023SJohn Marino static int dump_insn_rtx_flags = DUMP_INSN_RTX_PATTERN;
96*e4b17023SJohn Marino 
97*e4b17023SJohn Marino /* Default flags for dumping vinsns.  */
98*e4b17023SJohn Marino static int dump_vinsn_flags = (DUMP_VINSN_INSN_RTX | DUMP_VINSN_TYPE
99*e4b17023SJohn Marino 			       | DUMP_VINSN_COUNT);
100*e4b17023SJohn Marino 
101*e4b17023SJohn Marino /* Default flags for dumping expressions.  */
102*e4b17023SJohn Marino static int dump_expr_flags = DUMP_EXPR_ALL;
103*e4b17023SJohn Marino 
104*e4b17023SJohn Marino /* Default flags for dumping insns when debugging.  */
105*e4b17023SJohn Marino static int debug_insn_rtx_flags = DUMP_INSN_RTX_ALL;
106*e4b17023SJohn Marino 
107*e4b17023SJohn Marino /* Default flags for dumping vinsns when debugging.  */
108*e4b17023SJohn Marino static int debug_vinsn_flags = DUMP_VINSN_ALL;
109*e4b17023SJohn Marino 
110*e4b17023SJohn Marino /* Default flags for dumping expressions when debugging.  */
111*e4b17023SJohn Marino static int debug_expr_flags = DUMP_EXPR_ALL;
112*e4b17023SJohn Marino 
113*e4b17023SJohn Marino /* Controls how an insn from stream should be dumped when debugging.  */
114*e4b17023SJohn Marino static int debug_insn_flags = DUMP_INSN_ALL;
115*e4b17023SJohn Marino 
116*e4b17023SJohn Marino /* Print an rtx X.  */
117*e4b17023SJohn Marino void
sel_print_rtl(rtx x)118*e4b17023SJohn Marino sel_print_rtl (rtx x)
119*e4b17023SJohn Marino {
120*e4b17023SJohn Marino   print_rtl_single (sched_dump, x);
121*e4b17023SJohn Marino }
122*e4b17023SJohn Marino 
123*e4b17023SJohn Marino /* Dump insn INSN honoring FLAGS.  */
124*e4b17023SJohn Marino void
dump_insn_rtx_1(rtx insn,int flags)125*e4b17023SJohn Marino dump_insn_rtx_1 (rtx insn, int flags)
126*e4b17023SJohn Marino {
127*e4b17023SJohn Marino   int all;
128*e4b17023SJohn Marino 
129*e4b17023SJohn Marino   /* flags == -1 also means dumping all.  */
130*e4b17023SJohn Marino   all = (flags & 1);;
131*e4b17023SJohn Marino   if (all)
132*e4b17023SJohn Marino     flags |= DUMP_INSN_RTX_ALL;
133*e4b17023SJohn Marino 
134*e4b17023SJohn Marino   sel_print ("(");
135*e4b17023SJohn Marino 
136*e4b17023SJohn Marino   if (flags & DUMP_INSN_RTX_UID)
137*e4b17023SJohn Marino     sel_print ("%d;", INSN_UID (insn));
138*e4b17023SJohn Marino 
139*e4b17023SJohn Marino   if (flags & DUMP_INSN_RTX_PATTERN)
140*e4b17023SJohn Marino     {
141*e4b17023SJohn Marino       char buf[2048];
142*e4b17023SJohn Marino 
143*e4b17023SJohn Marino       print_insn (buf, insn, 0);
144*e4b17023SJohn Marino       sel_print ("%s;", buf);
145*e4b17023SJohn Marino     }
146*e4b17023SJohn Marino 
147*e4b17023SJohn Marino   if (flags & DUMP_INSN_RTX_BBN)
148*e4b17023SJohn Marino     {
149*e4b17023SJohn Marino       basic_block bb = BLOCK_FOR_INSN (insn);
150*e4b17023SJohn Marino 
151*e4b17023SJohn Marino       sel_print ("bb:%d;", bb != NULL ? bb->index : -1);
152*e4b17023SJohn Marino     }
153*e4b17023SJohn Marino 
154*e4b17023SJohn Marino   sel_print (")");
155*e4b17023SJohn Marino }
156*e4b17023SJohn Marino 
157*e4b17023SJohn Marino 
158*e4b17023SJohn Marino /* Dump INSN with default flags.  */
159*e4b17023SJohn Marino void
dump_insn_rtx(rtx insn)160*e4b17023SJohn Marino dump_insn_rtx (rtx insn)
161*e4b17023SJohn Marino {
162*e4b17023SJohn Marino   dump_insn_rtx_1 (insn, dump_insn_rtx_flags);
163*e4b17023SJohn Marino }
164*e4b17023SJohn Marino 
165*e4b17023SJohn Marino 
166*e4b17023SJohn Marino /* Dump INSN to stderr.  */
167*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_insn_rtx(rtx insn)168*e4b17023SJohn Marino debug_insn_rtx (rtx insn)
169*e4b17023SJohn Marino {
170*e4b17023SJohn Marino   switch_dump (stderr);
171*e4b17023SJohn Marino   dump_insn_rtx_1 (insn, debug_insn_rtx_flags);
172*e4b17023SJohn Marino   sel_print ("\n");
173*e4b17023SJohn Marino   restore_dump ();
174*e4b17023SJohn Marino }
175*e4b17023SJohn Marino 
176*e4b17023SJohn Marino /* Dump vinsn VI honoring flags.  */
177*e4b17023SJohn Marino void
dump_vinsn_1(vinsn_t vi,int flags)178*e4b17023SJohn Marino dump_vinsn_1 (vinsn_t vi, int flags)
179*e4b17023SJohn Marino {
180*e4b17023SJohn Marino   int all;
181*e4b17023SJohn Marino 
182*e4b17023SJohn Marino   /* flags == -1 also means dumping all.  */
183*e4b17023SJohn Marino   all = flags & 1;
184*e4b17023SJohn Marino   if (all)
185*e4b17023SJohn Marino     flags |= DUMP_VINSN_ALL;
186*e4b17023SJohn Marino 
187*e4b17023SJohn Marino   sel_print ("(");
188*e4b17023SJohn Marino 
189*e4b17023SJohn Marino   if (flags & DUMP_VINSN_INSN_RTX)
190*e4b17023SJohn Marino     dump_insn_rtx_1 (VINSN_INSN_RTX (vi), dump_insn_rtx_flags | all);
191*e4b17023SJohn Marino 
192*e4b17023SJohn Marino   if (flags & DUMP_VINSN_TYPE)
193*e4b17023SJohn Marino     sel_print ("type:%s;", GET_RTX_NAME (VINSN_TYPE (vi)));
194*e4b17023SJohn Marino 
195*e4b17023SJohn Marino   if (flags & DUMP_VINSN_COUNT)
196*e4b17023SJohn Marino     sel_print ("count:%d;", VINSN_COUNT (vi));
197*e4b17023SJohn Marino 
198*e4b17023SJohn Marino   if (flags & DUMP_VINSN_COST)
199*e4b17023SJohn Marino     {
200*e4b17023SJohn Marino       int cost = vi->cost;
201*e4b17023SJohn Marino 
202*e4b17023SJohn Marino       if (cost != -1)
203*e4b17023SJohn Marino 	sel_print ("cost:%d;", cost);
204*e4b17023SJohn Marino     }
205*e4b17023SJohn Marino 
206*e4b17023SJohn Marino   sel_print (")");
207*e4b17023SJohn Marino }
208*e4b17023SJohn Marino 
209*e4b17023SJohn Marino /* Dump vinsn VI with default flags.  */
210*e4b17023SJohn Marino void
dump_vinsn(vinsn_t vi)211*e4b17023SJohn Marino dump_vinsn (vinsn_t vi)
212*e4b17023SJohn Marino {
213*e4b17023SJohn Marino   dump_vinsn_1 (vi, dump_vinsn_flags);
214*e4b17023SJohn Marino }
215*e4b17023SJohn Marino 
216*e4b17023SJohn Marino /* Dump vinsn VI to stderr.  */
217*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_vinsn(vinsn_t vi)218*e4b17023SJohn Marino debug_vinsn (vinsn_t vi)
219*e4b17023SJohn Marino {
220*e4b17023SJohn Marino   switch_dump (stderr);
221*e4b17023SJohn Marino   dump_vinsn_1 (vi, debug_vinsn_flags);
222*e4b17023SJohn Marino   sel_print ("\n");
223*e4b17023SJohn Marino   restore_dump ();
224*e4b17023SJohn Marino }
225*e4b17023SJohn Marino 
226*e4b17023SJohn Marino /* Dump EXPR honoring flags.  */
227*e4b17023SJohn Marino void
dump_expr_1(expr_t expr,int flags)228*e4b17023SJohn Marino dump_expr_1 (expr_t expr, int flags)
229*e4b17023SJohn Marino {
230*e4b17023SJohn Marino   int all;
231*e4b17023SJohn Marino 
232*e4b17023SJohn Marino   /* flags == -1 also means dumping all.  */
233*e4b17023SJohn Marino   all = flags & 1;
234*e4b17023SJohn Marino   if (all)
235*e4b17023SJohn Marino     flags |= DUMP_EXPR_ALL;
236*e4b17023SJohn Marino 
237*e4b17023SJohn Marino   sel_print ("[");
238*e4b17023SJohn Marino 
239*e4b17023SJohn Marino   if (flags & DUMP_EXPR_VINSN)
240*e4b17023SJohn Marino     dump_vinsn_1 (EXPR_VINSN (expr), dump_vinsn_flags | all);
241*e4b17023SJohn Marino 
242*e4b17023SJohn Marino   if (flags & DUMP_EXPR_SPEC)
243*e4b17023SJohn Marino     {
244*e4b17023SJohn Marino       int spec = EXPR_SPEC (expr);
245*e4b17023SJohn Marino 
246*e4b17023SJohn Marino       if (spec != 0)
247*e4b17023SJohn Marino 	sel_print ("spec:%d;", spec);
248*e4b17023SJohn Marino     }
249*e4b17023SJohn Marino 
250*e4b17023SJohn Marino   if (flags & DUMP_EXPR_USEFULNESS)
251*e4b17023SJohn Marino     {
252*e4b17023SJohn Marino       int use = EXPR_USEFULNESS (expr);
253*e4b17023SJohn Marino 
254*e4b17023SJohn Marino       if (use != REG_BR_PROB_BASE)
255*e4b17023SJohn Marino         sel_print ("use:%d;", use);
256*e4b17023SJohn Marino     }
257*e4b17023SJohn Marino 
258*e4b17023SJohn Marino   if (flags & DUMP_EXPR_PRIORITY)
259*e4b17023SJohn Marino     sel_print ("prio:%d;", EXPR_PRIORITY (expr));
260*e4b17023SJohn Marino 
261*e4b17023SJohn Marino   if (flags & DUMP_EXPR_SCHED_TIMES)
262*e4b17023SJohn Marino     {
263*e4b17023SJohn Marino       int times = EXPR_SCHED_TIMES (expr);
264*e4b17023SJohn Marino 
265*e4b17023SJohn Marino       if (times != 0)
266*e4b17023SJohn Marino 	sel_print ("times:%d;", times);
267*e4b17023SJohn Marino     }
268*e4b17023SJohn Marino 
269*e4b17023SJohn Marino   if (flags & DUMP_EXPR_SPEC_DONE_DS)
270*e4b17023SJohn Marino     {
271*e4b17023SJohn Marino       ds_t spec_done_ds = EXPR_SPEC_DONE_DS (expr);
272*e4b17023SJohn Marino 
273*e4b17023SJohn Marino       if (spec_done_ds != 0)
274*e4b17023SJohn Marino 	sel_print ("ds:%d;", spec_done_ds);
275*e4b17023SJohn Marino     }
276*e4b17023SJohn Marino 
277*e4b17023SJohn Marino   if (flags & DUMP_EXPR_ORIG_BB)
278*e4b17023SJohn Marino     {
279*e4b17023SJohn Marino       int orig_bb = EXPR_ORIG_BB_INDEX (expr);
280*e4b17023SJohn Marino 
281*e4b17023SJohn Marino       if (orig_bb != 0)
282*e4b17023SJohn Marino 	sel_print ("orig_bb:%d;", orig_bb);
283*e4b17023SJohn Marino     }
284*e4b17023SJohn Marino 
285*e4b17023SJohn Marino   if (EXPR_TARGET_AVAILABLE (expr) < 1)
286*e4b17023SJohn Marino     sel_print ("target:%d;", EXPR_TARGET_AVAILABLE (expr));
287*e4b17023SJohn Marino   sel_print ("]");
288*e4b17023SJohn Marino }
289*e4b17023SJohn Marino 
290*e4b17023SJohn Marino /* Dump expression EXPR with default flags.  */
291*e4b17023SJohn Marino void
dump_expr(expr_t expr)292*e4b17023SJohn Marino dump_expr (expr_t expr)
293*e4b17023SJohn Marino {
294*e4b17023SJohn Marino   dump_expr_1 (expr, dump_expr_flags);
295*e4b17023SJohn Marino }
296*e4b17023SJohn Marino 
297*e4b17023SJohn Marino /* Dump expression EXPR to stderr.  */
298*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_expr(expr_t expr)299*e4b17023SJohn Marino debug_expr (expr_t expr)
300*e4b17023SJohn Marino {
301*e4b17023SJohn Marino   switch_dump (stderr);
302*e4b17023SJohn Marino   dump_expr_1 (expr, debug_expr_flags);
303*e4b17023SJohn Marino   sel_print ("\n");
304*e4b17023SJohn Marino   restore_dump ();
305*e4b17023SJohn Marino }
306*e4b17023SJohn Marino 
307*e4b17023SJohn Marino /* Dump insn I honoring FLAGS.  */
308*e4b17023SJohn Marino void
dump_insn_1(insn_t i,int flags)309*e4b17023SJohn Marino dump_insn_1 (insn_t i, int flags)
310*e4b17023SJohn Marino {
311*e4b17023SJohn Marino   int all;
312*e4b17023SJohn Marino 
313*e4b17023SJohn Marino   all = flags & 1;
314*e4b17023SJohn Marino   if (all)
315*e4b17023SJohn Marino     flags |= DUMP_INSN_ALL;
316*e4b17023SJohn Marino 
317*e4b17023SJohn Marino   if (!sched_dump_to_dot_p)
318*e4b17023SJohn Marino     sel_print ("(");
319*e4b17023SJohn Marino 
320*e4b17023SJohn Marino   if (flags & DUMP_INSN_EXPR)
321*e4b17023SJohn Marino     {
322*e4b17023SJohn Marino       dump_expr_1 (INSN_EXPR (i), dump_expr_flags | all);
323*e4b17023SJohn Marino       sel_print (";");
324*e4b17023SJohn Marino     }
325*e4b17023SJohn Marino   else if (flags & DUMP_INSN_PATTERN)
326*e4b17023SJohn Marino     {
327*e4b17023SJohn Marino       dump_insn_rtx_1 (i, DUMP_INSN_RTX_PATTERN | all);
328*e4b17023SJohn Marino       sel_print (";");
329*e4b17023SJohn Marino     }
330*e4b17023SJohn Marino   else if (flags & DUMP_INSN_UID)
331*e4b17023SJohn Marino     sel_print ("uid:%d;", INSN_UID (i));
332*e4b17023SJohn Marino 
333*e4b17023SJohn Marino   if (flags & DUMP_INSN_SEQNO)
334*e4b17023SJohn Marino     sel_print ("seqno:%d;", INSN_SEQNO (i));
335*e4b17023SJohn Marino 
336*e4b17023SJohn Marino   if (flags & DUMP_INSN_SCHED_CYCLE)
337*e4b17023SJohn Marino     {
338*e4b17023SJohn Marino       int cycle = INSN_SCHED_CYCLE (i);
339*e4b17023SJohn Marino 
340*e4b17023SJohn Marino       if (cycle != 0)
341*e4b17023SJohn Marino 	sel_print ("cycle:%d;", cycle);
342*e4b17023SJohn Marino     }
343*e4b17023SJohn Marino 
344*e4b17023SJohn Marino   if (!sched_dump_to_dot_p)
345*e4b17023SJohn Marino     sel_print (")");
346*e4b17023SJohn Marino }
347*e4b17023SJohn Marino 
348*e4b17023SJohn Marino /* Dump insn I with default flags.  */
349*e4b17023SJohn Marino void
dump_insn(insn_t i)350*e4b17023SJohn Marino dump_insn (insn_t i)
351*e4b17023SJohn Marino {
352*e4b17023SJohn Marino   dump_insn_1 (i, DUMP_INSN_EXPR | DUMP_INSN_SCHED_CYCLE);
353*e4b17023SJohn Marino }
354*e4b17023SJohn Marino 
355*e4b17023SJohn Marino /* Dump INSN to stderr.  */
356*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_insn(insn_t insn)357*e4b17023SJohn Marino debug_insn (insn_t insn)
358*e4b17023SJohn Marino {
359*e4b17023SJohn Marino   switch_dump (stderr);
360*e4b17023SJohn Marino   dump_insn_1 (insn, debug_insn_flags);
361*e4b17023SJohn Marino   sel_print ("\n");
362*e4b17023SJohn Marino   restore_dump ();
363*e4b17023SJohn Marino }
364*e4b17023SJohn Marino 
365*e4b17023SJohn Marino /* Dumps av_set AV.  */
366*e4b17023SJohn Marino void
dump_av_set(av_set_t av)367*e4b17023SJohn Marino dump_av_set (av_set_t av)
368*e4b17023SJohn Marino {
369*e4b17023SJohn Marino   av_set_iterator i;
370*e4b17023SJohn Marino   expr_t expr;
371*e4b17023SJohn Marino 
372*e4b17023SJohn Marino   if (!sched_dump_to_dot_p)
373*e4b17023SJohn Marino     sel_print ("{");
374*e4b17023SJohn Marino 
375*e4b17023SJohn Marino   FOR_EACH_EXPR (expr, i, av)
376*e4b17023SJohn Marino     {
377*e4b17023SJohn Marino       dump_expr (expr);
378*e4b17023SJohn Marino       if (!sched_dump_to_dot_p)
379*e4b17023SJohn Marino         sel_print (" ");
380*e4b17023SJohn Marino       else
381*e4b17023SJohn Marino         sel_print ("\n");
382*e4b17023SJohn Marino     }
383*e4b17023SJohn Marino 
384*e4b17023SJohn Marino   if (!sched_dump_to_dot_p)
385*e4b17023SJohn Marino     sel_print ("}");
386*e4b17023SJohn Marino }
387*e4b17023SJohn Marino 
388*e4b17023SJohn Marino /* Dumps lvset LV.  */
389*e4b17023SJohn Marino void
dump_lv_set(regset lv)390*e4b17023SJohn Marino dump_lv_set (regset lv)
391*e4b17023SJohn Marino {
392*e4b17023SJohn Marino   sel_print ("{");
393*e4b17023SJohn Marino 
394*e4b17023SJohn Marino   /* This code was adapted from cfg.c: dump_regset ().  */
395*e4b17023SJohn Marino   if (lv == NULL)
396*e4b17023SJohn Marino     sel_print ("nil");
397*e4b17023SJohn Marino   else
398*e4b17023SJohn Marino     {
399*e4b17023SJohn Marino       unsigned i;
400*e4b17023SJohn Marino       reg_set_iterator rsi;
401*e4b17023SJohn Marino       int count = 0;
402*e4b17023SJohn Marino 
403*e4b17023SJohn Marino       EXECUTE_IF_SET_IN_REG_SET (lv, 0, i, rsi)
404*e4b17023SJohn Marino         {
405*e4b17023SJohn Marino           sel_print (" %d", i);
406*e4b17023SJohn Marino           if (i < FIRST_PSEUDO_REGISTER)
407*e4b17023SJohn Marino             {
408*e4b17023SJohn Marino               sel_print (" [%s]", reg_names[i]);
409*e4b17023SJohn Marino               ++count;
410*e4b17023SJohn Marino             }
411*e4b17023SJohn Marino 
412*e4b17023SJohn Marino           ++count;
413*e4b17023SJohn Marino 
414*e4b17023SJohn Marino           if (sched_dump_to_dot_p && count == 12)
415*e4b17023SJohn Marino             {
416*e4b17023SJohn Marino               count = 0;
417*e4b17023SJohn Marino               sel_print ("\n");
418*e4b17023SJohn Marino             }
419*e4b17023SJohn Marino         }
420*e4b17023SJohn Marino     }
421*e4b17023SJohn Marino 
422*e4b17023SJohn Marino   sel_print ("}\n");
423*e4b17023SJohn Marino }
424*e4b17023SJohn Marino 
425*e4b17023SJohn Marino /* Dumps a list of instructions pointed to by P.  */
426*e4b17023SJohn Marino static void
dump_ilist(ilist_t p)427*e4b17023SJohn Marino dump_ilist (ilist_t p)
428*e4b17023SJohn Marino {
429*e4b17023SJohn Marino   while (p)
430*e4b17023SJohn Marino     {
431*e4b17023SJohn Marino       dump_insn (ILIST_INSN (p));
432*e4b17023SJohn Marino       p = ILIST_NEXT (p);
433*e4b17023SJohn Marino     }
434*e4b17023SJohn Marino }
435*e4b17023SJohn Marino 
436*e4b17023SJohn Marino /* Dumps a list of boundaries pointed to by BNDS.  */
437*e4b17023SJohn Marino void
dump_blist(blist_t bnds)438*e4b17023SJohn Marino dump_blist (blist_t bnds)
439*e4b17023SJohn Marino {
440*e4b17023SJohn Marino   for (; bnds; bnds = BLIST_NEXT (bnds))
441*e4b17023SJohn Marino     {
442*e4b17023SJohn Marino       bnd_t bnd = BLIST_BND (bnds);
443*e4b17023SJohn Marino 
444*e4b17023SJohn Marino       sel_print ("[to: %d; ptr: ", INSN_UID (BND_TO (bnd)));
445*e4b17023SJohn Marino       dump_ilist (BND_PTR (bnd));
446*e4b17023SJohn Marino       sel_print ("] ");
447*e4b17023SJohn Marino     }
448*e4b17023SJohn Marino }
449*e4b17023SJohn Marino 
450*e4b17023SJohn Marino /* Dumps a list of fences pointed to by L.  */
451*e4b17023SJohn Marino void
dump_flist(flist_t l)452*e4b17023SJohn Marino dump_flist (flist_t l)
453*e4b17023SJohn Marino {
454*e4b17023SJohn Marino   while (l)
455*e4b17023SJohn Marino     {
456*e4b17023SJohn Marino       dump_insn_1 (FENCE_INSN (FLIST_FENCE (l)), dump_flist_insn_flags);
457*e4b17023SJohn Marino       sel_print (" ");
458*e4b17023SJohn Marino       l = FLIST_NEXT (l);
459*e4b17023SJohn Marino     }
460*e4b17023SJohn Marino }
461*e4b17023SJohn Marino 
462*e4b17023SJohn Marino /* Dumps an insn vector SUCCS.  */
463*e4b17023SJohn Marino void
dump_insn_vector(rtx_vec_t succs)464*e4b17023SJohn Marino dump_insn_vector (rtx_vec_t succs)
465*e4b17023SJohn Marino {
466*e4b17023SJohn Marino   int i;
467*e4b17023SJohn Marino   rtx succ;
468*e4b17023SJohn Marino 
469*e4b17023SJohn Marino   FOR_EACH_VEC_ELT (rtx, succs, i, succ)
470*e4b17023SJohn Marino     if (succ)
471*e4b17023SJohn Marino       dump_insn (succ);
472*e4b17023SJohn Marino     else
473*e4b17023SJohn Marino       sel_print ("NULL ");
474*e4b17023SJohn Marino }
475*e4b17023SJohn Marino 
476*e4b17023SJohn Marino /* Dumps a hard reg set SET to FILE using PREFIX.  */
477*e4b17023SJohn Marino static void
print_hard_reg_set(FILE * file,const char * prefix,HARD_REG_SET set)478*e4b17023SJohn Marino print_hard_reg_set (FILE *file, const char *prefix, HARD_REG_SET set)
479*e4b17023SJohn Marino {
480*e4b17023SJohn Marino   int i;
481*e4b17023SJohn Marino 
482*e4b17023SJohn Marino   fprintf (file, "%s{ ", prefix);
483*e4b17023SJohn Marino   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
484*e4b17023SJohn Marino     {
485*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (set, i))
486*e4b17023SJohn Marino 	fprintf (file, "%d ", i);
487*e4b17023SJohn Marino     }
488*e4b17023SJohn Marino   fprintf (file, "}\n");
489*e4b17023SJohn Marino }
490*e4b17023SJohn Marino 
491*e4b17023SJohn Marino /* Dumps a hard reg set SET using PREFIX.  */
492*e4b17023SJohn Marino void
dump_hard_reg_set(const char * prefix,HARD_REG_SET set)493*e4b17023SJohn Marino dump_hard_reg_set (const char *prefix, HARD_REG_SET set)
494*e4b17023SJohn Marino {
495*e4b17023SJohn Marino   print_hard_reg_set (sched_dump, prefix, set);
496*e4b17023SJohn Marino }
497*e4b17023SJohn Marino 
498*e4b17023SJohn Marino /* Pretty print INSN.  This is used as a hook.  */
499*e4b17023SJohn Marino const char *
sel_print_insn(const_rtx insn,int aligned ATTRIBUTE_UNUSED)500*e4b17023SJohn Marino sel_print_insn (const_rtx insn, int aligned ATTRIBUTE_UNUSED)
501*e4b17023SJohn Marino {
502*e4b17023SJohn Marino   static char buf[80];
503*e4b17023SJohn Marino 
504*e4b17023SJohn Marino   /* '+' before insn means it is a new cycle start and it's not been
505*e4b17023SJohn Marino      scheduled yet.  '>' - has been scheduled.  */
506*e4b17023SJohn Marino   if (s_i_d && INSN_LUID (insn) > 0)
507*e4b17023SJohn Marino     if (GET_MODE (insn) == TImode)
508*e4b17023SJohn Marino       sprintf (buf, "%s %4d",
509*e4b17023SJohn Marino                INSN_SCHED_TIMES (insn) > 0 ? "> " : "< ",
510*e4b17023SJohn Marino                INSN_UID (insn));
511*e4b17023SJohn Marino     else
512*e4b17023SJohn Marino       sprintf (buf, "%s %4d",
513*e4b17023SJohn Marino                INSN_SCHED_TIMES (insn) > 0 ? "! " : "  ",
514*e4b17023SJohn Marino                INSN_UID (insn));
515*e4b17023SJohn Marino   else
516*e4b17023SJohn Marino     if (GET_MODE (insn) == TImode)
517*e4b17023SJohn Marino       sprintf (buf, "+ %4d", INSN_UID (insn));
518*e4b17023SJohn Marino     else
519*e4b17023SJohn Marino       sprintf (buf, "  %4d", INSN_UID (insn));
520*e4b17023SJohn Marino 
521*e4b17023SJohn Marino   return buf;
522*e4b17023SJohn Marino }
523*e4b17023SJohn Marino 
524*e4b17023SJohn Marino 
525*e4b17023SJohn Marino /* Functions for pretty printing of CFG.  */
526*e4b17023SJohn Marino 
527*e4b17023SJohn Marino /* Replace all occurencies of STR1 to STR2 in BUF.
528*e4b17023SJohn Marino    The BUF must be large enough to hold the result.  */
529*e4b17023SJohn Marino static void
replace_str_in_buf(char * buf,const char * str1,const char * str2)530*e4b17023SJohn Marino replace_str_in_buf (char *buf, const char *str1, const char *str2)
531*e4b17023SJohn Marino {
532*e4b17023SJohn Marino   int buf_len = strlen (buf);
533*e4b17023SJohn Marino   int str1_len = strlen (str1);
534*e4b17023SJohn Marino   int str2_len = strlen (str2);
535*e4b17023SJohn Marino   int diff = str2_len - str1_len;
536*e4b17023SJohn Marino 
537*e4b17023SJohn Marino   char *p = buf;
538*e4b17023SJohn Marino   do
539*e4b17023SJohn Marino     {
540*e4b17023SJohn Marino       p = strstr (p, str1);
541*e4b17023SJohn Marino       if (p)
542*e4b17023SJohn Marino 	{
543*e4b17023SJohn Marino 	  char *p1 = p + str1_len;
544*e4b17023SJohn Marino 	  /* Copy the rest of buf and '\0'.  */
545*e4b17023SJohn Marino 	  int n = buf + buf_len - p1;
546*e4b17023SJohn Marino 	  int i;
547*e4b17023SJohn Marino 
548*e4b17023SJohn Marino 	  /* Shift str by DIFF chars.  */
549*e4b17023SJohn Marino 	  if (diff > 0)
550*e4b17023SJohn Marino             for (i = n; i >= 0; i--)
551*e4b17023SJohn Marino               p1[i + diff] = p1[i];
552*e4b17023SJohn Marino 	  else
553*e4b17023SJohn Marino             for (i = 0; i <= n; i++)
554*e4b17023SJohn Marino               p1[i + diff] = p1[i];
555*e4b17023SJohn Marino 
556*e4b17023SJohn Marino 	  /* Copy str2.  */
557*e4b17023SJohn Marino 	  for (i = 0; i < str2_len; i++)
558*e4b17023SJohn Marino 	    p[i] = str2[i];
559*e4b17023SJohn Marino 
560*e4b17023SJohn Marino 	  p += str2_len;
561*e4b17023SJohn Marino 	  buf_len += diff;
562*e4b17023SJohn Marino 	}
563*e4b17023SJohn Marino 
564*e4b17023SJohn Marino     }
565*e4b17023SJohn Marino   while (p);
566*e4b17023SJohn Marino }
567*e4b17023SJohn Marino 
568*e4b17023SJohn Marino /* Replace characters in BUF that have special meaning in .dot file.  */
569*e4b17023SJohn Marino static void
sel_prepare_string_for_dot_label(char * buf)570*e4b17023SJohn Marino sel_prepare_string_for_dot_label (char *buf)
571*e4b17023SJohn Marino {
572*e4b17023SJohn Marino   static char specials_from[7][2] = { "<", ">", "{", "|", "}", "\"",
573*e4b17023SJohn Marino                                       "\n" };
574*e4b17023SJohn Marino   static char specials_to[7][3] = { "\\<", "\\>", "\\{", "\\|", "\\}",
575*e4b17023SJohn Marino                                     "\\\"", "\\l" };
576*e4b17023SJohn Marino   unsigned i;
577*e4b17023SJohn Marino 
578*e4b17023SJohn Marino   for (i = 0; i < 7; i++)
579*e4b17023SJohn Marino     replace_str_in_buf (buf, specials_from[i], specials_to[i]);
580*e4b17023SJohn Marino }
581*e4b17023SJohn Marino 
582*e4b17023SJohn Marino /* This function acts like printf but dumps to the sched_dump file.  */
583*e4b17023SJohn Marino void
sel_print(const char * fmt,...)584*e4b17023SJohn Marino sel_print (const char *fmt, ...)
585*e4b17023SJohn Marino {
586*e4b17023SJohn Marino   va_list ap;
587*e4b17023SJohn Marino   va_start (ap, fmt);
588*e4b17023SJohn Marino   if (sched_dump_to_dot_p)
589*e4b17023SJohn Marino     {
590*e4b17023SJohn Marino       char *message;
591*e4b17023SJohn Marino       if (vasprintf (&message, fmt, ap) >= 0 && message != NULL)
592*e4b17023SJohn Marino 	{
593*e4b17023SJohn Marino 	  message = (char *) xrealloc (message, 2 * strlen (message) + 1);
594*e4b17023SJohn Marino 	  sel_prepare_string_for_dot_label (message);
595*e4b17023SJohn Marino 	  fprintf (sched_dump, "%s", message);
596*e4b17023SJohn Marino 	  free (message);
597*e4b17023SJohn Marino 	}
598*e4b17023SJohn Marino     }
599*e4b17023SJohn Marino   else
600*e4b17023SJohn Marino     vfprintf (sched_dump, fmt, ap);
601*e4b17023SJohn Marino   va_end (ap);
602*e4b17023SJohn Marino }
603*e4b17023SJohn Marino 
604*e4b17023SJohn Marino /* Dump INSN with FLAGS.  */
605*e4b17023SJohn Marino static void
sel_dump_cfg_insn(insn_t insn,int flags)606*e4b17023SJohn Marino sel_dump_cfg_insn (insn_t insn, int flags)
607*e4b17023SJohn Marino {
608*e4b17023SJohn Marino   int insn_flags = DUMP_INSN_UID | DUMP_INSN_PATTERN;
609*e4b17023SJohn Marino 
610*e4b17023SJohn Marino   if (sched_luids != NULL && INSN_LUID (insn) > 0)
611*e4b17023SJohn Marino     {
612*e4b17023SJohn Marino       if (flags & SEL_DUMP_CFG_INSN_SEQNO)
613*e4b17023SJohn Marino 	insn_flags |= DUMP_INSN_SEQNO | DUMP_INSN_SCHED_CYCLE | DUMP_INSN_EXPR;
614*e4b17023SJohn Marino     }
615*e4b17023SJohn Marino 
616*e4b17023SJohn Marino   dump_insn_1 (insn, insn_flags);
617*e4b17023SJohn Marino }
618*e4b17023SJohn Marino 
619*e4b17023SJohn Marino /* Dump E to the dot file F.  */
620*e4b17023SJohn Marino static void
sel_dump_cfg_edge(FILE * f,edge e)621*e4b17023SJohn Marino sel_dump_cfg_edge (FILE *f, edge e)
622*e4b17023SJohn Marino {
623*e4b17023SJohn Marino   int w;
624*e4b17023SJohn Marino   const char *color;
625*e4b17023SJohn Marino 
626*e4b17023SJohn Marino   if (e->flags & EDGE_FALLTHRU)
627*e4b17023SJohn Marino     {
628*e4b17023SJohn Marino       w = 10;
629*e4b17023SJohn Marino       color = ", color = red";
630*e4b17023SJohn Marino     }
631*e4b17023SJohn Marino   else if (e->src->next_bb == e->dest)
632*e4b17023SJohn Marino     {
633*e4b17023SJohn Marino       w = 3;
634*e4b17023SJohn Marino       color = ", color = blue";
635*e4b17023SJohn Marino     }
636*e4b17023SJohn Marino   else
637*e4b17023SJohn Marino     {
638*e4b17023SJohn Marino       w = 1;
639*e4b17023SJohn Marino       color = "";
640*e4b17023SJohn Marino     }
641*e4b17023SJohn Marino 
642*e4b17023SJohn Marino   fprintf (f, "\tbb%d -> bb%d [weight = %d%s];\n",
643*e4b17023SJohn Marino 	   e->src->index, e->dest->index, w, color);
644*e4b17023SJohn Marino }
645*e4b17023SJohn Marino 
646*e4b17023SJohn Marino 
647*e4b17023SJohn Marino /* Return true if BB has a predesessor from current region.
648*e4b17023SJohn Marino    TODO: Either make this function to trace back through empty block
649*e4b17023SJohn Marino    or just remove those empty blocks.  */
650*e4b17023SJohn Marino static bool
has_preds_in_current_region_p(basic_block bb)651*e4b17023SJohn Marino has_preds_in_current_region_p (basic_block bb)
652*e4b17023SJohn Marino {
653*e4b17023SJohn Marino   edge e;
654*e4b17023SJohn Marino   edge_iterator ei;
655*e4b17023SJohn Marino 
656*e4b17023SJohn Marino   gcc_assert (!in_current_region_p (bb));
657*e4b17023SJohn Marino 
658*e4b17023SJohn Marino   FOR_EACH_EDGE (e, ei, bb->preds)
659*e4b17023SJohn Marino     if (in_current_region_p (e->src))
660*e4b17023SJohn Marino       return true;
661*e4b17023SJohn Marino 
662*e4b17023SJohn Marino   return false;
663*e4b17023SJohn Marino }
664*e4b17023SJohn Marino 
665*e4b17023SJohn Marino /* Dump a cfg region to the dot file F honoring FLAGS.  */
666*e4b17023SJohn Marino static void
sel_dump_cfg_2(FILE * f,int flags)667*e4b17023SJohn Marino sel_dump_cfg_2 (FILE *f, int flags)
668*e4b17023SJohn Marino {
669*e4b17023SJohn Marino   basic_block bb;
670*e4b17023SJohn Marino 
671*e4b17023SJohn Marino   sched_dump_to_dot_p = true;
672*e4b17023SJohn Marino   switch_dump (f);
673*e4b17023SJohn Marino 
674*e4b17023SJohn Marino   fprintf (f, "digraph G {\n"
675*e4b17023SJohn Marino 	   "\tratio = 2.25;\n"
676*e4b17023SJohn Marino 	   "\tnode [shape = record, fontsize = 9];\n");
677*e4b17023SJohn Marino 
678*e4b17023SJohn Marino   if (flags & SEL_DUMP_CFG_FUNCTION_NAME)
679*e4b17023SJohn Marino     fprintf (f, "function [label = \"%s\"];\n", current_function_name ());
680*e4b17023SJohn Marino 
681*e4b17023SJohn Marino   FOR_EACH_BB (bb)
682*e4b17023SJohn Marino     {
683*e4b17023SJohn Marino       insn_t insn = BB_HEAD (bb);
684*e4b17023SJohn Marino       insn_t next_tail = NEXT_INSN (BB_END (bb));
685*e4b17023SJohn Marino       edge e;
686*e4b17023SJohn Marino       edge_iterator ei;
687*e4b17023SJohn Marino       bool in_region_p = ((flags & SEL_DUMP_CFG_CURRENT_REGION)
688*e4b17023SJohn Marino 			  && in_current_region_p (bb));
689*e4b17023SJohn Marino       bool full_p = (!(flags & SEL_DUMP_CFG_CURRENT_REGION)
690*e4b17023SJohn Marino 		     || in_region_p);
691*e4b17023SJohn Marino       bool some_p = full_p || has_preds_in_current_region_p (bb);
692*e4b17023SJohn Marino       const char *color;
693*e4b17023SJohn Marino       const char *style;
694*e4b17023SJohn Marino 
695*e4b17023SJohn Marino       if (!some_p)
696*e4b17023SJohn Marino 	continue;
697*e4b17023SJohn Marino 
698*e4b17023SJohn Marino       if ((flags & SEL_DUMP_CFG_CURRENT_REGION)
699*e4b17023SJohn Marino 	  && in_current_region_p (bb)
700*e4b17023SJohn Marino 	  && BLOCK_TO_BB (bb->index) == 0)
701*e4b17023SJohn Marino 	color = "color = green, ";
702*e4b17023SJohn Marino       else
703*e4b17023SJohn Marino 	color = "";
704*e4b17023SJohn Marino 
705*e4b17023SJohn Marino       if ((flags & SEL_DUMP_CFG_FENCES)
706*e4b17023SJohn Marino 	  && in_region_p)
707*e4b17023SJohn Marino 	{
708*e4b17023SJohn Marino 	  style = "";
709*e4b17023SJohn Marino 
710*e4b17023SJohn Marino 	  if (!sel_bb_empty_p (bb))
711*e4b17023SJohn Marino 	    {
712*e4b17023SJohn Marino 	      bool first_p = true;
713*e4b17023SJohn Marino 	      insn_t tail = BB_END (bb);
714*e4b17023SJohn Marino 	      insn_t cur_insn;
715*e4b17023SJohn Marino 
716*e4b17023SJohn Marino 	      cur_insn = bb_note (bb);
717*e4b17023SJohn Marino 
718*e4b17023SJohn Marino 	      do
719*e4b17023SJohn Marino 		{
720*e4b17023SJohn Marino 		  fence_t fence;
721*e4b17023SJohn Marino 
722*e4b17023SJohn Marino 		  cur_insn = NEXT_INSN (cur_insn);
723*e4b17023SJohn Marino 		  fence = flist_lookup (fences, cur_insn);
724*e4b17023SJohn Marino 
725*e4b17023SJohn Marino 		  if (fence != NULL)
726*e4b17023SJohn Marino 		    {
727*e4b17023SJohn Marino 		      if (!FENCE_SCHEDULED_P (fence))
728*e4b17023SJohn Marino 			{
729*e4b17023SJohn Marino 			  if (first_p)
730*e4b17023SJohn Marino 			    color = "color = red, ";
731*e4b17023SJohn Marino 			  else
732*e4b17023SJohn Marino 			    color = "color = yellow, ";
733*e4b17023SJohn Marino 			}
734*e4b17023SJohn Marino 		      else
735*e4b17023SJohn Marino 			color = "color = blue, ";
736*e4b17023SJohn Marino 		    }
737*e4b17023SJohn Marino 
738*e4b17023SJohn Marino 		  first_p = false;
739*e4b17023SJohn Marino 		}
740*e4b17023SJohn Marino 	      while (cur_insn != tail);
741*e4b17023SJohn Marino 	    }
742*e4b17023SJohn Marino 	}
743*e4b17023SJohn Marino       else if (!full_p)
744*e4b17023SJohn Marino 	style = "style = dashed, ";
745*e4b17023SJohn Marino       else
746*e4b17023SJohn Marino 	style = "";
747*e4b17023SJohn Marino 
748*e4b17023SJohn Marino       fprintf (f, "\tbb%d [%s%slabel = \"{Basic block %d", bb->index,
749*e4b17023SJohn Marino 	       style, color, bb->index);
750*e4b17023SJohn Marino 
751*e4b17023SJohn Marino       if ((flags & SEL_DUMP_CFG_BB_LOOP)
752*e4b17023SJohn Marino 	  && bb->loop_father != NULL)
753*e4b17023SJohn Marino 	fprintf (f, ", loop %d", bb->loop_father->num);
754*e4b17023SJohn Marino 
755*e4b17023SJohn Marino       if (full_p
756*e4b17023SJohn Marino 	  && (flags & SEL_DUMP_CFG_BB_NOTES_LIST))
757*e4b17023SJohn Marino 	{
758*e4b17023SJohn Marino 	  insn_t notes = BB_NOTE_LIST (bb);
759*e4b17023SJohn Marino 
760*e4b17023SJohn Marino 	  if (notes != NULL_RTX)
761*e4b17023SJohn Marino 	    {
762*e4b17023SJohn Marino 	      fprintf (f, "|");
763*e4b17023SJohn Marino 
764*e4b17023SJohn Marino 	      /* For simplicity, we dump notes from note_list in reversed order
765*e4b17023SJohn Marino 		 to that what they will appear in the code.  */
766*e4b17023SJohn Marino 	      while (notes != NULL_RTX)
767*e4b17023SJohn Marino 		{
768*e4b17023SJohn Marino 		  sel_dump_cfg_insn (notes, flags);
769*e4b17023SJohn Marino 		  fprintf (f, "\\l");
770*e4b17023SJohn Marino 
771*e4b17023SJohn Marino 		  notes = PREV_INSN (notes);
772*e4b17023SJohn Marino 		}
773*e4b17023SJohn Marino 	    }
774*e4b17023SJohn Marino 	}
775*e4b17023SJohn Marino 
776*e4b17023SJohn Marino       if (full_p
777*e4b17023SJohn Marino 	  && (flags & SEL_DUMP_CFG_AV_SET)
778*e4b17023SJohn Marino 	  && in_current_region_p (bb)
779*e4b17023SJohn Marino 	  && !sel_bb_empty_p (bb))
780*e4b17023SJohn Marino 	{
781*e4b17023SJohn Marino 	  fprintf (f, "|");
782*e4b17023SJohn Marino 
783*e4b17023SJohn Marino 	  if (BB_AV_SET_VALID_P (bb))
784*e4b17023SJohn Marino 	    dump_av_set (BB_AV_SET (bb));
785*e4b17023SJohn Marino 	  else if (BB_AV_LEVEL (bb) == -1)
786*e4b17023SJohn Marino 	    fprintf (f, "AV_SET needs update");
787*e4b17023SJohn Marino 	}
788*e4b17023SJohn Marino 
789*e4b17023SJohn Marino       if ((flags & SEL_DUMP_CFG_LV_SET)
790*e4b17023SJohn Marino 	  && !sel_bb_empty_p (bb))
791*e4b17023SJohn Marino  	{
792*e4b17023SJohn Marino 	  fprintf (f, "|");
793*e4b17023SJohn Marino 
794*e4b17023SJohn Marino 	  if (BB_LV_SET_VALID_P (bb))
795*e4b17023SJohn Marino 	    dump_lv_set (BB_LV_SET (bb));
796*e4b17023SJohn Marino 	  else
797*e4b17023SJohn Marino 	    fprintf (f, "LV_SET needs update");
798*e4b17023SJohn Marino 	}
799*e4b17023SJohn Marino 
800*e4b17023SJohn Marino       if (full_p
801*e4b17023SJohn Marino 	  && (flags & SEL_DUMP_CFG_BB_INSNS))
802*e4b17023SJohn Marino 	{
803*e4b17023SJohn Marino 	  fprintf (f, "|");
804*e4b17023SJohn Marino 	  while (insn != next_tail)
805*e4b17023SJohn Marino 	    {
806*e4b17023SJohn Marino 	      sel_dump_cfg_insn (insn, flags);
807*e4b17023SJohn Marino 	      fprintf (f, "\\l");
808*e4b17023SJohn Marino 
809*e4b17023SJohn Marino 	      insn = NEXT_INSN (insn);
810*e4b17023SJohn Marino 	    }
811*e4b17023SJohn Marino 	}
812*e4b17023SJohn Marino 
813*e4b17023SJohn Marino       fprintf (f, "}\"];\n");
814*e4b17023SJohn Marino 
815*e4b17023SJohn Marino       FOR_EACH_EDGE (e, ei, bb->succs)
816*e4b17023SJohn Marino 	if (full_p || in_current_region_p (e->dest))
817*e4b17023SJohn Marino 	  sel_dump_cfg_edge (f, e);
818*e4b17023SJohn Marino     }
819*e4b17023SJohn Marino 
820*e4b17023SJohn Marino   fprintf (f, "}");
821*e4b17023SJohn Marino 
822*e4b17023SJohn Marino   restore_dump ();
823*e4b17023SJohn Marino   sched_dump_to_dot_p = false;
824*e4b17023SJohn Marino }
825*e4b17023SJohn Marino 
826*e4b17023SJohn Marino /* Dump a cfg region to the file specified by TAG honoring flags.
827*e4b17023SJohn Marino    The file is created by the function.  */
828*e4b17023SJohn Marino static void
sel_dump_cfg_1(const char * tag,int flags)829*e4b17023SJohn Marino sel_dump_cfg_1 (const char *tag, int flags)
830*e4b17023SJohn Marino {
831*e4b17023SJohn Marino   char *buf;
832*e4b17023SJohn Marino   int i;
833*e4b17023SJohn Marino   FILE *f;
834*e4b17023SJohn Marino 
835*e4b17023SJohn Marino   ++sel_dump_cfg_fileno;
836*e4b17023SJohn Marino 
837*e4b17023SJohn Marino   if (!sel_dump_cfg_p)
838*e4b17023SJohn Marino     return;
839*e4b17023SJohn Marino 
840*e4b17023SJohn Marino   i = 1 + snprintf (NULL, 0, "%s/%s%05d-%s.dot", sel_debug_cfg_root,
841*e4b17023SJohn Marino 		    sel_debug_cfg_root_postfix, sel_dump_cfg_fileno, tag);
842*e4b17023SJohn Marino   buf = XNEWVEC (char, i);
843*e4b17023SJohn Marino   snprintf (buf, i, "%s/%s%05d-%s.dot", sel_debug_cfg_root,
844*e4b17023SJohn Marino 	    sel_debug_cfg_root_postfix, sel_dump_cfg_fileno, tag);
845*e4b17023SJohn Marino 
846*e4b17023SJohn Marino   f = fopen (buf, "w");
847*e4b17023SJohn Marino 
848*e4b17023SJohn Marino   if (f == NULL)
849*e4b17023SJohn Marino     fprintf (stderr, "Can't create file: %s.\n", buf);
850*e4b17023SJohn Marino   else
851*e4b17023SJohn Marino     {
852*e4b17023SJohn Marino       sel_dump_cfg_2 (f, flags);
853*e4b17023SJohn Marino 
854*e4b17023SJohn Marino       fclose (f);
855*e4b17023SJohn Marino     }
856*e4b17023SJohn Marino 
857*e4b17023SJohn Marino   free (buf);
858*e4b17023SJohn Marino }
859*e4b17023SJohn Marino 
860*e4b17023SJohn Marino /* Setup cfg dumping flags.  Used for debugging.  */
861*e4b17023SJohn Marino void
setup_dump_cfg_params(void)862*e4b17023SJohn Marino setup_dump_cfg_params (void)
863*e4b17023SJohn Marino {
864*e4b17023SJohn Marino   sel_dump_cfg_flags = SEL_DUMP_CFG_FLAGS;
865*e4b17023SJohn Marino   sel_dump_cfg_p = 0;
866*e4b17023SJohn Marino   sel_debug_cfg_root_postfix = sel_debug_cfg_root_postfix_default;
867*e4b17023SJohn Marino }
868*e4b17023SJohn Marino 
869*e4b17023SJohn Marino /* Debug a cfg region with FLAGS.  */
870*e4b17023SJohn Marino void
sel_debug_cfg_1(int flags)871*e4b17023SJohn Marino sel_debug_cfg_1 (int flags)
872*e4b17023SJohn Marino {
873*e4b17023SJohn Marino   bool t1 = sel_dump_cfg_p;
874*e4b17023SJohn Marino   int t2 = sel_dump_cfg_fileno;
875*e4b17023SJohn Marino 
876*e4b17023SJohn Marino   sel_dump_cfg_p = true;
877*e4b17023SJohn Marino   sel_dump_cfg_fileno = ++sel_debug_cfg_fileno;
878*e4b17023SJohn Marino 
879*e4b17023SJohn Marino   sel_dump_cfg_1 ("sel-debug-cfg", flags);
880*e4b17023SJohn Marino 
881*e4b17023SJohn Marino   sel_dump_cfg_fileno = t2;
882*e4b17023SJohn Marino   sel_dump_cfg_p = t1;
883*e4b17023SJohn Marino }
884*e4b17023SJohn Marino 
885*e4b17023SJohn Marino /* Dumps av_set AV to stderr.  */
886*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_av_set(av_set_t av)887*e4b17023SJohn Marino debug_av_set (av_set_t av)
888*e4b17023SJohn Marino {
889*e4b17023SJohn Marino   switch_dump (stderr);
890*e4b17023SJohn Marino   dump_av_set (av);
891*e4b17023SJohn Marino   sel_print ("\n");
892*e4b17023SJohn Marino   restore_dump ();
893*e4b17023SJohn Marino }
894*e4b17023SJohn Marino 
895*e4b17023SJohn Marino /* Dump LV to stderr.  */
896*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_lv_set(regset lv)897*e4b17023SJohn Marino debug_lv_set (regset lv)
898*e4b17023SJohn Marino {
899*e4b17023SJohn Marino   switch_dump (stderr);
900*e4b17023SJohn Marino   dump_lv_set (lv);
901*e4b17023SJohn Marino   sel_print ("\n");
902*e4b17023SJohn Marino   restore_dump ();
903*e4b17023SJohn Marino }
904*e4b17023SJohn Marino 
905*e4b17023SJohn Marino /* Dump an instruction list P to stderr.  */
906*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_ilist(ilist_t p)907*e4b17023SJohn Marino debug_ilist (ilist_t p)
908*e4b17023SJohn Marino {
909*e4b17023SJohn Marino   switch_dump (stderr);
910*e4b17023SJohn Marino   dump_ilist (p);
911*e4b17023SJohn Marino   sel_print ("\n");
912*e4b17023SJohn Marino   restore_dump ();
913*e4b17023SJohn Marino }
914*e4b17023SJohn Marino 
915*e4b17023SJohn Marino /* Dump a boundary list BNDS to stderr.  */
916*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_blist(blist_t bnds)917*e4b17023SJohn Marino debug_blist (blist_t bnds)
918*e4b17023SJohn Marino {
919*e4b17023SJohn Marino   switch_dump (stderr);
920*e4b17023SJohn Marino   dump_blist (bnds);
921*e4b17023SJohn Marino   sel_print ("\n");
922*e4b17023SJohn Marino   restore_dump ();
923*e4b17023SJohn Marino }
924*e4b17023SJohn Marino 
925*e4b17023SJohn Marino /* Dump an insn vector SUCCS.  */
926*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_insn_vector(rtx_vec_t succs)927*e4b17023SJohn Marino debug_insn_vector (rtx_vec_t succs)
928*e4b17023SJohn Marino {
929*e4b17023SJohn Marino   switch_dump (stderr);
930*e4b17023SJohn Marino   dump_insn_vector (succs);
931*e4b17023SJohn Marino   sel_print ("\n");
932*e4b17023SJohn Marino   restore_dump ();
933*e4b17023SJohn Marino }
934*e4b17023SJohn Marino 
935*e4b17023SJohn Marino /* Dump a hard reg set SET to stderr.  */
936*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_hard_reg_set(HARD_REG_SET set)937*e4b17023SJohn Marino debug_hard_reg_set (HARD_REG_SET set)
938*e4b17023SJohn Marino {
939*e4b17023SJohn Marino   switch_dump (stderr);
940*e4b17023SJohn Marino   dump_hard_reg_set ("", set);
941*e4b17023SJohn Marino   sel_print ("\n");
942*e4b17023SJohn Marino   restore_dump ();
943*e4b17023SJohn Marino }
944*e4b17023SJohn Marino 
945*e4b17023SJohn Marino /* Debug a cfg region with default flags.  */
946*e4b17023SJohn Marino void
sel_debug_cfg(void)947*e4b17023SJohn Marino sel_debug_cfg (void)
948*e4b17023SJohn Marino {
949*e4b17023SJohn Marino   sel_debug_cfg_1 (sel_debug_cfg_flags);
950*e4b17023SJohn Marino }
951*e4b17023SJohn Marino 
952*e4b17023SJohn Marino /* Print a current cselib value for X's address to stderr.  */
953*e4b17023SJohn Marino DEBUG_FUNCTION rtx
debug_mem_addr_value(rtx x)954*e4b17023SJohn Marino debug_mem_addr_value (rtx x)
955*e4b17023SJohn Marino {
956*e4b17023SJohn Marino   rtx t, addr;
957*e4b17023SJohn Marino   enum machine_mode address_mode;
958*e4b17023SJohn Marino 
959*e4b17023SJohn Marino   gcc_assert (MEM_P (x));
960*e4b17023SJohn Marino   address_mode = targetm.addr_space.address_mode (MEM_ADDR_SPACE (x));
961*e4b17023SJohn Marino 
962*e4b17023SJohn Marino   t = shallow_copy_rtx (x);
963*e4b17023SJohn Marino   if (cselib_lookup (XEXP (t, 0), address_mode, 0, GET_MODE (t)))
964*e4b17023SJohn Marino     XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0), GET_MODE (t));
965*e4b17023SJohn Marino 
966*e4b17023SJohn Marino   t = canon_rtx (t);
967*e4b17023SJohn Marino   addr = get_addr (XEXP (t, 0));
968*e4b17023SJohn Marino   debug_rtx (t);
969*e4b17023SJohn Marino   debug_rtx (addr);
970*e4b17023SJohn Marino   return t;
971*e4b17023SJohn Marino }
972*e4b17023SJohn Marino #endif
973*e4b17023SJohn Marino 
974