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