<div dir="ltr">Thanks for the catch! Should be resolved by <span id="gmail-docs-internal-guid-6d2c2761-7fff-d625-0a0b-5cb64864c6e0"><span style="text-decoration-line:underline;font-family:Arial;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><a href="https://reviews.llvm.org/rGa0f627d5842" style="text-decoration-line:none">rGa0f627d5842</a>.</span></span><div><br></div><div><span><span style="text-decoration-line:underline;font-family:Arial;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Alina</span></span></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jan 23, 2020 at 4:01 AM Mikael Holmén <<a href="mailto:mikael.holmen@ericsson.com">mikael.holmen@ericsson.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Alina,<br>
<br>
I noticed that the following started hitting an assertion with this<br>
patch:<br>
<br>
opt -S -o - foo.ll -licm -indvars -licm<br>
<br>
gives me<br>
<br>
opt: ../lib/Analysis/MemorySSA.cpp:2028: void<br>
llvm::MemorySSA::verifyOrderingDominationAndDefUses(llvm::Function &)<br>
const: Assertion `AL->size() == ActualAccesses.size() && "We don't have<br>
the same number of accesses in the block as on the " "access list"'<br>
failed.<br>
Stack dump:<br>
0.      Program arguments: /data/repo/master/llvm/build-all-<br>
builtins/bin/opt -S -o - foo.ll -licm -indvars -licm <br>
1.      Running pass 'Function Pass Manager' on module 'foo.ll'.<br>
2.      Running pass 'Loop Pass Manager' on function '@v_2_0'<br>
 #0 0x0000000003e7dcf4 PrintStackTraceSignalHandler(void*)<br>
(/data/repo/master/llvm/build-all-builtins/bin/opt+0x3e7dcf4)<br>
 #1 0x0000000003e7b8be llvm::sys::RunSignalHandlers()<br>
(/data/repo/master/llvm/build-all-builtins/bin/opt+0x3e7b8be)<br>
 #2 0x0000000003e7e0fc SignalHandler(int)<br>
(/data/repo/master/llvm/build-all-builtins/bin/opt+0x3e7e0fc)<br>
 #3 0x00007f45cb006890 __restore_rt (/lib/x86_64-linux-<br>
gnu/libpthread.so.0+0x12890)<br>
 #4 0x00007f45c9aafe97 raise /build/glibc-OTsEL5/glibc-<br>
2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0<br>
 #5 0x00007f45c9ab1801 abort /build/glibc-OTsEL5/glibc-<br>
2.27/stdlib/abort.c:81:0<br>
 #6 0x00007f45c9aa139a __assert_fail_base /build/glibc-OTsEL5/glibc-<br>
2.27/assert/assert.c:89:0<br>
 #7 0x00007f45c9aa1412 (/lib/x86_64-linux-gnu/libc.so.6+0x30412)<br>
 #8 0x00000000030c8daa<br>
llvm::MemorySSA::verifyOrderingDominationAndDefUses(llvm::Function&)<br>
const (/data/repo/master/llvm/build-all-builtins/bin/opt+0x30c8daa)<br>
 #9 0x00000000030cb381 llvm::MemorySSAWrapperPass::verifyAnalysis()<br>
const (/data/repo/master/llvm/build-all-builtins/bin/opt+0x30cb381)<br>
#10 0x00000000036fb939<br>
llvm::PMDataManager::verifyPreservedAnalysis(llvm::Pass*)<br>
(/data/repo/master/llvm/build-all-builtins/bin/opt+0x36fb939)<br>
#11 0x00000000030a3bd6<br>
llvm::LPPassManager::runOnFunction(llvm::Function&)<br>
(/data/repo/master/llvm/build-all-builtins/bin/opt+0x30a3bd6)<br>
#12 0x00000000036fefd3<br>
llvm::FPPassManager::runOnFunction(llvm::Function&)<br>
(/data/repo/master/llvm/build-all-builtins/bin/opt+0x36fefd3)<br>
#13 0x00000000036ff2b8 llvm::FPPassManager::runOnModule(llvm::Module&)<br>
(/data/repo/master/llvm/build-all-builtins/bin/opt+0x36ff2b8)<br>
#14 0x00000000036ff91d<br>
llvm::legacy::PassManagerImpl::run(llvm::Module&)<br>
(/data/repo/master/llvm/build-all-builtins/bin/opt+0x36ff91d)<br>
#15 0x0000000002095a93 main (/data/repo/master/llvm/build-all-<br>
builtins/bin/opt+0x2095a93)<br>
#16 0x00007f45c9a92b97 __libc_start_main /build/glibc-OTsEL5/glibc-<br>
2.27/csu/../csu/libc-start.c:344:0<br>
#17 0x000000000207d02a _start (/data/repo/master/llvm/build-all-<br>
builtins/bin/opt+0x207d02a)<br>
Abort (core dumped)<br>
<br>
/Mikael<br>
<br>
On Wed, 2020-01-22 at 16:39 -0800, Alina Sbirlea via llvm-commits<br>
wrote:<br>
> Author: Alina Sbirlea<br>
> Date: 2020-01-22T16:33:17-08:00<br>
> New Revision: adc4faf532bfefeddb4c789f1562394ae2a1ba0d<br>
> <br>
> URL: <br>
> <a href="https://protect2.fireeye.com/v1/url?k=f7eee798-ab7ceac4-f7eea703-0cc47ad93d46-8ded1b8e9d278649&q=1&e=01022273-bea5-4c6e-8983-d20037c15100&u=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2Fadc4faf532bfefeddb4c789f1562394ae2a1ba0d" rel="noreferrer" target="_blank">https://protect2.fireeye.com/v1/url?k=f7eee798-ab7ceac4-f7eea703-0cc47ad93d46-8ded1b8e9d278649&q=1&e=01022273-bea5-4c6e-8983-d20037c15100&u=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2Fadc4faf532bfefeddb4c789f1562394ae2a1ba0d</a><br>
> DIFF: <br>
> <a href="https://protect2.fireeye.com/v1/url?k=8ac1daa5-d653d7f9-8ac19a3e-0cc47ad93d46-571f46367ac21f72&q=1&e=01022273-bea5-4c6e-8983-d20037c15100&u=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2Fadc4faf532bfefeddb4c789f1562394ae2a1ba0d.diff" rel="noreferrer" target="_blank">https://protect2.fireeye.com/v1/url?k=8ac1daa5-d653d7f9-8ac19a3e-0cc47ad93d46-571f46367ac21f72&q=1&e=01022273-bea5-4c6e-8983-d20037c15100&u=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2Fadc4faf532bfefeddb4c789f1562394ae2a1ba0d.diff</a><br>
> <br>
> LOG: [IndVarSimplify] Teach IndVarSimplify to preserve MemorySSA.<br>
> <br>
> Added: <br>
>     <br>
> <br>
> Modified: <br>
>     llvm/lib/Transforms/Scalar/IndVarSimplify.cpp<br>
> <br>
> Removed: <br>
>     <br>
> <br>
> <br>
> #####################################################################<br>
> ###########<br>
> diff  --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp<br>
> b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp<br>
> index a14049543236..259b6aec7b34 100644<br>
> --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp<br>
> +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp<br>
> @@ -38,6 +38,8 @@<br>
>  #include "llvm/ADT/iterator_range.h"<br>
>  #include "llvm/Analysis/LoopInfo.h"<br>
>  #include "llvm/Analysis/LoopPass.h"<br>
> +#include "llvm/Analysis/MemorySSA.h"<br>
> +#include "llvm/Analysis/MemorySSAUpdater.h"<br>
>  #include "llvm/Analysis/ScalarEvolution.h"<br>
>  #include "llvm/Analysis/ScalarEvolutionExpander.h"<br>
>  #include "llvm/Analysis/ScalarEvolutionExpressions.h"<br>
> @@ -138,6 +140,8 @@ class IndVarSimplify {<br>
>    const DataLayout &DL;<br>
>    TargetLibraryInfo *TLI;<br>
>    const TargetTransformInfo *TTI;<br>
> +  MemorySSA *MSSA;<br>
> +  std::unique_ptr<MemorySSAUpdater> MSSAU;<br>
>  <br>
>    SmallVector<WeakTrackingVH, 16> DeadInsts;<br>
>  <br>
> @@ -162,8 +166,11 @@ class IndVarSimplify {<br>
>  public:<br>
>    IndVarSimplify(LoopInfo *LI, ScalarEvolution *SE, DominatorTree<br>
> *DT,<br>
>                   const DataLayout &DL, TargetLibraryInfo *TLI,<br>
> -                 TargetTransformInfo *TTI)<br>
> -      : LI(LI), SE(SE), DT(DT), DL(DL), TLI(TLI), TTI(TTI) {}<br>
> +                 TargetTransformInfo *TTI, MemorySSA *MSSA)<br>
> +      : LI(LI), SE(SE), DT(DT), DL(DL), TLI(TLI), TTI(TTI),<br>
> MSSA(MSSA) {<br>
> +    if (MSSA)<br>
> +      MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);<br>
> +  }<br>
>  <br>
>    bool run(Loop *L);<br>
>  };<br>
> @@ -418,11 +425,11 @@ bool IndVarSimplify::handleFloatingPointIV(Loop<br>
> *L, PHINode *PN) {<br>
>    // new comparison.<br>
>    NewCompare->takeName(Compare);<br>
>    Compare->replaceAllUsesWith(NewCompare);<br>
> -  RecursivelyDeleteTriviallyDeadInstructions(Compare, TLI);<br>
> +  RecursivelyDeleteTriviallyDeadInstructions(Compare, TLI,<br>
> MSSAU.get());<br>
>  <br>
>    // Delete the old floating point increment.<br>
>    Incr->replaceAllUsesWith(UndefValue::get(Incr->getType()));<br>
> -  RecursivelyDeleteTriviallyDeadInstructions(Incr, TLI);<br>
> +  RecursivelyDeleteTriviallyDeadInstructions(Incr, TLI,<br>
> MSSAU.get());<br>
>  <br>
>    // If the FP induction variable still has uses, this is because<br>
> something else<br>
>    // in the loop uses its value.  In order to canonicalize the<br>
> induction<br>
> @@ -435,7 +442,7 @@ bool IndVarSimplify::handleFloatingPointIV(Loop<br>
> *L, PHINode *PN) {<br>
>      Value *Conv = new SIToFPInst(NewPHI, PN->getType(),<br>
> "indvar.conv",<br>
>                                   &*PN->getParent()-<br>
> >getFirstInsertionPt());<br>
>      PN->replaceAllUsesWith(Conv);<br>
> -    RecursivelyDeleteTriviallyDeadInstructions(PN, TLI);<br>
> +    RecursivelyDeleteTriviallyDeadInstructions(PN, TLI,<br>
> MSSAU.get());<br>
>    }<br>
>    return true;<br>
>  }<br>
> @@ -2823,12 +2830,14 @@ PreservedAnalyses<br>
> IndVarSimplifyPass::run(Loop &L, LoopAnalysisManager &AM,<br>
>    Function *F = L.getHeader()->getParent();<br>
>    const DataLayout &DL = F->getParent()->getDataLayout();<br>
>  <br>
> -  IndVarSimplify IVS(&<a href="http://AR.LI" rel="noreferrer" target="_blank">AR.LI</a>, &<a href="http://AR.SE" rel="noreferrer" target="_blank">AR.SE</a>, &AR.DT, DL, &AR.TLI, &AR.TTI);<br>
> +  IndVarSimplify IVS(&<a href="http://AR.LI" rel="noreferrer" target="_blank">AR.LI</a>, &<a href="http://AR.SE" rel="noreferrer" target="_blank">AR.SE</a>, &AR.DT, DL, &AR.TLI, &AR.TTI,<br>
> AR.MSSA);<br>
>    if (!IVS.run(&L))<br>
>      return PreservedAnalyses::all();<br>
>  <br>
>    auto PA = getLoopPassPreservedAnalyses();<br>
>    PA.preserveSet<CFGAnalyses>();<br>
> +  if (AR.MSSA)<br>
> +    PA.preserve<MemorySSAAnalysis>();<br>
>    return PA;<br>
>  }<br>
>  <br>
> @@ -2853,13 +2862,18 @@ struct IndVarSimplifyLegacyPass : public<br>
> LoopPass {<br>
>      auto *TTIP =<br>
> getAnalysisIfAvailable<TargetTransformInfoWrapperPass>();<br>
>      auto *TTI = TTIP ? &TTIP->getTTI(*L->getHeader()->getParent()) :<br>
> nullptr;<br>
>      const DataLayout &DL = L->getHeader()->getModule()-<br>
> >getDataLayout();<br>
> +    auto *MSSAAnalysis =<br>
> getAnalysisIfAvailable<MemorySSAWrapperPass>();<br>
> +    MemorySSA *MSSA = nullptr;<br>
> +    if (MSSAAnalysis)<br>
> +      MSSA = &MSSAAnalysis->getMSSA();<br>
>  <br>
> -    IndVarSimplify IVS(LI, SE, DT, DL, TLI, TTI);<br>
> +    IndVarSimplify IVS(LI, SE, DT, DL, TLI, TTI, MSSA);<br>
>      return IVS.run(L);<br>
>    }<br>
>  <br>
>    void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
>      AU.setPreservesCFG();<br>
> +    AU.addPreserved<MemorySSAWrapperPass>();<br>
>      getLoopAnalysisUsage(AU);<br>
>    }<br>
>  };<br>
> <br>
> <br>
>         <br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> <br>
<a href="https://protect2.fireeye.com/v1/url?k=5a03034f-06910e13-5a0343d4-0cc47ad93d46-75959173d0d21924&q=1&e=01022273-bea5-4c6e-8983-d20037c15100&u=https%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fllvm-commits" rel="noreferrer" target="_blank">https://protect2.fireeye.com/v1/url?k=5a03034f-06910e13-5a0343d4-0cc47ad93d46-75959173d0d21924&q=1&e=01022273-bea5-4c6e-8983-d20037c15100&u=https%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fllvm-commits</a><br>
</blockquote></div>