<div dir="ltr"><div>The problem is that we somehow end up trying to optimize the same block 3 times ....</div><div><div>Inorder Dominator Tree:</div><div>  [1] %bb {0,9}</div><div>    [2] %bb2 {1,8}</div><div>      [3] %bb11 {2,7}</div><div>        [4] %bb1 {3,4}</div><div>        [4] %bb15 {5,6}</div></div><div><br></div><div><div>Use Optimizer visiting block bb</div><div>Use Optimizer visiting block bb2</div><div>Use Optimizer visiting block bb11</div><div>Use Optimizer visiting block bb1</div><div>Use Optimizer visiting block bb11</div><div>Use Optimizer visiting block bb15</div><div>Use Optimizer visiting block bb11</div><div>Use Optimizer visiting block bb2</div><div>Use Optimizer visiting block bb</div></div><div><br></div><div><br></div><div>I see what is wrong with the iterator, but i'm just going to replace it with depth_first anyway.</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 4, 2016 at 2:35 PM, Geoff Berry <span dir="ltr"><<a href="mailto:gberry@codeaurora.org" target="_blank">gberry@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">There appears to be a bug in MemorySSA that sometimes results in memory defs that don't dominate their uses.  If you apply the below patch and run the following command you should be able to reproduce the issue.  I haven't been able to investigate it yet, but may do so tomorrow if no one gets to it first.<br>
<br>
<br>
$ opt -print-memoryssa llvm/test/Transforms/GlobalDCE<wbr>/complex-constantexpr.ll<br>
<br>
diff --git a/lib/Transforms/Utils/MemoryS<wbr>SA.cpp b/lib/Transforms/Utils/MemoryS<wbr>SA.cpp<br>
index 4a604c9..ed2574b 100644<br>
--- a/lib/Transforms/Utils/MemoryS<wbr>SA.cpp<br>
+++ b/lib/Transforms/Utils/MemoryS<wbr>SA.cpp<br>
@@ -1900,7 +1900,9 @@ void MemorySSA::verifyDomination(Fu<wbr>nction &F) const {<br>
             }<br>
           }<br>
         } else {<br>
-          UseBlock = cast<MemoryAccess>(U)->getBloc<wbr>k();<br>
+          auto *MA = cast<MemoryAccess>(U);<br>
+          UseBlock = MA->getBlock();<br>
+          assert(MD->getBlock() != UseBlock || locallyDominates(MD, MA));<br>
         }<br>
         assert(DT->dominates(MD->getB<wbr>lock(), UseBlock) &&<br>
                "Memory Def does not dominate it's uses");<span class="HOEnZb"><font color="#888888"><br>
<br>
-- <br>
Geoff Berry<br>
Employee of Qualcomm Innovation Center, Inc.<br>
 Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project<br>
<br>
</font></span></blockquote></div><br></div>