[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