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