Skip to content

Commit 169f642

Browse files
committedFeb 6, 2019
[opt-viewer] Add --filter option to select remarks for displaying.
This allows limiting the displayed remarks to the ones with names matching the filter (regular) expression. Generating html pages for a larger project with optimization remarks can result in a huge HTML documents and using --filter allows to focus on a set of interesting remarks. Reviewers: hfinkel, anemet, thegameg, serge-sans-paille Reviewed By: anemet Differential Revision: https://reviews.llvm.org/D57827 llvm-svn: 353322
1 parent feeedaf commit 169f642

File tree

7 files changed

+631
-9
lines changed

7 files changed

+631
-9
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
2+
<html>
3+
<title>or.c</title>
4+
<meta charset="utf-8" />
5+
<head>
6+
<link rel='stylesheet' type='text/css' href='style.css'>
7+
<script type="text/javascript">
8+
/* Simple helper to show/hide the expanded message of a remark. */
9+
function toggleExpandedMessage(e) {
10+
var FullTextElems = e.parentElement.parentElement.getElementsByClassName("full-info");
11+
if (!FullTextElems || FullTextElems.length < 1) {
12+
return false;
13+
}
14+
var FullText = FullTextElems[0];
15+
if (FullText.style.display == 'none') {
16+
e.innerHTML = '-';
17+
FullText.style.display = 'block';
18+
} else {
19+
e.innerHTML = '+';
20+
FullText.style.display = 'none';
21+
}
22+
}
23+
</script>
24+
</head>
25+
<body>
26+
<div class="centered">
27+
<table class="source">
28+
<thead>
29+
<tr>
30+
<th style="width: 2%">Line</td>
31+
<th style="width: 3%">Hotness</td>
32+
<th style="width: 10%">Optimization</td>
33+
<th style="width: 70%">Source</td>
34+
<th style="width: 15%">Inline Context</td>
35+
</tr>
36+
</thead>
37+
<tbody>
38+
39+
<tr>
40+
<td><a name="L1">1</a></td>
41+
<td></td>
42+
<td></td>
43+
<td><div class="highlight"><pre>void bar();</pre></div></td>
44+
</tr>
45+
46+
<tr>
47+
<td><a name="L2">2</a></td>
48+
<td></td>
49+
<td></td>
50+
<td><div class="highlight"><pre>void foo() { bar(); }</pre></div></td>
51+
</tr>
52+
53+
<tr>
54+
<td></td>
55+
<td></td>
56+
<td class="column-entry-red">inline</td>
57+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> bar will not be inlined into foo because its definition is unavailable&nbsp;</span></td>
58+
<td class="column-entry-yellow">foo</td>
59+
</tr>
60+
61+
<tr>
62+
<td><a name="L3">3</a></td>
63+
<td></td>
64+
<td></td>
65+
<td><div class="highlight"><pre></pre></div></td>
66+
</tr>
67+
68+
<tr>
69+
<td><a name="L4">4</a></td>
70+
<td></td>
71+
<td></td>
72+
<td><div class="highlight"><pre>#include "or.h"</pre></div></td>
73+
</tr>
74+
75+
<tr>
76+
<td><a name="L5">5</a></td>
77+
<td></td>
78+
<td></td>
79+
<td><div class="highlight"><pre></pre></div></td>
80+
</tr>
81+
82+
<tr>
83+
<td><a name="L6">6</a></td>
84+
<td></td>
85+
<td></td>
86+
<td><div class="highlight"><pre>void Test(int *res, int *c, int *d, int *p, int n) {</pre></div></td>
87+
</tr>
88+
89+
<tr>
90+
<td><a name="L7">7</a></td>
91+
<td></td>
92+
<td></td>
93+
<td><div class="highlight"><pre> int i;</pre></div></td>
94+
</tr>
95+
96+
<tr>
97+
<td><a name="L8">8</a></td>
98+
<td></td>
99+
<td></td>
100+
<td><div class="highlight"><pre></pre></div></td>
101+
</tr>
102+
103+
<tr>
104+
<td><a name="L9">9</a></td>
105+
<td></td>
106+
<td></td>
107+
<td><div class="highlight"><pre>#pragma clang loop vectorize(assume_safety)</pre></div></td>
108+
</tr>
109+
110+
<tr>
111+
<td><a name="L10">10</a></td>
112+
<td></td>
113+
<td></td>
114+
<td><div class="highlight"><pre> for (i = 0; i < 1600; i++) {</pre></div></td>
115+
</tr>
116+
117+
<tr>
118+
<td><a name="L11">11</a></td>
119+
<td></td>
120+
<td></td>
121+
<td><div class="highlight"><pre> res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];</pre></div></td>
122+
</tr>
123+
124+
<tr>
125+
<td><a name="L12">12</a></td>
126+
<td></td>
127+
<td></td>
128+
<td><div class="highlight"><pre> }</pre></div></td>
129+
</tr>
130+
131+
<tr>
132+
<td><a name="L13">13</a></td>
133+
<td></td>
134+
<td></td>
135+
<td><div class="highlight"><pre></pre></div></td>
136+
</tr>
137+
138+
<tr>
139+
<td><a name="L14">14</a></td>
140+
<td></td>
141+
<td></td>
142+
<td><div class="highlight"><pre> for (i = 0; i < 16; i++) {</pre></div></td>
143+
</tr>
144+
145+
<tr>
146+
<td><a name="L15">15</a></td>
147+
<td></td>
148+
<td></td>
149+
<td><div class="highlight"><pre> res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];</pre></div></td>
150+
</tr>
151+
152+
<tr>
153+
<td><a name="L16">16</a></td>
154+
<td></td>
155+
<td></td>
156+
<td><div class="highlight"><pre> }</pre></div></td>
157+
</tr>
158+
159+
<tr>
160+
<td><a name="L17">17</a></td>
161+
<td></td>
162+
<td></td>
163+
<td><div class="highlight"><pre></pre></div></td>
164+
</tr>
165+
166+
<tr>
167+
<td><a name="L18">18</a></td>
168+
<td></td>
169+
<td></td>
170+
<td><div class="highlight"><pre> foo();</pre></div></td>
171+
</tr>
172+
173+
<tr>
174+
<td></td>
175+
<td></td>
176+
<td class="column-entry-white">inline</td>
177+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into Test with cost=30 (threshold=412)&nbsp;</span></td>
178+
<td class="column-entry-yellow">Test</td>
179+
</tr>
180+
181+
<tr>
182+
<td></td>
183+
<td></td>
184+
<td class="column-entry-green">inline</td>
185+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into Test&nbsp;</span></td>
186+
<td class="column-entry-yellow">Test</td>
187+
</tr>
188+
189+
<tr>
190+
<td><a name="L19">19</a></td>
191+
<td></td>
192+
<td></td>
193+
<td><div class="highlight"><pre></pre></div></td>
194+
</tr>
195+
196+
<tr>
197+
<td><a name="L20">20</a></td>
198+
<td></td>
199+
<td></td>
200+
<td><div class="highlight"><pre> foo(); bar(); foo();</pre></div></td>
201+
</tr>
202+
203+
<tr>
204+
<td></td>
205+
<td></td>
206+
<td class="column-entry-red">inline</td>
207+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> bar will not be inlined into Test because its definition is unavailable&nbsp;</span></td>
208+
<td class="column-entry-yellow">Test</td>
209+
</tr>
210+
211+
<tr>
212+
<td></td>
213+
<td></td>
214+
<td class="column-entry-white">inline</td>
215+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into Test with cost=30 (threshold=412)&nbsp;</span></td>
216+
<td class="column-entry-yellow">Test</td>
217+
</tr>
218+
219+
<tr>
220+
<td></td>
221+
<td></td>
222+
<td class="column-entry-green">inline</td>
223+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into Test&nbsp;</span></td>
224+
<td class="column-entry-yellow">Test</td>
225+
</tr>
226+
227+
<tr>
228+
<td></td>
229+
<td></td>
230+
<td class="column-entry-white">inline</td>
231+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into Test with cost=30 (threshold=412)&nbsp;</span></td>
232+
<td class="column-entry-yellow">Test</td>
233+
</tr>
234+
235+
<tr>
236+
<td></td>
237+
<td></td>
238+
<td class="column-entry-green">inline</td>
239+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into Test&nbsp;</span></td>
240+
<td class="column-entry-yellow">Test</td>
241+
</tr>
242+
243+
<tr>
244+
<td><a name="L21">21</a></td>
245+
<td></td>
246+
<td></td>
247+
<td><div class="highlight"><pre>}</pre></div></td>
248+
</tr>
249+
250+
<tr>
251+
<td><a name="L22">22</a></td>
252+
<td></td>
253+
<td></td>
254+
<td><div class="highlight"><pre></pre></div></td>
255+
</tr>
256+
257+
</tbody>
258+
</table>
259+
</body>
260+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
2+
<html>
3+
<title>or.h</title>
4+
<meta charset="utf-8" />
5+
<head>
6+
<link rel='stylesheet' type='text/css' href='style.css'>
7+
<script type="text/javascript">
8+
/* Simple helper to show/hide the expanded message of a remark. */
9+
function toggleExpandedMessage(e) {
10+
var FullTextElems = e.parentElement.parentElement.getElementsByClassName("full-info");
11+
if (!FullTextElems || FullTextElems.length < 1) {
12+
return false;
13+
}
14+
var FullText = FullTextElems[0];
15+
if (FullText.style.display == 'none') {
16+
e.innerHTML = '-';
17+
FullText.style.display = 'block';
18+
} else {
19+
e.innerHTML = '+';
20+
FullText.style.display = 'none';
21+
}
22+
}
23+
</script>
24+
</head>
25+
<body>
26+
<div class="centered">
27+
<table class="source">
28+
<thead>
29+
<tr>
30+
<th style="width: 2%">Line</td>
31+
<th style="width: 3%">Hotness</td>
32+
<th style="width: 10%">Optimization</td>
33+
<th style="width: 70%">Source</td>
34+
<th style="width: 15%">Inline Context</td>
35+
</tr>
36+
</thead>
37+
<tbody>
38+
39+
<tr>
40+
<td><a name="L1">1</a></td>
41+
<td></td>
42+
<td></td>
43+
<td><div class="highlight"><pre>void TestH(int *res, int *c, int *d, int *p, int n) {</pre></div></td>
44+
</tr>
45+
46+
<tr>
47+
<td><a name="L2">2</a></td>
48+
<td></td>
49+
<td></td>
50+
<td><div class="highlight"><pre> int i;</pre></div></td>
51+
</tr>
52+
53+
<tr>
54+
<td><a name="L3">3</a></td>
55+
<td></td>
56+
<td></td>
57+
<td><div class="highlight"><pre></pre></div></td>
58+
</tr>
59+
60+
<tr>
61+
<td><a name="L4">4</a></td>
62+
<td></td>
63+
<td></td>
64+
<td><div class="highlight"><pre>#pragma clang loop vectorize(assume_safety)</pre></div></td>
65+
</tr>
66+
67+
<tr>
68+
<td><a name="L5">5</a></td>
69+
<td></td>
70+
<td></td>
71+
<td><div class="highlight"><pre> for (i = 0; i < 1600; i++) {</pre></div></td>
72+
</tr>
73+
74+
<tr>
75+
<td><a name="L6">6</a></td>
76+
<td></td>
77+
<td></td>
78+
<td><div class="highlight"><pre> res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];</pre></div></td>
79+
</tr>
80+
81+
<tr>
82+
<td><a name="L7">7</a></td>
83+
<td></td>
84+
<td></td>
85+
<td><div class="highlight"><pre> }</pre></div></td>
86+
</tr>
87+
88+
<tr>
89+
<td><a name="L8">8</a></td>
90+
<td></td>
91+
<td></td>
92+
<td><div class="highlight"><pre></pre></div></td>
93+
</tr>
94+
95+
<tr>
96+
<td><a name="L9">9</a></td>
97+
<td></td>
98+
<td></td>
99+
<td><div class="highlight"><pre> for (i = 0; i < 16; i++) {</pre></div></td>
100+
</tr>
101+
102+
<tr>
103+
<td><a name="L10">10</a></td>
104+
<td></td>
105+
<td></td>
106+
<td><div class="highlight"><pre> res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];</pre></div></td>
107+
</tr>
108+
109+
<tr>
110+
<td><a name="L11">11</a></td>
111+
<td></td>
112+
<td></td>
113+
<td><div class="highlight"><pre> }</pre></div></td>
114+
</tr>
115+
116+
<tr>
117+
<td><a name="L12">12</a></td>
118+
<td></td>
119+
<td></td>
120+
<td><div class="highlight"><pre></pre></div></td>
121+
</tr>
122+
123+
<tr>
124+
<td><a name="L13">13</a></td>
125+
<td></td>
126+
<td></td>
127+
<td><div class="highlight"><pre> foo();</pre></div></td>
128+
</tr>
129+
130+
<tr>
131+
<td></td>
132+
<td></td>
133+
<td class="column-entry-white">inline</td>
134+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into TestH with cost=30 (threshold=412)&nbsp;</span></td>
135+
<td class="column-entry-yellow">TestH</td>
136+
</tr>
137+
138+
<tr>
139+
<td></td>
140+
<td></td>
141+
<td class="column-entry-green">inline</td>
142+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into TestH&nbsp;</span></td>
143+
<td class="column-entry-yellow">TestH</td>
144+
</tr>
145+
146+
<tr>
147+
<td><a name="L14">14</a></td>
148+
<td></td>
149+
<td></td>
150+
<td><div class="highlight"><pre></pre></div></td>
151+
</tr>
152+
153+
<tr>
154+
<td><a name="L15">15</a></td>
155+
<td></td>
156+
<td></td>
157+
<td><div class="highlight"><pre> foo(); bar(); foo();</pre></div></td>
158+
</tr>
159+
160+
<tr>
161+
<td></td>
162+
<td></td>
163+
<td class="column-entry-red">inline</td>
164+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> bar will not be inlined into TestH because its definition is unavailable&nbsp;</span></td>
165+
<td class="column-entry-yellow">TestH</td>
166+
</tr>
167+
168+
<tr>
169+
<td></td>
170+
<td></td>
171+
<td class="column-entry-white">inline</td>
172+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into TestH with cost=30 (threshold=412)&nbsp;</span></td>
173+
<td class="column-entry-yellow">TestH</td>
174+
</tr>
175+
176+
<tr>
177+
<td></td>
178+
<td></td>
179+
<td class="column-entry-green">inline</td>
180+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into TestH&nbsp;</span></td>
181+
<td class="column-entry-yellow">TestH</td>
182+
</tr>
183+
184+
<tr>
185+
<td></td>
186+
<td></td>
187+
<td class="column-entry-white">inline</td>
188+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into TestH with cost=30 (threshold=412)&nbsp;</span></td>
189+
<td class="column-entry-yellow">TestH</td>
190+
</tr>
191+
192+
<tr>
193+
<td></td>
194+
<td></td>
195+
<td class="column-entry-green">inline</td>
196+
<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into TestH&nbsp;</span></td>
197+
<td class="column-entry-yellow">TestH</td>
198+
</tr>
199+
200+
<tr>
201+
<td><a name="L16">16</a></td>
202+
<td></td>
203+
<td></td>
204+
<td><div class="highlight"><pre>}</pre></div></td>
205+
</tr>
206+
207+
<tr>
208+
<td><a name="L17">17</a></td>
209+
<td></td>
210+
<td></td>
211+
<td><div class="highlight"><pre></pre></div></td>
212+
</tr>
213+
214+
</tbody>
215+
</table>
216+
</body>
217+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
2+
<html>
3+
<meta charset="utf-8" />
4+
<head>
5+
<link rel='stylesheet' type='text/css' href='style.css'>
6+
</head>
7+
<body>
8+
<div class="centered">
9+
<table>
10+
<tr>
11+
<td>Source Location</td>
12+
<td>Hotness</td>
13+
<td>Function</td>
14+
<td>Pass</td>
15+
</tr>
16+
17+
<tr>
18+
<td class="column-entry-0"><a href="basic_or.c.html#L2">basic/or.c:2:14</a></td>
19+
<td class="column-entry-0"></td>
20+
<td class="column-entry-0">foo</td>
21+
<td class="column-entry-red">inline</td>
22+
</tr>
23+
24+
<tr>
25+
<td class="column-entry-1"><a href="basic_or.c.html#L18">basic/or.c:18:3</a></td>
26+
<td class="column-entry-1"></td>
27+
<td class="column-entry-1">Test</td>
28+
<td class="column-entry-white">inline</td>
29+
</tr>
30+
31+
<tr>
32+
<td class="column-entry-0"><a href="basic_or.c.html#L18">basic/or.c:18:3</a></td>
33+
<td class="column-entry-0"></td>
34+
<td class="column-entry-0">Test</td>
35+
<td class="column-entry-green">inline</td>
36+
</tr>
37+
38+
<tr>
39+
<td class="column-entry-1"><a href="basic_or.c.html#L20">basic/or.c:20:3</a></td>
40+
<td class="column-entry-1"></td>
41+
<td class="column-entry-1">Test</td>
42+
<td class="column-entry-white">inline</td>
43+
</tr>
44+
45+
<tr>
46+
<td class="column-entry-0"><a href="basic_or.c.html#L20">basic/or.c:20:3</a></td>
47+
<td class="column-entry-0"></td>
48+
<td class="column-entry-0">Test</td>
49+
<td class="column-entry-green">inline</td>
50+
</tr>
51+
52+
<tr>
53+
<td class="column-entry-1"><a href="basic_or.c.html#L20">basic/or.c:20:10</a></td>
54+
<td class="column-entry-1"></td>
55+
<td class="column-entry-1">Test</td>
56+
<td class="column-entry-red">inline</td>
57+
</tr>
58+
59+
<tr>
60+
<td class="column-entry-0"><a href="basic_or.c.html#L20">basic/or.c:20:17</a></td>
61+
<td class="column-entry-0"></td>
62+
<td class="column-entry-0">Test</td>
63+
<td class="column-entry-white">inline</td>
64+
</tr>
65+
66+
<tr>
67+
<td class="column-entry-1"><a href="basic_or.c.html#L20">basic/or.c:20:17</a></td>
68+
<td class="column-entry-1"></td>
69+
<td class="column-entry-1">Test</td>
70+
<td class="column-entry-green">inline</td>
71+
</tr>
72+
73+
<tr>
74+
<td class="column-entry-0"><a href="basic_or.h.html#L13">basic/or.h:13:3</a></td>
75+
<td class="column-entry-0"></td>
76+
<td class="column-entry-0">TestH</td>
77+
<td class="column-entry-white">inline</td>
78+
</tr>
79+
80+
<tr>
81+
<td class="column-entry-1"><a href="basic_or.h.html#L13">basic/or.h:13:3</a></td>
82+
<td class="column-entry-1"></td>
83+
<td class="column-entry-1">TestH</td>
84+
<td class="column-entry-green">inline</td>
85+
</tr>
86+
87+
<tr>
88+
<td class="column-entry-0"><a href="basic_or.h.html#L15">basic/or.h:15:3</a></td>
89+
<td class="column-entry-0"></td>
90+
<td class="column-entry-0">TestH</td>
91+
<td class="column-entry-white">inline</td>
92+
</tr>
93+
94+
<tr>
95+
<td class="column-entry-1"><a href="basic_or.h.html#L15">basic/or.h:15:3</a></td>
96+
<td class="column-entry-1"></td>
97+
<td class="column-entry-1">TestH</td>
98+
<td class="column-entry-green">inline</td>
99+
</tr>
100+
101+
<tr>
102+
<td class="column-entry-0"><a href="basic_or.h.html#L15">basic/or.h:15:10</a></td>
103+
<td class="column-entry-0"></td>
104+
<td class="column-entry-0">TestH</td>
105+
<td class="column-entry-red">inline</td>
106+
</tr>
107+
108+
<tr>
109+
<td class="column-entry-1"><a href="basic_or.h.html#L15">basic/or.h:15:17</a></td>
110+
<td class="column-entry-1"></td>
111+
<td class="column-entry-1">TestH</td>
112+
<td class="column-entry-white">inline</td>
113+
</tr>
114+
115+
<tr>
116+
<td class="column-entry-0"><a href="basic_or.h.html#L15">basic/or.h:15:17</a></td>
117+
<td class="column-entry-0"></td>
118+
<td class="column-entry-0">TestH</td>
119+
<td class="column-entry-green">inline</td>
120+
</tr>
121+
122+
</table>
123+
</body>
124+
</html>
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Since we're performing a full compare of the generate HTML files disable
2+
# syntax highlighting; pygments generates slightly different code with
3+
# different versions.
4+
5+
RUN: %opt-viewer --filter inline -s %p/Inputs -o %t %p/Inputs/basic/or.yaml --no-highlight --demangler=llvm-cxxfilt
6+
RUN: diff %p/Outputs/filter/index.html %t/index.html
7+
RUN: diff %p/Outputs/filter/basic_or.h.html %t/basic_or.h.html
8+
RUN: diff %p/Outputs/filter/basic_or.c.html %t/basic_or.c.html

