<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>