[llvm] r226842 - Revert "PR21408: Workaround the appearance of duplicate variables due to problems when inlining two calls to the same function from the same call site."

David Blaikie dblaikie at gmail.com
Mon Jan 26 08:16:10 PST 2015


On Sun, Jan 25, 2015 at 11:55 PM, Hao Liu <Hao.Liu at arm.com> wrote:

> Hi David,
>
> This commit breaks our internal tests.
>
> It seems we cannot remove this work around. Current trunk cannot pass the
> removed test case test/DebugInfo/duplicate_inline.ll.


That's why the test case was removed in this commit - it's no longer passes
but it's no longer representative of any IR that clang produces (well, it
wasn't really clang producing this IR - it was the LLVM inliner
pass/utility, which has now been fixed not to produce this). How/why did
you end up running the compiler against the deleted test case?


> To reproduce it as
> following:
>     llc < duplicate_inline.ll
>     clang-3.6: llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp:171: void
> llvm::DwarfFile::addScopeVariable(llvm::LexicalScope *, llvm::DbgVariable
> *): Assertion `CurNum != ArgNum && "Duplicate argument"' failed.
>     0  clang-3.6       0x00000000011134c8
> llvm::sys::PrintStackTrace(_IO_FILE*) + 40
>
> Thanks,
> -Hao
>
> >>-----Original Message-----
> >>From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-
> >>bounces at cs.uiuc.edu] On Behalf Of David Blaikie
> >>Sent: 2015年1月23日 1:50
> >>To: llvm-commits at cs.uiuc.edu
> >>Subject: [llvm] r226842 - Revert "PR21408: Workaround the appearance of
> >>duplicate variables due to problems when inlining two calls to the same
> >>function from the same call site."
> >>
> >>Author: dblaikie
> >>Date: Thu Jan 22 11:49:59 2015
> >>New Revision: 226842
> >>
> >>URL: http://llvm.org/viewvc/llvm-project?rev=226842&view=rev
> >>Log:
> >>Revert "PR21408: Workaround the appearance of duplicate variables due to
> >>problems when inlining two calls to the same function from the same call
> >>site."
> >>
> >>The underlying bug has been fixed in r226736 so there's no need to
> >>workaround this anymore.
> >>
> >>This reverts commit r220923.
> >>
> >>Removed:
> >>    llvm/trunk/test/DebugInfo/duplicate_inline.ll
> >>Modified:
> >>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp
> >>
> >>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp
> >>URL: http://llvm.org/viewvc/llvm-
> >>project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp?rev=226842&r1=2
> >>26841&r2=226842&view=diff
> >>===============================================================
> >>===============
> >>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp (original)
> >>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp Thu Jan 22 11:49:59
> >>+++ 2015
> >>@@ -168,12 +168,7 @@ void DwarfFile::addScopeVariable(Lexical
> >>       // A later indexed parameter has been found, insert immediately
> before
> >>it.
> >>       if (CurNum > ArgNum)
> >>         break;
> >>-      // FIXME: There are still some cases where two inlined functions
> are
> >>-      // conflated together (two calls to the same function at the same
> >>-      // location (eg: via a macro, or without column info, etc)) and
> then
> >>-      // their arguments are conflated as well.
> >>-      assert((LS->getParent() || CurNum != ArgNum) &&
> >>-             "Duplicate argument for top level (non-inlined) function");
> >>+      assert(CurNum != ArgNum && "Duplicate argument");
> >>       ++I;
> >>     }
> >>     Vars.insert(I, Var);
> >>
> >>Removed: llvm/trunk/test/DebugInfo/duplicate_inline.ll
> >>URL: http://llvm.org/viewvc/llvm-
>
> >>project/llvm/trunk/test/DebugInfo/duplicate_inline.ll?rev=226841&view=auto
> >>===============================================================
> >>===============
> >>--- llvm/trunk/test/DebugInfo/duplicate_inline.ll (original)
> >>+++ llvm/trunk/test/DebugInfo/duplicate_inline.ll (removed)
> >>@@ -1,117 +0,0 @@
> >>-; REQUIRES: object-emission
> >>-
> >>-; RUN: %llc_dwarf < %s -filetype=obj | llvm-dwarfdump -debug-dump=info -
> |
> >>FileCheck %s
> >>-
> >>-; Built with clang from the following source:
> >>-; void f1(int);
> >>-; __attribute__((always_inline)) inline void f2(int i) { f1(i); } -; -;
> #define
> >>MULTICALL \
> >>-;   f2(x);          \
> >>-;   f2(y);
> >>-;
> >>-; void f3(int x, int y) { MULTICALL; }
> >>-
> >>-; FIXME: This produces only one inlined_subroutine, with two
> >>formal_parameters -; (both named "this"), one for each of the actual
> inlined
> >>subroutines.  ; -; Inlined scopes are differentiated by the combination
> of
> >>'inlined at' (call) -; location and the location within the function. If
> two calls to
> >>the same -; function occur at the same location the scopes end up
> conflated
> >>and there -; appears to be only one inlined function.
> >>-; To fix this, we'd need to add some kind of unique metadata per call
> site,
> >>possibly something like:
> >>-;
> >>-; !42 = !MDLocation(line: 1, scope: !43, inlinedAt: !44) -; !44
> >>= !MDLocation(line: 2, scope: !45) -; -; -> -; -; !42 = !MDLocation(line:
> 1,
> >>scope: !43, inlinedAt: !44) -; !44 = !{!45, !44} -; !45 =
> !MDLocation(line: 2,
> >>scope: !45) -; -; since cycles in metadata are not uniqued, the !44 node
> would
> >>not be shared -; between calls to the same function from the same
> location,
> >>ensuring separate -; inlined subroutines would be generated.
> >>-;
> >>-; Once this is done, the (insufficient) hack in clang that adds column
> -;
> >>information to call sites to differentiate inlined callers can be removed
> as it -;
> >>will no longer be necessary.
> >>-;
> >>-; While it might be nice to omit the duplicate parameter in this case
> (while -;
> >>we wait/work on the real fix), it's actually better to leave it in
> because
> it -;
> >>allows us to hold the invariant that every DbgVariable has a DIE, every
> time.
> >>-; This has proved valuable in finding other bugs, so I want to avoid
> removing
> >>the -; invariant/assertion. Besides, we don't know which one's the right
> one
> >>anyway...
> >>-
> >>-; CHECK: DW_TAG_subprogram
> >>-; CHECK:   DW_TAG_inlined_subroutine
> >>-; CHECK:     DW_TAG_formal_parameter
> >>-; CHECK-NOT: DW_TAG
> >>-; CHECK:     DW_TAG_formal_parameter
> >>-; CHECK-NOT: DW_TAG
> >>-; CHECK:     NULL
> >>-; CHECK-NOT: DW_TAG
> >>-; CHECK:   NULL
> >>-
> >>-; Function Attrs: uwtable
> >>-define void @_Z2f3ii(i32 %x, i32 %y) #0 {
> >>-entry:
> >>-  %i.addr.i1 = alloca i32, align 4
> >>-  %i.addr.i = alloca i32, align 4
> >>-  %x.addr = alloca i32, align 4
> >>-  %y.addr = alloca i32, align 4
> >>-  store i32 %x, i32* %x.addr, align 4
> >>-  call void @llvm.dbg.declare(metadata i32* %x.addr, metadata !15,
> >>metadata !16), !dbg !17
> >>-  store i32 %y, i32* %y.addr, align 4
> >>-  call void @llvm.dbg.declare(metadata i32* %y.addr, metadata !18,
> >>metadata !16), !dbg !19
> >>-  %0 = load i32* %x.addr, align 4, !dbg !20
> >>-  store i32 %0, i32* %i.addr.i, align 4, !dbg !20
> >>-  call void @llvm.dbg.declare(metadata i32* %i.addr.i, metadata !21,
> >>metadata !16), !dbg !22
> >>-  %1 = load i32* %i.addr.i, align 4, !dbg !23
> >>-  call void @_Z2f1i(i32 %1), !dbg !23
> >>-  %2 = load i32* %y.addr, align 4, !dbg !20
> >>-  store i32 %2, i32* %i.addr.i1, align 4, !dbg !20
> >>-  call void @llvm.dbg.declare(metadata i32* %i.addr.i1, metadata !21,
> >>metadata !16), !dbg !22
> >>-  %3 = load i32* %i.addr.i1, align 4, !dbg !23
> >>-  call void @_Z2f1i(i32 %3), !dbg !23
> >>-  ret void, !dbg !24
> >>-}
> >>-
> >>-; Function Attrs: nounwind readnone
> >>-declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
> >>-
> >>-declare void @_Z2f1i(i32) #2
> >>-
> >>-attributes #0 = { uwtable "less-precise-fpmad"="false"
> "no-frame-pointer-
> >>elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false"
> "no-
> >>nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-
> >>math"="false" "use-soft-float"="false" } -attributes #1 = { nounwind
> readnone }
> >>-attributes #2 = { "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="true"
> >>"no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-
> >>math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> >>"use-soft-float"="false" }
> >>-
> >>-!llvm.dbg.cu = !{!0}
> >>-!llvm.module.flags = !{!12, !13}
> >>-!llvm.ident = !{!14}
> >>-
> >>-!0 = !{!"0x11\004\00clang version 3.6.0
> >>\000\00\000\00\001", !1, !2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ]
> >>[/tmp/dbginfo/duplicate_inline.cpp] [DW_LANG_C_plus_plus]
> >>-!1 = !{!"duplicate_inline.cpp", !"/tmp/dbginfo"}
> >>-!2 = !{}
> >>-!3 = !{!4, !9}
> >>-!4
> >>= !{!"0x2e\00f3\00f3\00_Z2f3ii\008\000\001\000\000\00256\000\008", !1,
> !5,
> >> !6, null, void (i32, i32)* @_Z2f3ii, null, null, !2} ; [
> DW_TAG_subprogram ]
> >>[line 8] [def] [f3]
> >>-!5 = !{!"0x29", !1}    ; [ DW_TAG_file_type ]
> >>[/tmp/dbginfo/duplicate_inline.cpp]
> >>-!6 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !7, null,
> null,
> >>null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0]
> [from ]
> >>-!7 = !{null, !8, !8}
> >>-!8 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ;
> >>[ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc
> >>DW_ATE_signed]
> >>-!9
> >>= !{!"0x2e\00f2\00f2\00_Z2f2i\002\000\001\000\000\00256\000\002", !1, !5,
> >>!10, null, null, null, null, !2} ; [ DW_TAG_subprogram ] [line 2] [def]
> [f2]
> >>-!10 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !11, null,
> null,
> >>null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0]
> [from ]
> >>-!11 = !{null, !8}
> >>-!12 = !{i32 2, !"Dwarf Version", i32 4}
> >>-!13 = !{i32 2, !"Debug Info Version", i32 2}
> >>-!14 = !{!"clang version 3.6.0 "}
> >>-!15 = !{!"0x101\00x\0016777224\000", !4, !5, !8} ; [ DW_TAG_arg_variable
> ]
> >>[x] [line 8]
> >>-!16 = !{!"0x102"}               ; [ DW_TAG_expression ]
> >>-!17 = !MDLocation(line: 8, column: 13, scope: !4)
> >>-!18 = !{!"0x101\00y\0033554440\000", !4, !5, !8} ; [ DW_TAG_arg_variable
> ]
> >>[y] [line 8]
> >>-!19 = !MDLocation(line: 8, column: 20, scope: !4)
> >>-!20 = !MDLocation(line: 8, column: 25, scope: !4)
> >>-!21 = !{!"0x101\00i\0016777218\000", !9, !5, !8} ; [ DW_TAG_arg_variable
> ]
> >>[i] [line 2]
> >>-!22 = !MDLocation(line: 2, column: 51, scope: !9, inlinedAt: !20)
> >>-!23 = !MDLocation(line: 2, column: 56, scope: !9, inlinedAt: !20)
> >>-!24 = !MDLocation(line: 8, column: 36, scope: !4)
> >>
> >>
> >>_______________________________________________
> >>llvm-commits mailing list
> >>llvm-commits at cs.uiuc.edu
> >>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150126/8d684356/attachment.html>


More information about the llvm-commits mailing list