‎llvm/tools/opt-viewer/opt-viewer.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def render(self, all_remarks):
239239
</html>''', file=self.stream)
240240

241241

242-
def _render_file(source_dir, output_dir, ctx, no_highlight, entry):
242+
def _render_file(source_dir, output_dir, ctx, no_highlight, entry, filter_):
243243
global context
244244
context = ctx
245245
filename, remarks = entry
@@ -344,6 +344,11 @@ def main():
344344
'--demangler',
345345
help='Set the demangler to be used (defaults to %s)' % optrecord.Remark.default_demangler)
346346

347+
parser.add_argument(
348+
'--filter',
349+
default='',
350+
help='Only display remarks from passes matching filter expression')
351+
347352
# Do not make this a global variable. Values needed to be propagated through
348353
# to individual classes and functions to be portable with multiprocessing across
349354
# Windows and non-Windows.
@@ -359,7 +364,7 @@ def main():
359364
sys.exit(1)
360365

361366
all_remarks, file_remarks, should_display_hotness = \
362-
optrecord.gather_results(files, args.jobs, print_progress)
367+
optrecord.gather_results(files, args.jobs, print_progress, args.filter)
363368

364369
map_remarks(all_remarks)
365370

‎llvm/tools/opt-viewer/optpmap.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ def _init(current, total):
1414

1515

1616
def _wrapped_func(func_and_args):
17-
func, argument, should_print_progress = func_and_args
17+
func, argument, should_print_progress, filter_ = func_and_args
1818

1919
if should_print_progress:
2020
with _current.get_lock():
2121
_current.value += 1
2222
sys.stdout.write('\r\t{} of {}'.format(_current.value, _total.value))
2323
sys.stdout.flush()
2424

25-
return func(argument)
25+
return func(argument, filter_)
2626

2727

28-
def pmap(func, iterable, processes, should_print_progress, *args, **kwargs):
28+
def pmap(func, iterable, processes, should_print_progress, filter_=None, *args, **kwargs):
2929
"""
3030
A parallel map function that reports on its progress.
3131
@@ -40,7 +40,7 @@ def pmap(func, iterable, processes, should_print_progress, *args, **kwargs):
4040
_current = multiprocessing.Value('i', 0)
4141
_total = multiprocessing.Value('i', len(iterable))
4242

43-
func_and_args = [(func, arg, should_print_progress,) for arg in iterable]
43+
func_and_args = [(func, arg, should_print_progress, filter_) for arg in iterable]
4444
if processes == 1:
4545
result = list(map(_wrapped_func, func_and_args, *args, **kwargs))
4646
else:

‎llvm/tools/opt-viewer/optrecord.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
except:
2525
pass
2626

27+
import re
28+
2729
import optpmap
2830

2931
try:
@@ -263,18 +265,24 @@ def color(self):
263265
return "red"
264266

265267

266-
def get_remarks(input_file):
268+
def get_remarks(input_file, filter_):
267269
max_hotness = 0
268270
all_remarks = dict()
269271
file_remarks = defaultdict(functools.partial(defaultdict, list))
270272

271273
with open(input_file) as f:
272274
docs = yaml.load_all(f, Loader=Loader)
275+
276+
filter_e = re.compile(filter_)
273277
for remark in docs:
274278
remark.canonicalize()
275279
# Avoid remarks withoug debug location or if they are duplicated
276280
if not hasattr(remark, 'DebugLoc') or remark.key in all_remarks:
277281
continue
282+
283+
if filter_ and not filter_e.search(remark.Pass):
284+
continue
285+
278286
all_remarks[remark.key] = remark
279287

280288
file_remarks[remark.File][remark.Line].append(remark)
@@ -289,13 +297,13 @@ def get_remarks(input_file):
289297
return max_hotness, all_remarks, file_remarks
290298

291299

292-
def gather_results(filenames, num_jobs, should_print_progress):
300+
def gather_results(filenames, num_jobs, should_print_progress, filter_):
293301
if should_print_progress:
294302
print('Reading YAML files...')
295303
if not Remark.demangler_proc:
296304
Remark.set_demangler(Remark.default_demangler)
297305
remarks = optpmap.pmap(
298-
get_remarks, filenames, num_jobs, should_print_progress)
306+
get_remarks, filenames, num_jobs, should_print_progress, filter_)
299307
max_hotness = max(entry[0] for entry in remarks)
300308

301309
def merge_file_remarks(file_remarks_job, all_remarks, merged):

0 commit comments

Comments
 (0)
Please sign in to comment.