<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi,<div class=""><br class=""></div><div class="">Did you get Chandler approval before committing as it was requested during the review?</div><div class=""><br class=""></div><div class="">— </div><div class="">Mehdi</div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 13, 2017, at 3:20 AM, Serge Pavlov via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi Tobias,<div class=""><br class=""></div><div class="">Thank you for fixing it.</div><div class="">It looks like none of the region passes in main llvm repository is an analysis, otherwise the bug should have been caught during check-llvm.</div><div class="gmail_extra"><br clear="all" class=""><div class=""><div class="gmail_signature" data-smartmail="gmail_signature">Thanks,<br class="">--Serge<br class=""></div></div>
<br class=""><div class="gmail_quote">2017-01-13 16:13 GMT+07:00 Tobias Grosser <span dir="ltr" class=""><<a href="mailto:tobias.grosser@inf.ethz.ch" target="_blank" class="">tobias.grosser@inf.ethz.ch</a>></span>:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Serge,<br class="">
<br class="">
this change broke the RegionPasses used by Polly. I tried to fix the<br class="">
problem in<br class="">
r291887, but would appreciate if you could post-commit review the fix I<br class="">
committed.<br class="">
<br class="">
Best,<br class="">
Tobias<br class="">
<div class="HOEnZb"><div class="h5"><br class="">
On Fri, Jan 13, 2017, at 07:09 AM, Serge Pavlov via llvm-commits wrote:<br class="">
> Author: sepavloff<br class="">
> Date: Fri Jan 13 00:09:54 2017<br class="">
> New Revision: 291882<br class="">
><br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=291882&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project?rev=291882&view=rev</a><br class="">
> Log:<br class="">
> Track validity of pass results<br class="">
><br class="">
> Running tests with expensive checks enabled exhibits some problems with<br class="">
> verification of pass results.<br class="">
><br class="">
> First, the pass verification may require results of analysis that are not<br class="">
> available. For instance, verification of loop info requires results of<br class="">
> dominator<br class="">
> tree analysis. A pass may be marked as conserving loop info but does not<br class="">
> need to<br class="">
> be dependent on DominatorTreePass. When a pass manager tries to verify<br class="">
> that loop<br class="">
> info is valid, it needs dominator tree, but corresponding analysis may be<br class="">
> already destroyed as no user of it remained.<br class="">
><br class="">
> Another case is a pass that is skipped. For instance, entities with<br class="">
> linkage<br class="">
> available_externally do not need code generation and such passes are<br class="">
> skipped for<br class="">
> them. In this case result verification must also be skipped.<br class="">
><br class="">
> To solve these problems this change introduces a special flag to the Pass<br class="">
> structure to mark passes that have valid results. If this flag is reset,<br class="">
> verifications dependent on the pass result are skipped.<br class="">
><br class="">
> Differential Revision: <a href="https://reviews.llvm.org/D27190" rel="noreferrer" target="_blank" class="">https://reviews.llvm.org/<wbr class="">D27190</a><br class="">
><br class="">
> Modified:<br class="">
>     llvm/trunk/include/llvm/Pass.h<br class="">
>     llvm/trunk/include/llvm/<wbr class="">PassAnalysisSupport.h<br class="">
>     llvm/trunk/lib/Analysis/<wbr class="">CallGraphSCCPass.cpp<br class="">
>     llvm/trunk/lib/Analysis/<wbr class="">LoopInfo.cpp<br class="">
>     llvm/trunk/lib/Analysis/<wbr class="">LoopPass.cpp<br class="">
>     llvm/trunk/lib/CodeGen/<wbr class="">MachineDominators.cpp<br class="">
>     llvm/trunk/lib/CodeGen/<wbr class="">MachineFunctionPass.cpp<br class="">
>     llvm/trunk/lib/IR/<wbr class="">LegacyPassManager.cpp<br class="">
>     llvm/trunk/lib/IR/Pass.cpp<br class="">
>     llvm/trunk/test/CodeGen/<wbr class="">Generic/externally_available.<wbr class="">ll<br class="">
>     llvm/trunk/test/CodeGen/Mips/<wbr class="">mul.ll<br class="">
><br class="">
> Modified: llvm/trunk/include/llvm/Pass.h<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Pass.h?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/include/<wbr class="">llvm/Pass.h?rev=291882&r1=<wbr class="">291881&r2=291882&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/include/llvm/Pass.h (original)<br class="">
> +++ llvm/trunk/include/llvm/Pass.h Fri Jan 13 00:09:54 2017<br class="">
> @@ -29,6 +29,7 @@<br class="">
>  #ifndef LLVM_PASS_H<br class="">
>  #define LLVM_PASS_H<br class="">
><br class="">
> +#include <assert.h><br class="">
>  #include <string><br class="">
><br class="">
>  namespace llvm {<br class="">
> @@ -82,17 +83,40 @@ class Pass {<br class="">
>    AnalysisResolver *Resolver;  // Used to resolve analysis<br class="">
>    const void *PassID;<br class="">
>    PassKind Kind;<br class="">
> +  bool Executed;<br class="">
> +<br class="">
>    void operator=(const Pass&) = delete;<br class="">
>    Pass(const Pass &) = delete;<br class="">
><br class="">
>  public:<br class="">
>    explicit Pass(PassKind K, char &pid)<br class="">
> -    : Resolver(nullptr), PassID(&pid), Kind(K) { }<br class="">
> +    : Resolver(nullptr), PassID(&pid), Kind(K), Executed(false) { }<br class="">
>    virtual ~Pass();<br class="">
><br class="">
> -<br class="">
>    PassKind getPassKind() const { return Kind; }<br class="">
><br class="">
> +  /// Returns true if the pass has already executed.<br class="">
> +  ///<br class="">
> +  /// For an analysis pass it means the result is available. If the<br class="">
> function<br class="">
> +  /// returns false, the pass was not run, was skipped or freed.<br class="">
> +  ///<br class="">
> +  bool isExecuted() const { return Executed; }<br class="">
> +<br class="">
> +  /// Marks the pass as executed or not.<br class="">
> +  ///<br class="">
> +  /// A pass should be marked as executed, if its 'runOn*' method<br class="">
> successfully<br class="">
> +  /// finished. When the pass is not needed anymore, it is marked as<br class="">
> +  /// 'non-executed', it takes place in \c freePass. It also occurs when<br class="">
> the<br class="">
> +  /// pass is skipped for some reason.<br class="">
> +  ///<br class="">
> +  /// The flag should be set prior to call to 'runOn*' method. If it<br class="">
> decides<br class="">
> +  /// that the pass should be skipped, it will reset the flag.<br class="">
> +  ///<br class="">
> +  void setExecuted(bool x) {<br class="">
> +    assert(x || !getAsImmutablePass()); // Immutable pass cannot be<br class="">
> invalidated.<br class="">
> +    Executed = x;<br class="">
> +  }<br class="">
> +<br class="">
>    /// getPassName - Return a nice clean name for a pass.  This usually<br class="">
>    /// implemented in terms of the name that is registered by one of the<br class="">
>    /// Registration templates, but can be overloaded directly.<br class="">
> @@ -279,8 +303,7 @@ public:<br class="">
>    ///<br class="">
>    bool runOnModule(Module &) override { return false; }<br class="">
><br class="">
> -  explicit ImmutablePass(char &pid)<br class="">
> -  : ModulePass(pid) {}<br class="">
> +  explicit ImmutablePass(char &pid) : ModulePass(pid) {<br class="">
> setExecuted(true); }<br class="">
><br class="">
>    // Force out-of-line virtual method.<br class="">
>    ~ImmutablePass() override;<br class="">
> @@ -316,8 +339,9 @@ public:<br class="">
>  protected:<br class="">
>    /// Optional passes call this function to check whether the pass<br class="">
>    should be<br class="">
>    /// skipped. This is the case when Attribute::OptimizeNone is set or<br class="">
>    when<br class="">
> -  /// optimization bisect is over the limit.<br class="">
> -  bool skipFunction(const Function &F) const;<br class="">
> +  /// optimization bisect is over the limit. It also resets flag<br class="">
> Executed on<br class="">
> +  /// the pass.<br class="">
> +  bool skipFunction(const Function &F);<br class="">
>  };<br class="">
><br class="">
><br class="">
><br class="">
> Modified: llvm/trunk/include/llvm/<wbr class="">PassAnalysisSupport.h<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassAnalysisSupport.h?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/include/<wbr class="">llvm/PassAnalysisSupport.h?<wbr class="">rev=291882&r1=291881&r2=<wbr class="">291882&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/include/llvm/<wbr class="">PassAnalysisSupport.h (original)<br class="">
> +++ llvm/trunk/include/llvm/<wbr class="">PassAnalysisSupport.h Fri Jan 13 00:09:54<br class="">
> 2017<br class="">
> @@ -206,6 +206,9 @@ AnalysisType *Pass::getAnalysisIfAvailab<br class="">
>    Pass *ResultPass = Resolver-><wbr class="">getAnalysisIfAvailable(PI, true);<br class="">
>    if (!ResultPass) return nullptr;<br class="">
><br class="">
> +  if (!ResultPass->isExecuted())<br class="">
> +    return nullptr;<br class="">
> +<br class="">
>    // Because the AnalysisType may not be a subclass of pass (for<br class="">
>    // AnalysisGroups), we use getAdjustedAnalysisPointer here to<br class="">
>    potentially<br class="">
>    // adjust the return pointer (because the class may multiply inherit,<br class="">
>    once<br class="">
> @@ -234,6 +237,8 @@ AnalysisType &Pass::getAnalysisID(Analys<br class="">
>    assert (ResultPass &&<br class="">
>            "getAnalysis*() called on an analysis that was not "<br class="">
>            "'required' by pass!");<br class="">
> +  assert(ResultPass->isExecuted(<wbr class="">) &&<br class="">
> +         "getAnalysis*() called on an analysis that was freed");<br class="">
><br class="">
>    // Because the AnalysisType may not be a subclass of pass (for<br class="">
>    // AnalysisGroups), we use getAdjustedAnalysisPointer here to<br class="">
>    potentially<br class="">
><br class="">
> Modified: llvm/trunk/lib/Analysis/<wbr class="">CallGraphSCCPass.cpp<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CallGraphSCCPass.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/lib/<wbr class="">Analysis/CallGraphSCCPass.cpp?<wbr class="">rev=291882&r1=291881&r2=<wbr class="">291882&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/lib/Analysis/<wbr class="">CallGraphSCCPass.cpp (original)<br class="">
> +++ llvm/trunk/lib/Analysis/<wbr class="">CallGraphSCCPass.cpp Fri Jan 13 00:09:54 2017<br class="">
> @@ -414,6 +414,7 @@ bool CGPassManager::<wbr class="">RunAllPassesOnSCC(Ca<br class="">
>      initializeAnalysisImpl(P);<br class="">
><br class="">
>      // Actually run this pass on the current SCC.<br class="">
> +    P->setExecuted(true);<br class="">
>      Changed |= RunPassOnSCC(P, CurSCC, CG,<br class="">
>                              CallGraphUpToDate, DevirtualizedCall);<br class="">
><br class="">
><br class="">
> Modified: llvm/trunk/lib/Analysis/<wbr class="">LoopInfo.cpp<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/lib/<wbr class="">Analysis/LoopInfo.cpp?rev=<wbr class="">291882&r1=291881&r2=291882&<wbr class="">view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/lib/Analysis/<wbr class="">LoopInfo.cpp (original)<br class="">
> +++ llvm/trunk/lib/Analysis/<wbr class="">LoopInfo.cpp Fri Jan 13 00:09:54 2017<br class="">
> @@ -722,8 +722,10 @@ void LoopInfoWrapperPass::<wbr class="">verifyAnalysis<br class="">
>    // checking by default, LoopPass has been taught to call verifyLoop<br class="">
>    manually<br class="">
>    // during loop pass sequences.<br class="">
>    if (VerifyLoopInfo) {<br class="">
> -    auto &DT = getAnalysis<<wbr class="">DominatorTreeWrapperPass>().<wbr class="">getDomTree();<br class="">
> -    LI.verify(DT);<br class="">
> +    if (auto *Analysis =<br class="">
> getAnalysisIfAvailable<<wbr class="">DominatorTreeWrapperPass>()) {<br class="">
> +      auto &DT = Analysis->getDomTree();<br class="">
> +      LI.verify(DT);<br class="">
> +    }<br class="">
>    }<br class="">
>  }<br class="">
><br class="">
><br class="">
> Modified: llvm/trunk/lib/Analysis/<wbr class="">LoopPass.cpp<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPass.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/lib/<wbr class="">Analysis/LoopPass.cpp?rev=<wbr class="">291882&r1=291881&r2=291882&<wbr class="">view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/lib/Analysis/<wbr class="">LoopPass.cpp (original)<br class="">
> +++ llvm/trunk/lib/Analysis/<wbr class="">LoopPass.cpp Fri Jan 13 00:09:54 2017<br class="">
> @@ -198,6 +198,7 @@ bool LPPassManager::runOnFunction(<wbr class="">Functi<br class="">
>          PassManagerPrettyStackEntry X(P, *CurrentLoop->getHeader());<br class="">
>          TimeRegion PassTimer(getPassTimer(P));<br class="">
><br class="">
> +        P->setExecuted(true);<br class="">
>          Changed |= P->runOnLoop(CurrentLoop, *this);<br class="">
>        }<br class="">
>        LoopWasDeleted = CurrentLoop->isInvalid();<br class="">
><br class="">
> Modified: llvm/trunk/lib/CodeGen/<wbr class="">MachineDominators.cpp<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineDominators.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/lib/<wbr class="">CodeGen/MachineDominators.cpp?<wbr class="">rev=291882&r1=291881&r2=<wbr class="">291882&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/lib/CodeGen/<wbr class="">MachineDominators.cpp (original)<br class="">
> +++ llvm/trunk/lib/CodeGen/<wbr class="">MachineDominators.cpp Fri Jan 13 00:09:54 2017<br class="">
> @@ -69,7 +69,7 @@ void MachineDominatorTree::<wbr class="">releaseMemory<br class="">
>  }<br class="">
><br class="">
>  void MachineDominatorTree::<wbr class="">verifyAnalysis() const {<br class="">
> -  if (VerifyMachineDomInfo)<br class="">
> +  if (VerifyMachineDomInfo && isExecuted())<br class="">
>      verifyDomTree();<br class="">
>  }<br class="">
><br class="">
><br class="">
> Modified: llvm/trunk/lib/CodeGen/<wbr class="">MachineFunctionPass.cpp<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/lib/<wbr class="">CodeGen/MachineFunctionPass.<wbr class="">cpp?rev=291882&r1=291881&r2=<wbr class="">291882&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/lib/CodeGen/<wbr class="">MachineFunctionPass.cpp (original)<br class="">
> +++ llvm/trunk/lib/CodeGen/<wbr class="">MachineFunctionPass.cpp Fri Jan 13 00:09:54<br class="">
> 2017<br class="">
> @@ -38,8 +38,10 @@ Pass *MachineFunctionPass::<wbr class="">createPrinter<br class="">
>  bool MachineFunctionPass::<wbr class="">runOnFunction(Function &F) {<br class="">
>    // Do not codegen any 'available_externally' functions at all, they<br class="">
>    have<br class="">
>    // definitions outside the translation unit.<br class="">
> -  if (F.<wbr class="">hasAvailableExternallyLinkage(<wbr class="">))<br class="">
> +  if (F.<wbr class="">hasAvailableExternallyLinkage(<wbr class="">)) {<br class="">
> +    setExecuted(false);<br class="">
>      return false;<br class="">
> +  }<br class="">
><br class="">
>    MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo><wbr class="">();<br class="">
>    MachineFunction &MF = MMI.getMachineFunction(F);<br class="">
><br class="">
> Modified: llvm/trunk/lib/IR/<wbr class="">LegacyPassManager.cpp<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LegacyPassManager.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/lib/IR/<wbr class="">LegacyPassManager.cpp?rev=<wbr class="">291882&r1=291881&r2=291882&<wbr class="">view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/lib/IR/<wbr class="">LegacyPassManager.cpp (original)<br class="">
> +++ llvm/trunk/lib/IR/<wbr class="">LegacyPassManager.cpp Fri Jan 13 00:09:54 2017<br class="">
> @@ -955,6 +955,9 @@ void PMDataManager::freePass(Pass *P, St<br class="">
>          AvailableAnalysis.erase(Pos);<br class="">
>      }<br class="">
>    }<br class="">
> +<br class="">
> +  if (!P->getAsImmutablePass())<br class="">
> +    P->setExecuted(false);<br class="">
>  }<br class="">
><br class="">
>  /// Add pass P into the PassVector. Update<br class="">
> @@ -1293,6 +1296,7 @@ bool BBPassManager::runOnFunction(<wbr class="">Functi<br class="">
>          PassManagerPrettyStackEntry X(BP, *I);<br class="">
>          TimeRegion PassTimer(getPassTimer(BP));<br class="">
><br class="">
> +        BP->setExecuted(true);<br class="">
>          LocalChanged |= BP->runOnBasicBlock(*I);<br class="">
>        }<br class="">
><br class="">
> @@ -1459,7 +1463,9 @@ bool FunctionPassManagerImpl::run(<wbr class="">Functi<br class="">
><br class="">
>    initializeAllAnalysisInfo();<br class="">
>    for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {<br class="">
> -    Changed |= getContainedManager(Index)-><wbr class="">runOnFunction(F);<br class="">
> +    FPPassManager *P = getContainedManager(Index);<br class="">
> +    P->setExecuted(true);<br class="">
> +    Changed |= P->runOnFunction(F);<br class="">
>      F.getContext().yield();<br class="">
>    }<br class="">
><br class="">
> @@ -1510,6 +1516,7 @@ bool FPPassManager::runOnFunction(<wbr class="">Functi<br class="">
>        PassManagerPrettyStackEntry X(FP, F);<br class="">
>        TimeRegion PassTimer(getPassTimer(FP));<br class="">
><br class="">
> +      FP->setExecuted(true);<br class="">
>        LocalChanged |= FP->runOnFunction(F);<br class="">
>      }<br class="">
><br class="">
> @@ -1530,8 +1537,10 @@ bool FPPassManager::runOnFunction(<wbr class="">Functi<br class="">
>  bool FPPassManager::runOnModule(<wbr class="">Module &M) {<br class="">
>    bool Changed = false;<br class="">
><br class="">
> -  for (Function &F : M)<br class="">
> +  for (Function &F : M) {<br class="">
> +    setExecuted(true);<br class="">
>      Changed |= runOnFunction(F);<br class="">
> +  }<br class="">
><br class="">
>    return Changed;<br class="">
>  }<br class="">
> @@ -1587,6 +1596,7 @@ MPPassManager::runOnModule(<wbr class="">Module &M) {<br class="">
>        PassManagerPrettyStackEntry X(MP, M);<br class="">
>        TimeRegion PassTimer(getPassTimer(MP));<br class="">
><br class="">
> +      MP->setExecuted(true);<br class="">
>        LocalChanged |= MP->runOnModule(M);<br class="">
>      }<br class="">
><br class="">
> @@ -1690,7 +1700,9 @@ bool PassManagerImpl::run(Module &M) {<br class="">
><br class="">
>    initializeAllAnalysisInfo();<br class="">
>    for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {<br class="">
> -    Changed |= getContainedManager(Index)-><wbr class="">runOnModule(M);<br class="">
> +    MPPassManager *P = getContainedManager(Index);<br class="">
> +    P->setExecuted(true);<br class="">
> +    Changed |= P->runOnModule(M);<br class="">
>      M.getContext().yield();<br class="">
>    }<br class="">
><br class="">
><br class="">
> Modified: llvm/trunk/lib/IR/Pass.cpp<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Pass.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/lib/IR/<wbr class="">Pass.cpp?rev=291882&r1=291881&<wbr class="">r2=291882&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/lib/IR/Pass.cpp (original)<br class="">
> +++ llvm/trunk/lib/IR/Pass.cpp Fri Jan 13 00:09:54 2017<br class="">
> @@ -146,13 +146,16 @@ PassManagerType FunctionPass::getPotenti<br class="">
>    return PMT_FunctionPassManager;<br class="">
>  }<br class="">
><br class="">
> -bool FunctionPass::skipFunction(<wbr class="">const Function &F) const {<br class="">
> -  if (!F.getContext().getOptBisect(<wbr class="">).shouldRunPass(this, F))<br class="">
> +bool FunctionPass::skipFunction(<wbr class="">const Function &F) {<br class="">
> +  if (!F.getContext().getOptBisect(<wbr class="">).shouldRunPass(this, F)) {<br class="">
> +    setExecuted(false);<br class="">
>      return true;<br class="">
> +  }<br class="">
><br class="">
>    if (F.hasFnAttribute(Attribute::<wbr class="">OptimizeNone)) {<br class="">
>      DEBUG(dbgs() << "Skipping pass '" << getPassName() << "' on function<br class="">
>      "<br class="">
>                   << F.getName() << "\n");<br class="">
> +    setExecuted(false);<br class="">
>      return true;<br class="">
>    }<br class="">
>    return false;<br class="">
><br class="">
> Modified: llvm/trunk/test/CodeGen/<wbr class="">Generic/externally_available.<wbr class="">ll<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/externally_available.ll?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/test/<wbr class="">CodeGen/Generic/externally_<wbr class="">available.ll?rev=291882&r1=<wbr class="">291881&r2=291882&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/test/CodeGen/<wbr class="">Generic/externally_available.<wbr class="">ll (original)<br class="">
> +++ llvm/trunk/test/CodeGen/<wbr class="">Generic/externally_available.<wbr class="">ll Fri Jan 13<br class="">
> 00:09:54 2017<br class="">
> @@ -1,4 +1,4 @@<br class="">
> -; RUN: llc < %s | not grep test_<br class="">
> +; RUN: llc -verify-machine-dom-info < %s | not grep test_<br class="">
><br class="">
>  ; test_function should not be emitted to the .s file.<br class="">
>  define available_externally i32 @test_function() {<br class="">
><br class="">
> Modified: llvm/trunk/test/CodeGen/Mips/<wbr class="">mul.ll<br class="">
> URL:<br class="">
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/mul.ll?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/test/<wbr class="">CodeGen/Mips/mul.ll?rev=<wbr class="">291882&r1=291881&r2=291882&<wbr class="">view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- llvm/trunk/test/CodeGen/Mips/<wbr class="">mul.ll (original)<br class="">
> +++ llvm/trunk/test/CodeGen/Mips/<wbr class="">mul.ll Fri Jan 13 00:09:54 2017<br class="">
> @@ -1,4 +1,4 @@<br class="">
> -; RUN: llc  -march=mipsel -mattr=mips16 -relocation-model=pic -O3 < %s |<br class="">
> FileCheck %s -check-prefix=16<br class="">
> +; RUN: llc  -march=mipsel -mattr=mips16 -relocation-model=pic -O3<br class="">
> -verify-loop-info < %s | FileCheck %s -check-prefix=16<br class="">
><br class="">
>  @iiii = global i32 5, align 4<br class="">
>  @jjjj = global i32 -6, align 4<br class="">
><br class="">
><br class="">
> ______________________________<wbr class="">_________________<br class="">
> llvm-commits mailing list<br class="">
> <a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/llvm-commits</a><br class="">
</div></div></blockquote></div><br class=""></div></div>
_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""></div></blockquote></div><br class=""></div></body></html>