<div dir="ltr">With this change, we are actually running into the assertion <span style="font-size:12.8px">"conflicting locations for variable". I have re-instantiated the previous detection logic in r315576.</span><div><span style="font-size:12.8px">What would lead to such two variables conflicting?</span></div><div><span style="font-size:12.8px">Reid, can you help generate a test case? I'll forward repro instructions of internal tests to you.</span></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 10, 2017 at 8:46 AM, Bjorn Steinbrink via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="gmail-cremed cremed">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: bsteinbr<br>
Date: Tue Oct 10 00:46:17 2017<br>
New Revision: 315279<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=315279&view=rev" rel="noreferrer" target="_blank" class="gmail-cremed cremed">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=315279&view=rev</a><br>
Log:<br>
Ignore all duplicate frame index expression<br>
<br>
Some passes might duplicate calls to llvm.dbg.declare creating<br>
duplicate frame index expression which currently trigger an assertion<br>
which is meant to catch erroneous, overlapping fragment declarations.<br>
But identical frame index expressions are just redundant and don't<br>
actually conflict with each other, so we can be more lenient and just<br>
ignore the duplicates.<br>
<br>
Reviewers: aprantl, rnk<br>
<br>
Subscribers: llvm-commits, JDevlieghere<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D38540" rel="noreferrer" target="_blank" class="gmail-cremed cremed">https://reviews.llvm.org/D3854<wbr>0</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/AsmPrin<wbr>ter/DwarfDebug.cpp<br>
    llvm/trunk/lib/CodeGen/AsmPrin<wbr>ter/DwarfDebug.h<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrin<wbr>ter/DwarfDebug.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=315279&r1=315278&r2=315279&view=diff" rel="noreferrer" target="_blank" class="gmail-cremed cremed">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfDebug.cpp?rev=<wbr>315279&r1=315278&r2=315279&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/AsmPrin<wbr>ter/DwarfDebug.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrin<wbr>ter/DwarfDebug.cpp Tue Oct 10 00:46:17 2017<br>
@@ -220,9 +220,34 @@ ArrayRef<DbgVariable::FrameInd<wbr>exExpr> Db<br>
               return A.Expr->getFragmentInfo()->Off<wbr>setInBits <<br>
                      B.Expr->getFragmentInfo()->Off<wbr>setInBits;<br>
             });<br>
+<br>
   return FrameIndexExprs;<br>
 }<br>
<br>
+void DbgVariable::addMMIEntry(const DbgVariable &V) {<br>
+  assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");<br>
+  assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");<br>
+  assert(V.Var == Var && "conflicting variable");<br>
+  assert(V.IA == IA && "conflicting inlined-at location");<br>
+<br>
+  assert(!FrameIndexExprs.empty(<wbr>) && "Expected an MMI entry");<br>
+  assert(!V.FrameIndexExprs.empt<wbr>y() && "Expected an MMI entry");<br>
+<br>
+  for (const auto &FIE : V.FrameIndexExprs)<br>
+    // Ignore duplicate entries.<br>
+    if (llvm::none_of(FrameIndexExprs<wbr>, [&](const FrameIndexExpr &Other) {<br>
+          return <a href="http://FIE.FI" rel="noreferrer" target="_blank" class="gmail-cremed cremed">FIE.FI</a> == Other.FI && FIE.Expr == Other.Expr;<br>
+        }))<br>
+      FrameIndexExprs.push_back(FIE)<wbr>;<br>
+<br>
+  assert((FrameIndexExprs.size() == 1 ||<br>
+          llvm::all_of(FrameIndexExprs,<br>
+                       [](FrameIndexExpr &FIE) {<br>
+                         return FIE.Expr && FIE.Expr->isFragment();<br>
+                       })) &&<br>
+         "conflicting locations for variable");<br>
+}<br>
+<br>
 static const DwarfAccelTable::Atom TypeAtoms[] = {<br>
     DwarfAccelTable::Atom(dwarf::<wbr>DW_ATOM_die_offset, dwarf::DW_FORM_data4),<br>
     DwarfAccelTable::Atom(dwarf::<wbr>DW_ATOM_die_tag, dwarf::DW_FORM_data2),<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrin<wbr>ter/DwarfDebug.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=315279&r1=315278&r2=315279&view=diff" rel="noreferrer" target="_blank" class="gmail-cremed cremed">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfDebug.h?rev=<wbr>315279&r1=315278&r2=315279&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/AsmPrin<wbr>ter/DwarfDebug.h (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrin<wbr>ter/DwarfDebug.h Tue Oct 10 00:46:17 2017<br>
@@ -138,30 +138,7 @@ public:<br>
   /// Get the FI entries, sorted by fragment offset.<br>
   ArrayRef<FrameIndexExpr> getFrameIndexExprs() const;<br>
   bool hasFrameIndexExprs() const { return !FrameIndexExprs.empty(); }<br>
-<br>
-  void addMMIEntry(const DbgVariable &V) {<br>
-    assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");<br>
-    assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");<br>
-    assert(V.Var == Var && "conflicting variable");<br>
-    assert(V.IA == IA && "conflicting inlined-at location");<br>
-<br>
-    assert(!FrameIndexExprs.empty(<wbr>) && "Expected an MMI entry");<br>
-    assert(!V.FrameIndexExprs.empt<wbr>y() && "Expected an MMI entry");<br>
-<br>
-    if (FrameIndexExprs.size()) {<br>
-      auto *Expr = FrameIndexExprs.back().Expr;<br>
-      // Get rid of duplicate non-fragment entries. More than one non-fragment<br>
-      // dbg.declare makes no sense so ignore all but the first.<br>
-      if (!Expr || !Expr->isFragment())<br>
-        return;<br>
-    }<br>
-    FrameIndexExprs.append(V.Frame<wbr>IndexExprs.begin(), V.FrameIndexExprs.end());<br>
-    assert(llvm::all_of(FrameIndex<wbr>Exprs,<br>
-                        [](FrameIndexExpr &FIE) {<br>
-                          return FIE.Expr && FIE.Expr->isFragment();<br>
-                        }) &&<br>
-           "conflicting locations for variable");<br>
-  }<br>
+  void addMMIEntry(const DbgVariable &V);<br>
<br>
   // Translate tag to proper Dwarf tag.<br>
   dwarf::Tag getTag() const {<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="gmail-cremed cremed">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="gmail-cremed cremed">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>