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

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 18:21:10 PDT 2016


I just committed it in r278587.

On Fri, Aug 12, 2016 at 6:05 PM, Yung, Douglas <douglas.yung at sony.com> wrote:
> 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