<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">On 4/4/14 3:02 PM, Hanbing Li wrote:<br>
</div>
<blockquote
cite="mid:155431169.2722035.1396641779298.JavaMail.zimbra@inria.fr"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
<div style="font-family: times new roman, new york, times, serif;
font-size: 12pt; color: #000000">
<div>
<p style="margin: 0px; font-size: 12px; font-family:
Helvetica;" data-mce-style="margin: 0px; font-size: 12px;
font-family: Helvetica;">Hello,</p>
<p style="margin: 0px; font-size: 12px; font-family:
Helvetica; min-height: 14px;" data-mce-style="margin: 0px;
font-size: 12px; font-family: Helvetica; min-height: 14px;"><br>
</p>
<p style="margin: 0px; font-size: 12px; font-family:
Helvetica;" data-mce-style="margin: 0px; font-size: 12px;
font-family: Helvetica;"><span class="Apple-tab-span"
style="white-space: pre;" data-mce-style="white-space:
pre;"> </span>I am trying to add some thing into LLVM,
while I encountered some problems.</p>
<p style="margin: 0px; font-size: 12px; font-family:
Helvetica; min-height: 14px;" data-mce-style="margin: 0px;
font-size: 12px; font-family: Helvetica; min-height: 14px;"><br>
</p>
<p style="margin: 0px; font-size: 12px; font-family:
Helvetica;" data-mce-style="margin: 0px; font-size: 12px;
font-family: Helvetica;"><span class="Apple-tab-span"
style="white-space: pre;" data-mce-style="white-space:
pre;"> </span>So my situation is that I have some
information W, some transform passes may change it, after
these passes, I need the new W. What I did is to create an
analysis pass similar to scalar-evolution or loopinfo, I can
get the information by using getAnalysis<W>(); and
preserve this information W by using
AU.addPreserved<W>();. Then the problem came, for the
module pass, the information can’t be preserved. (I found
this: <span style="font-size: 13px; font-family: Courier;"
data-mce-style="font-size: 13px; font-family: Courier;">To
the best of my knowledge, the LLVM pass manager never
preserves a FunctionPass analysis that is requested by a
ModulePass; every time you call getAnalysis for a
function, the FunctionPass is re-run.
<a class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-March/048139.html">http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-March/048139.html</a></span>)
So this means that I can’t update W when some module passes
changed it?</p>
<p style="margin: 0px; font-size: 12px; font-family:
Helvetica; min-height: 14px;" data-mce-style="margin: 0px;
font-size: 12px; font-family: Helvetica; min-height: 14px;"><br>
</p>
<p style="margin: 0px; font-size: 12px; font-family:
Helvetica;" data-mce-style="margin: 0px; font-size: 12px;
font-family: Helvetica;">My questions are:</p>
<p style="margin: 0px; font-size: 12px; font-family:
Helvetica;" data-mce-style="margin: 0px; font-size: 12px;
font-family: Helvetica;">1, Module pass really can’t
preserve the W?</p>
</div>
</div>
</blockquote>
<br>
If W is a FunctionPass, then I believe you are correct: a ModulePass
will re-run the FunctionPass every time it uses the FunctionPass.<br>
<br>
I get the impression that you're using the PassManager
infrastructure improperly, and that is probably why you're not
getting the results you want.<br>
<br>
First, the ability to preserve a pass's results with
addPreserved<W>() is an optimization. A FunctionPass or
ModulePass() that analyzes the LLVM IR should work whether it is run
one time or a hundred times. The addPreserved<>()
functionality is only there so that the LLVM compiler can cache the
results of analysis passes for efficiency.<br>
<br>
Second, the way to fix your problem depends on what you want to do.
If you want pass W to analyze the LLVM IR of a program and cache its
results (because the analysis it does is expensive), then make it a
ModulePass. That way, other ModulePass'es can update and preserve
its results.<br>
<br>
If you are just using W as a container in which to record
information that transform passes are doing, then you might want to
make W an ImmutablePass. ImmutablePasses are only run once and are
never invalidated; other passes can use them to record information
about what they do. ImmutablePasses, I think, were not really
designed for this purpose, but they'll get the job done.<br>
<br>
Regards,<br>
<br>
John Criswell<br>
<br>
</body>
</html>