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

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 18:04:39 PDT 2016


> On 2016-Aug-12, at 17:57, Yung, Douglas <douglas.yung at sony.com> wrote:
> 
> 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.
> 

Okay, great.  I bet that's one of the ones Hans already tracked down since it's X86, but I'll have a look at it on the bus.

Please attach any other unique backtraces!

> 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