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