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

Yung, Douglas via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 18:05:27 PDT 2016


Hans, can you share your patch for the X86 tests so that I can try it out?

Douglas Yung

> -----Original Message-----
> From: dexonsmith at apple.com [mailto:dexonsmith at apple.com]
> Sent: Friday, August 12, 2016 18:04
> To: Duncan Exon Smith
> Cc: Hans Wennborg; llvm-commits at lists.llvm.org; Yung, Douglas
> Subject: Re: [llvm] r278532 - ADT: Remove the ilist_nextprev_traits
> customization point
> 
> +Douglas.
> 
> > On 2016-Aug-12, at 17:59, Duncan P. N. Exon Smith via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> >
> > Thanks Hans.
> >
> > It sounds like there's a long tail here.  I'm heading out momentarily
> for the day and feel quite uncomfortable leaving these bots red.
> >
> > If you need to call it quits, please either revert my patches or ask
> me to (I'll check for that mail in about an hour).
> >
> >> On 2016-Aug-12, at 17:53, Hans Wennborg <hans at chromium.org> wrote:
> >>
> >> 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
> >
> > _______________________________________________
> > 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