[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:17:42 PDT 2016


Hi Duncan,

The remaining 5 failures all have the same stack trace as I sent before, so if Hans' fix fixes that, then it should be good as far as the PS4 bot is concerned. (I don't think it run the AMDGPU tests since I'm not seeing those failures reported).

Douglas Yung

> -----Original Message-----
> From: dexonsmith at apple.com [mailto:dexonsmith at apple.com]
> Sent: Friday, August 12, 2016 18: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
> 
> 
> > 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::MachineBasicBl
> ock & MBB, llvm::MachineInstrBundleIterator<llvm::MachineInstr> & MBBI,
> __int64 NumBytes, bool InEpilogue) Line 291	C++
> >
> 	llc.exe!llvm::X86FrameLowering::emitEpilogue(llvm::MachineFunctio
> n & 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