[llvm] r278532 - ADT: Remove the ilist_nextprev_traits customization point

Yung, Douglas via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 17:57:43 PDT 2016


Here's the stacktrace for the same test with r278572 and r278577 applied:

>	llc.exe!llvm::MachineInstr::getOpcode() Line 286	C++
 	llc.exe!findDeadCallerSavedReg(llvm::MachineBasicBlock & MBB, llvm::MachineInstrBundleIterator<llvm::MachineInstr> & MBBI, const llvm::X86RegisterInfo * TRI, bool Is64Bit) Line 159	C++
 	llc.exe!llvm::X86FrameLowering::emitSPUpdate(llvm::MachineBasicBlock & MBB, llvm::MachineInstrBundleIterator<llvm::MachineInstr> & MBBI, __int64 NumBytes, bool InEpilogue) Line 291	C++
 	llc.exe!llvm::X86FrameLowering::emitEpilogue(llvm::MachineFunction & MF, llvm::MachineBasicBlock & MBB) Line 1622	C++
 	llc.exe!`anonymous namespace'::PEI::insertPrologEpilogCode(llvm::MachineFunction & Fn) Line 977	C++
 	llc.exe!`anonymous namespace'::PEI::runOnMachineFunction(llvm::MachineFunction & Fn) Line 211	C++
 	llc.exe!llvm::MachineFunctionPass::runOnFunction(llvm::Function & F) Line 60	C++
 	llc.exe!llvm::FPPassManager::runOnFunction(llvm::Function & F) Line 1522	C++
 	llc.exe!llvm::FPPassManager::runOnModule(llvm::Module & M) Line 1543	C++
 	llc.exe!`anonymous namespace'::MPPassManager::runOnModule(llvm::Module & M) Line 1599	C++
 	llc.exe!llvm::legacy::PassManagerImpl::run(llvm::Module & M) Line 1702	C++
 	llc.exe!llvm::legacy::PassManager::run(llvm::Module & M) Line 1734	C++
 	llc.exe!compileModule(char * * argv, llvm::LLVMContext & Context) Line 507	C++
 	llc.exe!main(int argc, char * * argv) Line 273	C++
 	llc.exe!__tmainCRTStartup() Line 626	C
 	llc.exe!mainCRTStartup() Line 466	C
 	kernel32.dll!0000000076f259bd()	Unknown
 	ntdll.dll!000000007705a2e1()	Unknown

This compiler has everything up to and including r278532, plus patches for r278537, r278539, r278572 and r278577.

Douglas Yung

> -----Original Message-----
> From: hwennborg at google.com [mailto:hwennborg at google.com] On Behalf Of
> Hans Wennborg
> Sent: Friday, August 12, 2016 17:53
> To: Duncan P. N. Exon Smith
> Cc: Yung, Douglas; llvm-commits at lists.llvm.org
> Subject: Re: [llvm] r278532 - ADT: Remove the ilist_nextprev_traits
> customization point
> 
> I'm looking at the lit tests now. I think I have a fix for the X86
> ones, but there's also some failures in AMDGPU tests. Hopefully easy to
> fix..
> 
> On Fri, Aug 12, 2016 at 5:18 PM, Duncan P. N. Exon Smith via llvm-
> commits <llvm-commits at lists.llvm.org> wrote:
> >
> >> On 2016-Aug-12, at 17:14, Duncan P. N. Exon Smith via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> >>
> >>>
> >>> On 2016-Aug-12, at 17:12, Yung, Douglas <douglas.yung at sony.com>
> wrote:
> >>>
> >>> Hi Duncan,
> >>>
> >>> Here is a stack trace from the failure of CodeGen\X86\fast-isel-
> i1.ll.
> >>>
> >>> Command: llc.exe fast-isel-i1.ll -mtriple=x86_64-apple-darwin10
> >>> -fast-isel -fast-isel-abort=1
> >>>
> >>> In the Visual Studio debugger, I get "Unhandled exception at
> 0x000000013FF1708F in llc.exe: 0xC0000005: Access violation reading
> location 0xFFFFFFFFFFFFFFFF."
> >>>
> >>> The stack trace at the point of failure is:
> >>>
> >>>>     llc.exe!llvm::MachineInstr::getOpcode() Line 286        C++
> >>>
> llc.exe!llvm::X86FrameLowering::emitEpilogue(llvm::MachineFunction &
> MF, llvm::MachineBasicBlock & MBB) Line 1483       C++
> >
> > There is no call to getOpcode() on this line.  It looks like you
> haven't picked up the fix in r278572 yet (or, likely, Hans's fix in
> r278577).  Can you cherry-pick in those commits and do an incremental
> build?
> >
> >>>      llc.exe!`anonymous
> namespace'::PEI::insertPrologEpilogCode(llvm::MachineFunction & Fn)
> Line 977 C++
> >>>      llc.exe!`anonymous
> namespace'::PEI::runOnMachineFunction(llvm::MachineFunction & Fn) Line
> 211   C++
> >>>
> llc.exe!llvm::MachineFunctionPass::runOnFunction(llvm::Function & F)
> Line 60    C++
> >>>      llc.exe!llvm::FPPassManager::runOnFunction(llvm::Function & F)
> Line 1522        C++
> >>>      llc.exe!llvm::FPPassManager::runOnModule(llvm::Module & M)
> Line 1543    C++
> >>>      llc.exe!`anonymous
> namespace'::MPPassManager::runOnModule(llvm::Module & M) Line 1599
> C++
> >>>      llc.exe!llvm::legacy::PassManagerImpl::run(llvm::Module & M)
> Line 1702  C++
> >>>      llc.exe!llvm::legacy::PassManager::run(llvm::Module & M) Line
> 1734      C++
> >>>      llc.exe!compileModule(char * * argv, llvm::LLVMContext &
> Context) Line 507      C++
> >>>      llc.exe!main(int argc, char * * argv) Line 273  C++
> >>>      llc.exe!__tmainCRTStartup() Line 626    C
> >>>      llc.exe!mainCRTStartup() Line 466       C
> >>>      kernel32.dll!0000000076f259bd() Unknown
> >>>      ntdll.dll!000000007705a2e1()    Unknown
> >>>
> >>> The failure is here:
> >>>
> >>> /// Returns the opcode of this MachineInstr.
> >>> unsigned getOpcode() const { return MCID->Opcode; }  <== MCID has a
> >>> garbage value
> >>
> >> Looking at it now.
> >>
> >>>
> >>> Hope this helps, and I can generate the other stack traces as well
> if it helps, just let me know.
> >>
> >> If it's easy, that'd be great.  Then we don't need to wait for the
> bots to pass/fail after I fix this one.  Only send the unique ones
> though.
> >>
> >>> Douglas Yung
> >>>
> >>>> -----Original Message-----
> >>>> From: hwennborg at google.com [mailto:hwennborg at google.com] On Behalf
> >>>> Of Hans Wennborg
> >>>> Sent: Friday, August 12, 2016 16:45
> >>>> To: Duncan P. N. Exon Smith
> >>>> Cc: Yung, Douglas; llvm-commits at lists.llvm.org
> >>>> Subject: Re: [llvm] r278532 - ADT: Remove the
> ilist_nextprev_traits
> >>>> customization point
> >>>>
> >>>> On Fri, Aug 12, 2016 at 4:15 PM, Duncan P. N. Exon Smith
> >>>> <dexonsmith at apple.com> wrote:
> >>>>>
> >>>>>> On 2016-Aug-12, at 16:12, Yung, Douglas <douglas.yung at sony.com>
> >>>> wrote:
> >>>>>>
> >>>>>> Hi Duncan,
> >>>>>>
> >>>>>> Your change in r278572 seems to have helped, the number of
> >>>>>> failures
> >>>> is down to 8.
> >>>> (http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-
> >>>> scei-ps4-windows10pro-fast/builds/9911).
> >>>>>
> >>>>> Yes, I had just seen that myself and was about to comment!
> >>>>>
> >>>>>> (The sancov failure is unrelated to your change) I'm still
> >>>>>> building
> >>>> a debug build of the compiler and will send a callstack for the
> >>>> failure when I have it.
> >>>>>
> >>>>> Thanks very much.  Let me know if you need me to revert r278532-
> 42
> >>>> while we investigate (happy to revert as long as you can send me
> >>>> the backtraces!).
> >>>>
> >>>> I committed r278577 for another instance of this. Halfway through
> a
> >>>> Chromium build now :-)
> >>>>
> >>>>
> >>>>>>> -----Original Message-----
> >>>>>>> From: dexonsmith at apple.com [mailto:dexonsmith at apple.com]
> >>>>>>> Sent: Friday, August 12, 2016 16:05
> >>>>>>> To: Yung, Douglas
> >>>>>>> Cc: Hans Wennborg; llvm-commits at lists.llvm.org
> >>>>>>> Subject: Re: [llvm] r278532 - ADT: Remove the
> >>>>>>> ilist_nextprev_traits customization point
> >>>>>>>
> >>>>>>> Can you give me the backtraces?  I strongly suspect a similar
> >>>>>>> problem, but I can't investigate on Darwin without knowing
> where
> >>>>>>> it
> >>>> crashes.
> >>>>>>> (Perhaps r278572 will be sufficient...)
> >>>>>>>
> >>>>>>>> On 2016-Aug-12, at 15:54, Yung, Douglas
> <douglas.yung at sony.com>
> >>>>>>> wrote:
> >>>>>>>>
> >>>>>>>> Hi Duncan,
> >>>>>>>>
> >>>>>>>> I just wanted to add that I'm seeing 13 failures in the
> >>>>>>>> regression
> >>>>>>> tests on the Windows PS4 bot
> >>>>>>> (http://lab.llvm.org:8011/builders/llvm-
> >>>>>>> clang-lld-x86_64-scei-ps4-windows10pro-fast) that I suspect are
> >>>>>>> due to this change. The problem only seems to exist for us when
> >>>> building
> >>>>>>> on Windows, so that might be why Hans has not been able to
> >>>> reproduce
> >>>>>>> it on linux. To narrow it down, I synced up to r278532, saw the
> >>>>>>> build failure, and then patched it with the subsequent fixes,
> >>>>>>> r278537 and
> >>>>>>> r278539 only. Once I did that, I saw the following 13 test
> >>>> failures:
> >>>>>>>>
> >>>>>>>> Failing Tests (13):
> >>>>>>>> LLVM :: CodeGen/X86/2010-02-23-RematImplicitSubreg.ll
> >>>>>>>> LLVM :: CodeGen/X86/2011-03-08-Sched-crash.ll
> >>>>>>>> LLVM :: CodeGen/X86/2012-08-17-legalizer-crash.ll
> >>>>>>>> LLVM :: CodeGen/X86/avx-splat.ll LLVM ::
> >>>>>>>> CodeGen/X86/compare-inf.ll LLVM :: CodeGen/X86/copy-eflags.ll
> >>>>>>>> LLVM :: CodeGen/X86/fast-isel-i1.ll LLVM ::
> >>>>>>>> CodeGen/X86/machine-cse.ll LLVM :: CodeGen/X86/no-and8ri8.ll
> >>>>>>>> LLVM :: CodeGen/X86/shrink-wrap-chkstk.ll LLVM ::
> >>>>>>>> CodeGen/X86/x86-shrink-wrap-unwind.ll
> >>>>>>>> LLVM :: CodeGen/X86/x86-shrink-wrapping.ll
> >>>>>>>> LLVM ::
> Transforms/CodeExtractor/X86/InheritTargetAttributes.ll
> >>>>>>>>
> >>>>>>>> It's not immediately obvious to me why your change is causing
> >>>> these
> >>>>>>> failures, but this (as well as another failure) is causing the
> >>>>>>> PS4 Windows bot to be red at the moment. Can you take a look
> into this?
> >>>>>>>>
> >>>>>>>> Douglas Yung
> >>>>>>>>
> >>>>>>>>> -----Original Message-----
> >>>>>>>>> From: llvm-commits
> >>>>>>>>> [mailto:llvm-commits-bounces at lists.llvm.org]
> >>>> On
> >>>>>>>>> Behalf Of Hans Wennborg via llvm-commits
> >>>>>>>>> Sent: Friday, August 12, 2016 14:49
> >>>>>>>>> To: Duncan P. N. Exon Smith
> >>>>>>>>> Cc: llvm-commits
> >>>>>>>>> Subject: Re: [llvm] r278532 - ADT: Remove the
> >>>>>>>>> ilist_nextprev_traits customization point
> >>>>>>>>>
> >>>>>>>>> Just a heads up I'm getting compiler crashes building
> Chromium
> >>>>>>>>> on Windows with this (well, r278539 really). Still not sure
> >>>>>>>>> what's
> >>>>>>> going
> >>>>>>>>> on, though.. http://crbug.com/637413
> >>>>>>>>>
> >>>>>>>>> It's crashing here:
> >>>>>>>>>
> >>>>>>>>> void X86FrameLowering::emitEpilogue(MachineFunction &MF,
> >>>>>>>>>                                 MachineBasicBlock &MBB) const
> >>>>>>>>> { const MachineFrameInfo &MFI = MF.getFrameInfo();
> >>>>>>>>> X86MachineFunctionInfo *X86FI =
> >>>>>>> MF.getInfo<X86MachineFunctionInfo>();
> >>>>>>>>> MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator();
> >>>>>>>>> unsigned RetOpcode = MBBI->getOpcode();    <--- CRASH
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> I assume MBBI is an ilist_iterator<> of some kind, but I
> still
> >>>>>>>>> haven't been able to figure out what's up, or reproduce the
> >>>>>>>>> crash on Linux :-/
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> On Fri, Aug 12, 2016 at 10:32 AM, Duncan P. N. Exon Smith via
> >>>>>>>>> llvm- commits <llvm-commits at lists.llvm.org> wrote:
> >>>>>>>>>> Author: dexonsmith
> >>>>>>>>>> Date: Fri Aug 12 12:32:34 2016 New Revision: 278532
> >>>>>>>>>>
> >>>>>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=278532&view=rev
> >>>>>>>>>> Log:
> >>>>>>>>>> ADT: Remove the ilist_nextprev_traits customization point
> >>>>>>>>>>
> >>>>>>>>>> No one is using the capability to implement next and prev
> >>>> another
> >>>>>>>>>> way (since lld stopped doing it in r278468).  Remove the
> >>>>>>>>>> customization point by moving the API from
> >>>>>>>>>> ilist_nextprev_traits<T> to
> >>>>>>>>> ilist_node_access.
> >>>>>>>>>>
> >>>>>>>>>> The old traits class is still useful/necessary API as a
> >>>>>>>>>> target for friends of node types that inherit privately from
> >>>> ilist_node.
> >>>>>>>>>> Eventually I plan to either remove it entirely or move the
> >>>>>>>>>> template parameters to the methods.
> >>>>>>>>>>
> >>>>>>>>>> (Note: if there's desire to bring back customization of
> >>>> next/prev
> >>>>>>>>>> pointers in the future (e.g., to pack some bits in there), I
> >>>>>>>>>> think
> >>>>>>> a
> >>>>>>>>>> traits class like this is an awkward way to accomplish it.
> >>>>>>> Instead,
> >>>>>>>>>> we should change ilist<T> to be ilist<ilist_node<T>>, and
> >>>>>>>>>> give
> >>>> an
> >>>>>>>>>> extra template parameter to ilist_node.)
> >>>>>>>>>>
> >>>>>>>>>> Modified:
> >>>>>>>>>> llvm/trunk/include/llvm/ADT/ilist.h
> >>>>>>>>>> llvm/trunk/include/llvm/ADT/ilist_node.h
> >>>>>>>>>> llvm/trunk/include/llvm/IR/SymbolTableListTraits.h
> >>>>>>>>>>
> >>>>>>>>>> Modified: llvm/trunk/include/llvm/ADT/ilist.h
> >>>>>>>>>> URL:
> >>>>>>>>>> http://llvm.org/viewvc/llvm-
> >>>>>>>>> project/llvm/trunk/include/llvm/ADT/ilist.
> >>>>>>>>>> h?rev=278532&r1=278531&r2=278532&view=diff
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>
> >>>>
> ===================================================================
> >>>> =
> >>>>>>> =
> >>>>>>>>> =
> >>>>>>>>>> ========
> >>>>>>>>>> --- llvm/trunk/include/llvm/ADT/ilist.h (original)
> >>>>>>>>>> +++ llvm/trunk/include/llvm/ADT/ilist.h Fri Aug 12 12:32:34
> >>>>>>>>>> +++ 2016
> >>>>>>>>>> @@ -50,20 +50,64 @@ namespace llvm { template<typename
> >>>>>>>>>> NodeTy, typename Traits> class iplist; template<typename
> >>>>>>>>>> NodeTy> class ilist_iterator;
> >>>>>>>>>>
> >>>>>>>>>> -/// ilist_nextprev_traits - A fragment for template traits
> >>>>>>>>>> for intrusive list -/// that provides default next/prev
> >>>>>>>>>> implementations
> >>>>>>>>> for common operations.
> >>>>>>>>>> +/// An access class for next/prev on ilist_nodes.
> >>>>>>>>>> ///
> >>>>>>>>>> -template<typename NodeTy>
> >>>>>>>>>> -struct ilist_nextprev_traits {
> >>>>>>>>>> -  static NodeTy *getPrev(NodeTy *N) { return N->getPrev();
> }
> >>>>>>>>>> -  static NodeTy *getNext(NodeTy *N) { return N->getNext();
> }
> >>>>>>>>>> -  static const NodeTy *getPrev(const NodeTy *N) { return
> >>>>>>>>>> N->getPrev(); }
> >>>>>>>>>> -  static const NodeTy *getNext(const NodeTy *N) { return
> >>>>>>>>>> N->getNext(); }
> >>>>>>>>>> +/// This gives access to the private parts of ilist nodes.
> >>>>>>>>>> +Nodes
> >>>>>>>>> for
> >>>>>>>>>> +an ilist /// should friend this class if they inherit
> >>>>>>>>>> +privately from
> >>>>>>>>> ilist_node.
> >>>>>>>>>> +///
> >>>>>>>>>> +/// It's strongly discouraged to *use* this class outside
> of
> >>>>>>>>>> +ilist /// implementation.
> >>>>>>>>>> +struct ilist_node_access {
> >>>>>>>>>> +  template <typename NodeTy> static NodeTy *getPrev(NodeTy
> >>>>>>>>>> +*N)
> >>>> {
> >>>>>>>>>> +    return N->getPrev();
> >>>>>>>>>> +  }
> >>>>>>>>>> +  template <typename NodeTy> static NodeTy *getNext(NodeTy
> >>>>>>>>>> + *N)
> >>>> {
> >>>>>>>>>> +    return N->getNext();
> >>>>>>>>>> +  }
> >>>>>>>>>> +  template <typename NodeTy> static const NodeTy
> >>>>>>>>>> + *getPrev(const
> >>>>>>>>> NodeTy *N) {
> >>>>>>>>>> +    return N->getPrev();
> >>>>>>>>>> +  }
> >>>>>>>>>> +  template <typename NodeTy> static const NodeTy
> >>>>>>>>>> + *getNext(const
> >>>>>>>>> NodeTy *N) {
> >>>>>>>>>> +    return N->getNext();
> >>>>>>>>>> +  }
> >>>>>>>>>> +
> >>>>>>>>>> +  template <typename NodeTy> static void setPrev(NodeTy *N,
> >>>>>>>>>> + NodeTy
> >>>>>>>>> *Prev) {
> >>>>>>>>>> +    N->setPrev(Prev);
> >>>>>>>>>> +  }
> >>>>>>>>>> +  template <typename NodeTy> static void setNext(NodeTy *N,
> >>>>>>>>>> + NodeTy
> >>>>>>>>> *Next) {
> >>>>>>>>>> +    N->setNext(Next);
> >>>>>>>>>> +  }
> >>>>>>>>>> +  template <typename NodeTy> static void setPrev(NodeTy *N,
> >>>>>>>>> std::nullptr_t) {
> >>>>>>>>>> +    N->setPrev(nullptr);
> >>>>>>>>>> +  }
> >>>>>>>>>> +  template <typename NodeTy> static void setNext(NodeTy *N,
> >>>>>>>>> std::nullptr_t) {
> >>>>>>>>>> +    N->setNext(nullptr);
> >>>>>>>>>> +  }
> >>>>>>>>>> +};
> >>>>>>>>>> +
> >>>>>>>>>> +namespace ilist_detail {
> >>>>>>>>>>
> >>>>>>>>>> -  static void setPrev(NodeTy *N, NodeTy *Prev) {
> >>>>>>>>>> N->setPrev(Prev); }
> >>>>>>>>>> -  static void setNext(NodeTy *N, NodeTy *Next) {
> >>>>>>>>>> N->setNext(Next); }
> >>>>>>>>>> +template <class T> T &make();
> >>>>>>>>>> +
> >>>>>>>>>> +/// Type trait to check for a traits class that has a
> >>>>>>>>>> +getNext member (as a /// canary for any of the
> >>>>>>>>>> +ilist_nextprev_traits
> >>>> API).
> >>>>>>>>>> +template <class TraitsT, class NodeT> struct HasGetNext {
> >>>>>>>>>> +  typedef char Yes[1];
> >>>>>>>>>> +  typedef char No[2];
> >>>>>>>>>> +  template <size_t N> struct SFINAE {};
> >>>>>>>>>> +
> >>>>>>>>>> +  template <class U, class V>  static Yes &hasGetNext(
> >>>>>>>>>> +      SFINAE<sizeof(static_cast<NodeT
> >>>>>>>>> *>(make<U>().getNext(&make<NodeT>())))>
> >>>>>>>>>> +          * = 0);
> >>>>>>>>>> +  template <class U, class V> static No &hasGetNext(...);
> >>>>>>>>>> +
> >>>>>>>>>> +  static const bool value =
> >>>>>>>>>> +      sizeof(hasGetNext<TraitsT, NodeT>(nullptr)) ==
> >>>>>>>>>> + sizeof(Yes);
> >>>>>>>>>> };
> >>>>>>>>>>
> >>>>>>>>>> +} // end namespace ilist_detail
> >>>>>>>>>> +
> >>>>>>>>>> template<typename NodeTy>
> >>>>>>>>>> struct ilist_traits;
> >>>>>>>>>>
> >>>>>>>>>> @@ -93,15 +137,15 @@ struct ilist_sentinel_traits {  if
> >>>>>>>>>> (!Head) {
> >>>>>>>>>>    Head = ilist_traits<NodeTy>::createSentinel();
> >>>>>>>>>>    ilist_traits<NodeTy>::noteHead(Head, Head);
> >>>>>>>>>> -      ilist_traits<NodeTy>::setNext(Head, nullptr);
> >>>>>>>>>> +      ilist_node_access::setNext(Head, nullptr);
> >>>>>>>>>>    return Head;
> >>>>>>>>>>  }
> >>>>>>>>>> -    return ilist_traits<NodeTy>::getPrev(Head);
> >>>>>>>>>> +    return ilist_node_access::getPrev(Head);
> >>>>>>>>>> }
> >>>>>>>>>>
> >>>>>>>>>> /// noteHead - stash the sentinel into its default location
> >>>>>>>>>> static void noteHead(NodeTy *NewHead, NodeTy *Sentinel) {
> >>>>>>>>>> -    ilist_traits<NodeTy>::setPrev(NewHead, Sentinel);
> >>>>>>>>>> +    ilist_node_access::setPrev(NewHead, Sentinel);
> >>>>>>>>>> }
> >>>>>>>>>> };
> >>>>>>>>>>
> >>>>>>>>>> @@ -187,11 +231,9 @@ struct ilist_node_traits {  /// By
> >>>>>>>>>> inheriting from this, you can easily use default
> >>>>>>>>>> implementations /// for all common operations.
> >>>>>>>>>> ///
> >>>>>>>>>> -template<typename NodeTy>
> >>>>>>>>>> -struct ilist_default_traits : public
> >>>>>>> ilist_nextprev_traits<NodeTy>,
> >>>>>>>>>> -                              public
> >>>>>>> ilist_sentinel_traits<NodeTy>,
> >>>>>>>>>> -                              public
> ilist_node_traits<NodeTy>
> >>>> {
> >>>>>>>>>> -};
> >>>>>>>>>> +template <typename NodeTy>
> >>>>>>>>>> +struct ilist_default_traits : public
> >>>>>>> ilist_sentinel_traits<NodeTy>,
> >>>>>>>>>> +                              public
> >>>>>>>>>> + ilist_node_traits<NodeTy> {};
> >>>>>>>>>>
> >>>>>>>>>> // Template traits for intrusive list.  By specializing this
> >>>>>>>>> template
> >>>>>>>>>> class, you  // can change what next/prev fields are used to
> >>>> store
> >>>>>>>>>> the
> >>>>>>>>> links...
> >>>>>>>>>> @@ -218,7 +260,6 @@ template <typename NodeTy>  class
> >>>>>>> ilist_iterator
> >>>>>>>>>>  : public std::iterator<std::bidirectional_iterator_tag,
> >>>>>>>>>> NodeTy, ptrdiff_t> {
> >>>>>>>>>> public:
> >>>>>>>>>> -  typedef ilist_traits<NodeTy> Traits;  typedef
> >>>>>>>>>> std::iterator<std::bidirectional_iterator_tag, NodeTy,
> >>>>>>>>> ptrdiff_t>
> >>>>>>>>>>    super;
> >>>>>>>>>>
> >>>>>>>>>> @@ -279,12 +320,12 @@ public:
> >>>>>>>>>>
> >>>>>>>>>> // Increment and decrement operators...
> >>>>>>>>>> ilist_iterator &operator--() {
> >>>>>>>>>> -    NodePtr = Traits::getPrev(NodePtr);
> >>>>>>>>>> +    NodePtr = ilist_node_access::getPrev(NodePtr);
> >>>>>>>>>>  assert(NodePtr && "--'d off the beginning of an ilist!");
> >>>>>>>>>> return *this; } ilist_iterator &operator++() {
> >>>>>>>>>> -    NodePtr = Traits::getNext(NodePtr);
> >>>>>>>>>> +    NodePtr = ilist_node_access::getNext(NodePtr);
> >>>>>>>>>>  return *this;
> >>>>>>>>>> }
> >>>>>>>>>> ilist_iterator operator--(int) { @@ -348,8 +389,11 @@
> >>>>>>>>>> template<typename NodeTy> struct simplif
> >>>>>>>>>> ///    and the successor pointer for the sentinel (which
> always
> >>>>>>>>> stays at the
> >>>>>>>>>> ///    end of the list) is always null.
> >>>>>>>>>> ///
> >>>>>>>>>> -template<typename NodeTy, typename
> >>>>>>>>>> Traits=ilist_traits<NodeTy>
> >>>>>
> >>>>>>>>>> -class iplist : public Traits {
> >>>>>>>>>> +template <typename NodeTy, typename Traits =
> >>>>>>>>>> +ilist_traits<NodeTy>> class iplist : public Traits,
> >>>>>>>>>> +ilist_node_access {
> >>>>>>>>>> +  static_assert(!ilist_detail::HasGetNext<Traits,
> >>>> NodeTy>::value,
> >>>>>>>>>> +                "ilist next and prev links are not
> >>>>>>> customizable!");
> >>>>>>>>>> +
> >>>>>>>>>> mutable NodeTy *Head;
> >>>>>>>>>>
> >>>>>>>>>> // Use the prev node pointer of 'head' as the tail pointer.
> >>>>>>>>>> This is really a
> >>>>>>>>>>
> >>>>>>>>>> Modified: llvm/trunk/include/llvm/ADT/ilist_node.h
> >>>>>>>>>> URL:
> >>>>>>>>>> http://llvm.org/viewvc/llvm-
> >>>>>>>>> project/llvm/trunk/include/llvm/ADT/ilist_
> >>>>>>>>>> node.h?rev=278532&r1=278531&r2=278532&view=diff
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>
> >>>>
> ===================================================================
> >>>> =
> >>>>>>> =
> >>>>>>>>> =
> >>>>>>>>>> ========
> >>>>>>>>>> --- llvm/trunk/include/llvm/ADT/ilist_node.h (original)
> >>>>>>>>>> +++ llvm/trunk/include/llvm/ADT/ilist_node.h Fri Aug 12
> >>>>>>>>>> +++ 12:32:34
> >>>>>>>>>> +++ 2016
> >>>>>>>>>> @@ -36,17 +36,13 @@ protected:
> >>>>>>>>>> ilist_half_node() : Prev(nullptr) {}  };
> >>>>>>>>>>
> >>>>>>>>>> -template<typename NodeTy>
> >>>>>>>>>> -struct ilist_nextprev_traits;
> >>>>>>>>>> -
> >>>>>>>>>> +struct ilist_node_access;
> >>>>>>>>>> template <typename NodeTy> class ilist_iterator;
> >>>>>>>>>>
> >>>>>>>>>> -/// ilist_node - Base class that provides next/prev
> services
> >>>> for
> >>>>>>>>>> nodes -/// that use ilist_nextprev_traits or
> >>>> ilist_default_traits.
> >>>>>>>>>> -///
> >>>>>>>>>> +/// Base class that provides next/prev services for ilist
> >>>> nodes.
> >>>>>>>>>> template<typename NodeTy>
> >>>>>>>>>> class ilist_node : private ilist_half_node<NodeTy> {
> >>>>>>>>>> -  friend struct ilist_nextprev_traits<NodeTy>;
> >>>>>>>>>> +  friend struct ilist_node_access;
> >>>>>>>>>> friend struct ilist_traits<NodeTy>;  friend struct
> >>>>>>>>>> ilist_half_embedded_sentinel_traits<NodeTy>;
> >>>>>>>>>> friend struct ilist_embedded_sentinel_traits<NodeTy>;
> >>>>>>>>>>
> >>>>>>>>>> Modified: llvm/trunk/include/llvm/IR/SymbolTableListTraits.h
> >>>>>>>>>> URL:
> >>>>>>>>>> http://llvm.org/viewvc/llvm-
> >>>>>>>>> project/llvm/trunk/include/llvm/IR/SymbolT
> >>>>>>>>>> ableListTraits.h?rev=278532&r1=278531&r2=278532&view=diff
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>
> >>>>
> ===================================================================
> >>>> =
> >>>>>>> =
> >>>>>>>>> =
> >>>>>>>>>> ========
> >>>>>>>>>> --- llvm/trunk/include/llvm/IR/SymbolTableListTraits.h
> >>>> (original)
> >>>>>>>>>> +++ llvm/trunk/include/llvm/IR/SymbolTableListTraits.h Fri
> >>>>>>>>>> +++ Aug
> >>>> 12
> >>>>>>>>>> +++ 12:32:34 2016
> >>>>>>>>>> @@ -69,8 +69,7 @@ template <typename NodeTy> class SymbolT
> >>>>>>>>>> // template <typename ValueSubClass>  class
> SymbolTableListTraits
> >>>>>>>>>> -    : public ilist_nextprev_traits<ValueSubClass>,
> >>>>>>>>>> -      public SymbolTableListSentinelTraits<ValueSubClass>,
> >>>>>>>>>> +    : public SymbolTableListSentinelTraits<ValueSubClass>,
> >>>>>>>>>>    public ilist_node_traits<ValueSubClass> {  typedef
> >>>>>>>>>> SymbolTableList<ValueSubClass> ListTy;  typedef
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> _______________________________________________
> >>>>>>>>>> llvm-commits mailing list
> >>>>>>>>>> llvm-commits at lists.llvm.org
> >>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >>>>>>>>> _______________________________________________
> >>>>>>>>> llvm-commits mailing list
> >>>>>>>>> llvm-commits at lists.llvm.org
> >>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >>>>>>
> >>>>>
> >>
> >> _______________________________________________
> >> llvm-commits mailing list
> >> llvm-commits at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list