[PATCH] D80691: Proposed fix for PR46114
Qirun Zhang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 2 07:08:51 PDT 2020
helloqirun added a comment.
In D80691#2068585 <https://reviews.llvm.org/D80691#2068585>, @Orlando wrote:
> In D80691#2067707 <https://reviews.llvm.org/D80691#2067707>, @helloqirun wrote:
>
> > Thanks @Orlando, I think I agree with your reasoning. My patch on introducing an undef is based on the same reasoning (but I could be totally wrong).
> >
> > Let's see what we should do instead.
> >
> > Before earlycse, we have:
> >
> > %0 = load i32, i32* @a, align 4, !dbg !26, !tbaa !27
> > call void @llvm.dbg.value(metadata i32 0, metadata !22, metadata !DIExpression()), !dbg !31
> > %1 = load i32, i32* @a, align 4, !dbg !32, !tbaa !27
> > call void @llvm.dbg.value(metadata i32 %1, metadata !22, metadata !DIExpression()), !dbg !31
> >
> > !26 = !DILocation(line: 5, column: 11, scope: !17)
> > !31 = !DILocation(line: 0, scope: !17)
> > !32 = !DILocation(line: 6, column: 15, scope: !17)
> >
> >
> > after earlycse, we have:
> >
> > %0 = load i32, i32* @a, align 4, !dbg !26, !tbaa !27
> > ; I omitted the variable !21 here since it's irrelevant.
> > call void @llvm.dbg.value(metadata i32 0, metadata !22, metadata !DIExpression()), !dbg !31
> > call void @llvm.dbg.value(metadata i32 %0, metadata !22, metadata !DIExpression()), !dbg !31
> >
> > !21 = !DILocalVariable(name: "d", scope: !17, file: !3, line: 5, type: !12)
> > !22 = !DILocalVariable(name: "l_52", scope: !17, file: !3, line: 5, type: !12)
> > !26 = !DILocation(line: 5, column: 11, scope: !17)
> > !31 = !DILocation(line: 0, scope: !17)
> > !32 = !DILocation(line: 6, column: 20, scope: !17)
> >
> >
> > Could you please help me verify the following?
> > Based on my understanding, it seems that when eliminating the second `load i32, i32* @a` in EarlyCSE, we should use the location `!32` instead of `!26` for the resulting `load i32, i32* @a`.
> > Thanks.
>
>
> After EarlyCSE it may be wrong to say that the load `%0 = load ...` comes from either line 5 (!26)
> or line 6 (!32) because it now comes from source code from both lines. There is a method to handle
> this case called `Instruction::applyMergedLocation`. If my reasoning is correct then we'd just need
> this:
>
> + InVal.DefInst->applyMergedLocation(InVal.DefInst->getDebugLoc().get(),
> + Inst.getDebugLoc());
> if (!Inst.use_empty())
> Inst.replaceAllUsesWith(Op);
> salvageKnowledge(&Inst, &AC);
> salvageKnowledge(&Inst, &AC);
> removeMSSA(Inst);
>
>
> This will give the instruction line 0 for your reproducer. I know a lot less about line numbers than
> variable locations, so I'd want someone else to look at that first. @probinson, @jmorse does it
> look like that's the correct thing to do here?
>
> Either way, looking a little closer at the ticket, other than the line number issue mentioned above
> (which I'm not confident about), I don't think behaviour in the ticket is actually a bug. The
> debugger step line (copied below) shows that we're stopping on column 20 of line 6, which is on the
> right hand side of the first '=', and IIUC it's reasonable to expect l_52 to no longer be 0 here.
>
> Copied from https://bugs.llvm.org/show_bug.cgi?id=46114
> Process 2616 stopped
> * thread #1, name = 'a.out', stop reason = breakpoint 1.1
> frame #0: 0x0000000000400486 a.out`main at abc.c:6:20
> 3 char c;
> 4 int main() {
> 5 int d = a, l_52 = 0;
> -> 6 b = (l_52 = a) - c; // stop here
> 7 if (d) {
> 8 int e=1;
> 9 }
>
> (lldb) p l_52
> (int) $0 = 1
@Orlando I think you are probably right. It should indeed prints `$0=1`. I appreciate your patience and my apology for the report. Shall I close the original PR?
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D80691/new/
https://reviews.llvm.org/D80691
More information about the llvm-commits
mailing list