<div dir="ltr">*nod* Test it & see how it looks - I'm just making a rough guess that this might be 'interesting'.<div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Mar 12, 2018 at 11:37 AM Adrian Prantl <<a href="mailto:aprantl@apple.com">aprantl@apple.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div><br><blockquote type="cite"><div>On Mar 12, 2018, at 11:24 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:</div><br class="m_-5076189203682212214Apple-interchange-newline"><div><div dir="ltr">What if only some of the loads/stores are volatile?<br><br>int i = x;<br>*((volatile unsigned*)&i) = 3;<br><br>Then maybe LLVM could still optimize away a bunch of the use of 'i' & so describing the alloca may be worse than describing the reads/writes/notional value?</div></div></blockquote><div><br></div></div></div><div style="word-wrap:break-word;line-break:after-white-space"><div><div>I didn't know that this was an option. I guess we can use std::all_of instead of std::any_of.</div></div></div><div style="word-wrap:break-word;line-break:after-white-space"><div><div><br></div><div>-- adrian</div></div></div><div style="word-wrap:break-word;line-break:after-white-space"><div><br><blockquote type="cite"><div><br><div class="gmail_quote"><div dir="ltr">On Thu, Mar 8, 2018 at 4:47 PM Adrian Prantl via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br>
Date: Thu Mar  8 16:45:04 2018<br>
New Revision: 327092<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=327092&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=327092&view=rev</a><br>
Log:<br>
LowerDbgDeclare: ignore dbg.declares for allocas with volatile access<br>
<br>
There is no point in lowering a dbg.declare describing an alloca that<br>
has volatile loads or stores as users, since the alloca cannot be<br>
elided. Lowering the dbg.declare will result in larger debug info that<br>
may also have worse coverage than just describing the alloca.<br>
<br>
<a>rdar://problem/34496278</a><br>
<br>
Added:<br>
    llvm/trunk/test/DebugInfo/Generic/volatile-alloca.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/Utils/Local.cpp<br>
    llvm/trunk/test/Transforms/Util/simplify-dbg-declare-load.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=327092&r1=327091&r2=327092&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=327092&r1=327091&r2=327092&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/Local.cpp Thu Mar  8 16:45:04 2018<br>
@@ -1322,25 +1322,36 @@ bool llvm::LowerDbgDeclare(Function &F)<br>
     // stored on the stack, while the dbg.declare can only describe<br>
     // the stack slot (and at a lexical-scope granularity). Later<br>
     // passes will attempt to elide the stack slot.<br>
-    if (AI && !isArray(AI)) {<br>
-      for (auto &AIUse : AI->uses()) {<br>
-        User *U = AIUse.getUser();<br>
-        if (StoreInst *SI = dyn_cast<StoreInst>(U)) {<br>
-          if (AIUse.getOperandNo() == 1)<br>
-            ConvertDebugDeclareToDebugValue(DDI, SI, DIB);<br>
-        } else if (LoadInst *LI = dyn_cast<LoadInst>(U)) {<br>
-          ConvertDebugDeclareToDebugValue(DDI, LI, DIB);<br>
-        } else if (CallInst *CI = dyn_cast<CallInst>(U)) {<br>
-          // This is a call by-value or some other instruction that<br>
-          // takes a pointer to the variable. Insert a *value*<br>
-          // intrinsic that describes the alloca.<br>
-          DIB.insertDbgValueIntrinsic(AI, DDI->getVariable(),<br>
-                                      DDI->getExpression(), DDI->getDebugLoc(),<br>
-                                      CI);<br>
-        }<br>
+    if (!AI || isArray(AI))<br>
+      continue;<br>
+<br>
+    // A volatile load/store means that the alloca can't be elided anyway.<br>
+    if (llvm::any_of(AI->users(), [](User *U) -> bool {<br>
+          if (LoadInst *LI = dyn_cast<LoadInst>(U))<br>
+            return LI->isVolatile();<br>
+          if (StoreInst *SI = dyn_cast<StoreInst>(U))<br>
+            return SI->isVolatile();<br>
+          return false;<br>
+        }))<br>
+      continue;<br>
+<br>
+    for (auto &AIUse : AI->uses()) {<br>
+      User *U = AIUse.getUser();<br>
+      if (StoreInst *SI = dyn_cast<StoreInst>(U)) {<br>
+        if (AIUse.getOperandNo() == 1)<br>
+          ConvertDebugDeclareToDebugValue(DDI, SI, DIB);<br>
+      } else if (LoadInst *LI = dyn_cast<LoadInst>(U)) {<br>
+        ConvertDebugDeclareToDebugValue(DDI, LI, DIB);<br>
+      } else if (CallInst *CI = dyn_cast<CallInst>(U)) {<br>
+        // This is a call by-value or some other instruction that<br>
+        // takes a pointer to the variable. Insert a *value*<br>
+        // intrinsic that describes the alloca.<br>
+        DIB.insertDbgValueIntrinsic(AI, DDI->getVariable(),<br>
+                                    DDI->getExpression(), DDI->getDebugLoc(),<br>
+                                    CI);<br>
       }<br>
-      DDI->eraseFromParent();<br>
     }<br>
+    DDI->eraseFromParent();<br>
   }<br>
   return true;<br>
 }<br>
<br>
Added: llvm/trunk/test/DebugInfo/Generic/volatile-alloca.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/volatile-alloca.ll?rev=327092&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/volatile-alloca.ll?rev=327092&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/DebugInfo/Generic/volatile-alloca.ll (added)<br>
+++ llvm/trunk/test/DebugInfo/Generic/volatile-alloca.ll Thu Mar  8 16:45:04 2018<br>
@@ -0,0 +1,83 @@<br>
+; RUN: opt -mem2reg -instcombine %s -o - -S | FileCheck %s<br>
+;<br>
+; Test that a dbg.declare describing am alloca with volatile<br>
+; load/stores is not lowered into a dbg.value, since the alloca won't<br>
+; be elided anyway.<br>
+;<br>
+; Generated from:<br>
+;<br>
+; unsigned long long g();<br>
+; void h(unsigned long long);<br>
+; void f() {<br>
+;   volatile unsigned long long v = g();<br>
+;   if (v == 0)<br>
+;     g();<br>
+;   h(v);<br>
+; }<br>
+<br>
+; CHECK: alloca i64<br>
+; CHECK-NOT: call void @llvm.dbg.value<br>
+; CHECK: call void @llvm.dbg.declare<br>
+; CHECK-NOT: call void @llvm.dbg.value<br>
+<br>
+source_filename = "volatile.c"<br>
+<br>
+; Function Attrs: nounwind optsize ssp uwtable<br>
+define void @f() local_unnamed_addr #0 !dbg !8 {<br>
+  %1 = alloca i64, align 8<br>
+  %2 = bitcast i64* %1 to i8*, !dbg !15<br>
+  call void @llvm.lifetime.start.p0i8(i64 8, i8* %2), !dbg !15<br>
+  call void @llvm.dbg.declare(metadata i64* %1, metadata !12, metadata !DIExpression()), !dbg !15<br>
+  %3 = call i64 (...) @g() #4, !dbg !15<br>
+  store volatile i64 %3, i64* %1, align 8, !dbg !15<br>
+  %4 = load volatile i64, i64* %1, align 8, !dbg !15<br>
+  %5 = icmp eq i64 %4, 0, !dbg !15<br>
+  br i1 %5, label %6, label %8, !dbg !15<br>
+<br>
+; <label>:6:                                      ; preds = %0<br>
+  %7 = call i64 (...) @g() #4, !dbg !15<br>
+  br label %8, !dbg !15<br>
+<br>
+; <label>:8:                                      ; preds = %6, %0<br>
+  %9 = load volatile i64, i64* %1, align 8, !dbg !15<br>
+  call void @h(i64 %9) #4, !dbg !15<br>
+  call void @llvm.lifetime.end.p0i8(i64 8, i8* %2), !dbg !15<br>
+  ret void, !dbg !15<br>
+}<br>
+<br>
+; Function Attrs: argmemonly nounwind<br>
+declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1<br>
+<br>
+; Function Attrs: nounwind readnone speculatable<br>
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #2<br>
+<br>
+; Function Attrs: optsize<br>
+declare i64 @g(...) local_unnamed_addr #3<br>
+<br>
+; Function Attrs: optsize<br>
+declare void @h(i64) local_unnamed_addr #3<br>
+<br>
+; Function Attrs: argmemonly nounwind<br>
+declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1<br>
+<br>
+attributes #0 = { nounwind optsize ssp uwtable }<br>
+attributes #1 = { argmemonly nounwind }<br>
+attributes #2 = { nounwind readnone speculatable }<br>
+attributes #3 = { optsize }<br>
+attributes #4 = { optsize }<br>
+<br>
+!<a href="http://llvm.dbg.cu/" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
+!llvm.module.flags = !{!3, !4}<br>
+<br>
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)<br>
+!1 = !DIFile(filename: "volatile.c", directory: "/")<br>
+!3 = !{i32 2, !"Dwarf Version", i32 4}<br>
+!4 = !{i32 2, !"Debug Info Version", i32 3}<br>
+!8 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 3, type: !9, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0, variables: !11)<br>
+!9 = !DISubroutineType(types: !10)<br>
+!10 = !{null}<br>
+!11 = !{!12}<br>
+!12 = !DILocalVariable(name: "v", scope: !8, file: !1, line: 4, type: !13)<br>
+!13 = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: !14)<br>
+!14 = !DIBasicType(name: "long long unsigned int", size: 64, encoding: DW_ATE_unsigned)<br>
+!15 = !DILocation(line: 4, column: 3, scope: !8)<br>
<br>
Modified: llvm/trunk/test/Transforms/Util/simplify-dbg-declare-load.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Util/simplify-dbg-declare-load.ll?rev=327092&r1=327091&r2=327092&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Util/simplify-dbg-declare-load.ll?rev=327092&r1=327091&r2=327092&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/Util/simplify-dbg-declare-load.ll (original)<br>
+++ llvm/trunk/test/Transforms/Util/simplify-dbg-declare-load.ll Thu Mar  8 16:45:04 2018<br>
@@ -13,6 +13,7 @@ declare void @llvm.dbg.value(metadata, m<br>
 define void @julia_fastshortest_6256() #1 {<br>
 top:<br>
   %cp = alloca %foo, align 8<br>
+  %sink = alloca %foo, align 8<br>
   call void @llvm.dbg.declare(metadata %foo* %cp, metadata !1, metadata !16), !dbg !17<br>
   br i1 undef, label %idxend, label %fail<br>
<br>
@@ -21,9 +22,10 @@ fail:<br>
<br>
 idxend:                                           ; preds = %top<br>
 ; CHECK-NOT: call void @llvm.dbg.value(metadata %foo* %cp,<br>
-  %0 = load volatile %foo, %foo* %cp, align 8<br>
-; CHECK: call void @llvm.dbg.value(metadata %foo %0,<br>
-  store volatile %foo %0, %foo* undef, align 8<br>
+  %0 = load %foo, %foo* %cp, align 8<br>
+  store volatile %foo %0, %foo *%sink, align 8<br>
+; CHECK: call void @llvm.dbg.value(metadata %foo %<br>
+  store %foo %0, %foo* undef, align 8<br>
   ret void<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>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
</div></blockquote></div></div></blockquote></div>