http://llvm.org/bugs/show_bug.cgi?id=14023

             Bug #: 14023
           Summary: Loop unroller and other passes fail to update Debugger
                    information for register-mapped variables
           Product: libraries
           Version: trunk
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Core LLVM classes
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected]
    Classification: Unclassified


The loop unroller fails to update the "call @llvm.dbg.value" instructions as it
unrolls the body of a loop. Thus, the generated dwarf does not properly track
the value of any register-based variable that is updated on each iteration of
the loop.

Test case:

int sum(int *vector){
    int result = 0;
    for (int i = 0; i < 8; i++){
       result += vector[i];
    }
    return result;
}


Bitcode output at -O3 (x86 target):

define i32 @sum(i32* nocapture %vector) nounwind readonly {
entry:
tail call void @llvm.dbg.value(metadata !{i32* %vector}, i64 0, metadata !13),
!dbg !18
  tail call void @llvm.dbg.value(metadata !2, i64 0, metadata !14), !dbg !19
  tail call void @llvm.dbg.value(metadata !2, i64 0, metadata !16), !dbg !20
  %0 = load i32* %vector, align 4, !dbg !21, !tbaa !23
  tail call void @llvm.dbg.value(metadata !{i32 %0}, i64 0, metadata !14), !dbg
!21
  tail call void @llvm.dbg.value(metadata !26, i64 0, metadata !16), !dbg !27
  %arrayidx.1 = getelementptr inbounds i32* %vector, i32 1, !dbg !21
  %1 = load i32* %arrayidx.1, align 4, !dbg !21, !tbaa !23
  %add.1 = add nsw i32 %1, %0, !dbg !21

>>>WRONG: the following should be "!{i32 %add.1}"
  tail call void @llvm.dbg.value(metadata !{i32 %0}, i64 0, metadata !14), !dbg
!21
>>>WRONG: below !26 is !{i32 1}   Should be !{i32 2}
  tail call void @llvm.dbg.value(metadata !26, i64 0, metadata !16), !dbg !27
  %arrayidx.2 = getelementptr inbounds i32* %vector, i32 2, !dbg !21
  %2 = load i32* %arrayidx.2, align 4, !dbg !21, !tbaa !23
  %add.2 = add nsw i32 %2, %add.1, !dbg !21
>>>WRONG:the following should be "!{i32 %add.2}"
  tail call void @llvm.dbg.value(metadata !{i32 %0}, i64 0, metadata !14), !dbg
!21
>>>WRONG: below !26 is !{i32 1}. Should be !{i32 3}
  tail call void @llvm.dbg.value(metadata !26, i64 0, metadata !16), !dbg !27
  ... etc.


The problem appears to be systemic with metadata references to virtual
registers. Such registers do not appear as "uses"; therefore, they don't get
updated as optimizations occur. Not only does the loop unroller exhibit this
problem, but so does the Loop Rotate pass, the Loop Strength Reduce pass, and
any other pass that remaps virtual registers that correspond to local
variables.

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to