| Issue |
110313
|
| Summary |
[DebugInfo] Redundant `.loc` due to Clang issues in codegen of `for` statement
|
| Labels |
clang:codegen,
debuginfo
|
| Assignees |
pogo59
|
| Reporter |
pogo59
|
I'm filing this issue as a follow-up to PR108300. Ordinarily I'd track this as an internal issue within Sony, but as I'm retiring from Sony effective today, I won't have access to my test case or explanation. I do intend to look at this in the next couple of weeks.
Here's my example. It's the simplest form of the `for` statement; more complicated forms might have additional issues, but let's start small.
```
int i = 2;
void test_for() {
#line 300
for (; i < 10; ++i)
i += 2;
}
```
Compile with `-g -gno-column-info -S -emit-llvm` and we see this IR and location metadata:
```
for.cond: ; preds = %for.inc, %entry
%0 = load i32, ptr @i, align 4, !dbg !18
%cmp = icmp slt i32 %0, 10, !dbg !18
br i1 %cmp, label %for.body, label %for.end, !dbg !21
!14 = distinct !DISubprogram(....)
!17 = !DILocation(line: 300, scope: !14)
!18 = !DILocation(line: 300, scope: !19)
!19 = distinct !DILexicalBlock(scope: !20, file: !3, line: 300)
!20 = distinct !DILexicalBlock(scope: !14, file: !3, line: 300)
!21 = !DILocation(line: 300, scope: !20)
```
Observe that the evaluation of the condition uses `!18` as its `DILocation`, while the conditional branch uses `!21`. These have the same source location, but different scopes. When it comes time to emit the `.loc` directives for the machine instructions (in `llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp`), the fact that the branch has a different `DILocation` causes us to generate a new `.loc` directive. The fact that the only difference is the _scope_ (which is irrelevant to `.loc`) is not considered.
Look at the assembly code for the same block:
```
.Ltmp0:
.loc 0 300 0 prologue_end # tc13837-for.cpp:300:0
jmp .LBB0_1
.LBB0_1: # %for.cond
# =>This Inner Loop Header: Depth=1
.Ltmp1:
.loc 0 300 0 is_stmt 0 # tc13837-for.cpp:300:0
cmpl $10, i(%rip)
.Ltmp2:
.loc 0 300 0 # tc13837-for.cpp:300:0
jge .LBB0_4
```
The `.loc` at `.Ltmp1` is emitted because it is at the start of a new basic block. But the `.loc` at `.Ltmp2` is 100% redundant; it's emitted only because of the scope confusion described above.
Arguably we could filter out the redundant `.loc` directives in LLVM, but I claim the root cause is in Clang codegen; see the PR cited above, which fixed the equivalent problem with `if` statements simply by correcting how Clang sets up its notion of `DebugLoc`.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs