From owner-svn-src-projects@freebsd.org Wed Aug 17 19:41:33 2016 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id F03C5BBDCFA for ; Wed, 17 Aug 2016 19:41:33 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A928215DD; Wed, 17 Aug 2016 19:41:33 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u7HJfWUO083772; Wed, 17 Aug 2016 19:41:32 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u7HJfTVF083741; Wed, 17 Aug 2016 19:41:29 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201608171941.u7HJfTVF083741@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Wed, 17 Aug 2016 19:41:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r304310 - in projects/clang390-import/contrib/llvm: . include/llvm-c include/llvm/ADT include/llvm/Analysis include/llvm/CodeGen include/llvm/IR include/llvm/Target lib/Analysis lib/Cod... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Aug 2016 19:41:34 -0000 Author: dim Date: Wed Aug 17 19:41:29 2016 New Revision: 304310 URL: https://svnweb.freebsd.org/changeset/base/304310 Log: Update llvm to release_39 branch r278877. Added: projects/clang390-import/contrib/llvm/lib/IR/AttributeSetNode.h - copied unchanged from r304309, vendor/llvm/dist/lib/IR/AttributeSetNode.h Modified: projects/clang390-import/contrib/llvm/LICENSE.TXT projects/clang390-import/contrib/llvm/include/llvm-c/Core.h projects/clang390-import/contrib/llvm/include/llvm/ADT/GraphTraits.h projects/clang390-import/contrib/llvm/include/llvm/ADT/SCCIterator.h projects/clang390-import/contrib/llvm/include/llvm/ADT/STLExtras.h projects/clang390-import/contrib/llvm/include/llvm/ADT/Triple.h projects/clang390-import/contrib/llvm/include/llvm/ADT/iterator.h projects/clang390-import/contrib/llvm/include/llvm/Analysis/CallGraph.h projects/clang390-import/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h projects/clang390-import/contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h projects/clang390-import/contrib/llvm/include/llvm/IR/Attributes.h projects/clang390-import/contrib/llvm/include/llvm/IR/CFG.h projects/clang390-import/contrib/llvm/include/llvm/IR/IntrinsicsX86.td projects/clang390-import/contrib/llvm/include/llvm/Target/TargetLowering.h projects/clang390-import/contrib/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp projects/clang390-import/contrib/llvm/lib/Analysis/ConstantFolding.cpp projects/clang390-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp projects/clang390-import/contrib/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp projects/clang390-import/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/BranchFolding.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStack.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStackColoring.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStackLayout.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp projects/clang390-import/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp projects/clang390-import/contrib/llvm/lib/IR/AttributeImpl.h projects/clang390-import/contrib/llvm/lib/IR/AutoUpgrade.cpp projects/clang390-import/contrib/llvm/lib/IR/Core.cpp projects/clang390-import/contrib/llvm/lib/IR/Metadata.cpp projects/clang390-import/contrib/llvm/lib/Support/Triple.cpp projects/clang390-import/contrib/llvm/lib/Target/AArch64/AArch64.td projects/clang390-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/AMDGPU.h projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUIntrinsicInfo.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUIntrinsicInfo.h projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/R600ISelLowering.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/R600ISelLowering.h projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIDefines.h projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIISelLowering.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIISelLowering.h projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIInstrFormats.td projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIInstrInfo.h projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIInstrInfo.td projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIInstructions.td projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIIntrinsics.td projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIRegisterInfo.h projects/clang390-import/contrib/llvm/lib/Target/AMDGPU/SIWholeQuadMode.cpp projects/clang390-import/contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp projects/clang390-import/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td projects/clang390-import/contrib/llvm/lib/Target/ARM/ARMInstrThumb2.td projects/clang390-import/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp projects/clang390-import/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.cpp projects/clang390-import/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp projects/clang390-import/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp projects/clang390-import/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp projects/clang390-import/contrib/llvm/lib/Target/X86/X86InstrInfo.h projects/clang390-import/contrib/llvm/lib/Target/X86/X86InstrSSE.td projects/clang390-import/contrib/llvm/lib/Transforms/IPO/FunctionAttrs.cpp projects/clang390-import/contrib/llvm/lib/Transforms/IPO/GlobalOpt.cpp projects/clang390-import/contrib/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp projects/clang390-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp projects/clang390-import/contrib/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Scalar/ConstantProp.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Scalar/EarlyCSE.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Scalar/JumpThreading.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Scalar/LICM.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Utils/CloneFunction.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Utils/InlineFunction.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Utils/LCSSA.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Utils/LoopSimplify.cpp projects/clang390-import/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp Directory Properties: projects/clang390-import/contrib/llvm/ (props changed) Modified: projects/clang390-import/contrib/llvm/LICENSE.TXT ============================================================================== --- projects/clang390-import/contrib/llvm/LICENSE.TXT Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/LICENSE.TXT Wed Aug 17 19:41:29 2016 (r304310) @@ -61,8 +61,6 @@ licenses, and/or restrictions: Program Directory ------- --------- -Autoconf llvm/autoconf - llvm/projects/ModuleMaker/autoconf Google Test llvm/utils/unittest/googletest OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} pyyaml tests llvm/test/YAMLParser/{*.data, LICENSE.TXT} Modified: projects/clang390-import/contrib/llvm/include/llvm-c/Core.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm-c/Core.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm-c/Core.h Wed Aug 17 19:41:29 2016 (r304310) @@ -2014,6 +2014,9 @@ void LLVMAddFunctionAttr(LLVMValueRef Fn void LLVMAddAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, LLVMAttributeRef A); +unsigned LLVMGetAttributeCountAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx); +void LLVMGetAttributesAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, + LLVMAttributeRef *Attrs); LLVMAttributeRef LLVMGetEnumAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, unsigned KindID); @@ -2600,6 +2603,9 @@ void LLVMSetInstrParamAlignment(LLVMValu void LLVMAddCallSiteAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, LLVMAttributeRef A); +unsigned LLVMGetCallSiteAttributeCount(LLVMValueRef C, LLVMAttributeIndex Idx); +void LLVMGetCallSiteAttributes(LLVMValueRef C, LLVMAttributeIndex Idx, + LLVMAttributeRef *Attrs); LLVMAttributeRef LLVMGetCallSiteEnumAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, unsigned KindID); Modified: projects/clang390-import/contrib/llvm/include/llvm/ADT/GraphTraits.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/ADT/GraphTraits.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/ADT/GraphTraits.h Wed Aug 17 19:41:29 2016 (r304310) @@ -27,19 +27,24 @@ template struct GraphTraits { // Elements to provide: + // NOTICE: We are in a transition from migration interfaces that require + // NodeType *, to NodeRef. NodeRef is required to be cheap to copy, but does + // not have to be a raw pointer. In the transition, user should define + // NodeType, and NodeRef = NodeType *. + // // typedef NodeType - Type of Node in the graph + // typedef NodeRef - NodeType * // typedef ChildIteratorType - Type used to iterate over children in graph - // static NodeType *getEntryNode(const GraphType &) + // static NodeRef getEntryNode(const GraphType &) // Return the entry node of the graph - // static ChildIteratorType child_begin(NodeType *) - // static ChildIteratorType child_end (NodeType *) + // static ChildIteratorType child_begin(NodeRef) + // static ChildIteratorType child_end (NodeRef) // Return iterators that point to the beginning and ending of the child // node list for the specified node. // - // typedef ...iterator nodes_iterator; // static nodes_iterator nodes_begin(GraphType *G) // static nodes_iterator nodes_end (GraphType *G) @@ -57,7 +62,7 @@ struct GraphTraits { // your argument to XXX_begin(...) is unknown or needs to have the proper .h // file #include'd. // - typedef typename GraphType::UnknownGraphTypeError NodeType; + typedef typename GraphType::UnknownGraphTypeError NodeRef; }; Modified: projects/clang390-import/contrib/llvm/include/llvm/ADT/SCCIterator.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/ADT/SCCIterator.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/ADT/SCCIterator.h Wed Aug 17 19:41:29 2016 (r304310) @@ -37,23 +37,22 @@ namespace llvm { /// build up a vector of nodes in a particular SCC. Note that it is a forward /// iterator and thus you cannot backtrack or re-visit nodes. template > -class scc_iterator - : public iterator_facade_base< - scc_iterator, std::forward_iterator_tag, - const std::vector, ptrdiff_t> { - typedef typename GT::NodeType NodeType; +class scc_iterator : public iterator_facade_base< + scc_iterator, std::forward_iterator_tag, + const std::vector, ptrdiff_t> { + typedef typename GT::NodeRef NodeRef; typedef typename GT::ChildIteratorType ChildItTy; - typedef std::vector SccTy; + typedef std::vector SccTy; typedef typename scc_iterator::reference reference; /// Element of VisitStack during DFS. struct StackElement { - NodeType *Node; ///< The current node pointer. + NodeRef Node; ///< The current node pointer. ChildItTy NextChild; ///< The next child, modified inplace during DFS. unsigned MinVisited; ///< Minimum uplink value of all children of Node. - StackElement(NodeType *Node, const ChildItTy &Child, unsigned Min) - : Node(Node), NextChild(Child), MinVisited(Min) {} + StackElement(NodeRef Node, const ChildItTy &Child, unsigned Min) + : Node(Node), NextChild(Child), MinVisited(Min) {} bool operator==(const StackElement &Other) const { return Node == Other.Node && @@ -67,10 +66,10 @@ class scc_iterator /// /// nodeVisitNumbers are per-node visit numbers, also used as DFS flags. unsigned visitNum; - DenseMap nodeVisitNumbers; + DenseMap nodeVisitNumbers; /// Stack holding nodes of the SCC. - std::vector SCCNodeStack; + std::vector SCCNodeStack; /// The current SCC, retrieved using operator*(). SccTy CurrentSCC; @@ -80,7 +79,7 @@ class scc_iterator std::vector VisitStack; /// A single "visit" within the non-recursive DFS traversal. - void DFSVisitOne(NodeType *N); + void DFSVisitOne(NodeRef N); /// The stack-based DFS traversal; defined below. void DFSVisitChildren(); @@ -88,7 +87,7 @@ class scc_iterator /// Compute the next SCC using the DFS traversal. void GetNextSCC(); - scc_iterator(NodeType *entryN) : visitNum(0) { + scc_iterator(NodeRef entryN) : visitNum(0) { DFSVisitOne(entryN); GetNextSCC(); } @@ -131,7 +130,7 @@ public: /// This informs the \c scc_iterator that the specified \c Old node /// has been deleted, and \c New is to be used in its place. - void ReplaceNode(NodeType *Old, NodeType *New) { + void ReplaceNode(NodeRef Old, NodeRef New) { assert(nodeVisitNumbers.count(Old) && "Old not in scc_iterator?"); nodeVisitNumbers[New] = nodeVisitNumbers[Old]; nodeVisitNumbers.erase(Old); @@ -139,7 +138,7 @@ public: }; template -void scc_iterator::DFSVisitOne(NodeType *N) { +void scc_iterator::DFSVisitOne(NodeRef N) { ++visitNum; nodeVisitNumbers[N] = visitNum; SCCNodeStack.push_back(N); @@ -155,8 +154,8 @@ void scc_iterator::DFSVisitC assert(!VisitStack.empty()); while (VisitStack.back().NextChild != GT::child_end(VisitStack.back().Node)) { // TOS has at least one more child so continue DFS - NodeType *childN = *VisitStack.back().NextChild++; - typename DenseMap::iterator Visited = + NodeRef childN = *VisitStack.back().NextChild++; + typename DenseMap::iterator Visited = nodeVisitNumbers.find(childN); if (Visited == nodeVisitNumbers.end()) { // this node has never been seen. @@ -176,7 +175,7 @@ template void s DFSVisitChildren(); // Pop the leaf on top of the VisitStack. - NodeType *visitingN = VisitStack.back().Node; + NodeRef visitingN = VisitStack.back().Node; unsigned minVisitNum = VisitStack.back().MinVisited; assert(VisitStack.back().NextChild == GT::child_end(visitingN)); VisitStack.pop_back(); @@ -212,7 +211,7 @@ bool scc_iterator::hasLoop() assert(!CurrentSCC.empty() && "Dereferencing END SCC iterator!"); if (CurrentSCC.size() > 1) return true; - NodeType *N = CurrentSCC.front(); + NodeRef N = CurrentSCC.front(); for (ChildItTy CI = GT::child_begin(N), CE = GT::child_end(N); CI != CE; ++CI) if (*CI == N) Modified: projects/clang390-import/contrib/llvm/include/llvm/ADT/STLExtras.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/ADT/STLExtras.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/ADT/STLExtras.h Wed Aug 17 19:41:29 2016 (r304310) @@ -26,10 +26,18 @@ #include #include // for std::pair +#include "llvm/ADT/Optional.h" +#include "llvm/ADT/iterator.h" #include "llvm/ADT/iterator_range.h" #include "llvm/Support/Compiler.h" namespace llvm { +namespace detail { + +template +using IterOfRange = decltype(std::begin(std::declval())); + +} // End detail namespace //===----------------------------------------------------------------------===// // Extra additions to @@ -235,6 +243,90 @@ auto reverse( llvm::make_reverse_iterator(std::begin(C))); } +/// An iterator adaptor that filters the elements of given inner iterators. +/// +/// The predicate parameter should be a callable object that accepts the wrapped +/// iterator's reference type and returns a bool. When incrementing or +/// decrementing the iterator, it will call the predicate on each element and +/// skip any where it returns false. +/// +/// \code +/// int A[] = { 1, 2, 3, 4 }; +/// auto R = make_filter_range(A, [](int N) { return N % 2 == 1; }); +/// // R contains { 1, 3 }. +/// \endcode +template +class filter_iterator + : public iterator_adaptor_base< + filter_iterator, WrappedIteratorT, + typename std::common_type< + std::forward_iterator_tag, + typename std::iterator_traits< + WrappedIteratorT>::iterator_category>::type> { + using BaseT = iterator_adaptor_base< + filter_iterator, WrappedIteratorT, + typename std::common_type< + std::forward_iterator_tag, + typename std::iterator_traits::iterator_category>:: + type>; + + struct PayloadType { + WrappedIteratorT End; + PredicateT Pred; + }; + + Optional Payload; + + void findNextValid() { + assert(Payload && "Payload should be engaged when findNextValid is called"); + while (this->I != Payload->End && !Payload->Pred(*this->I)) + BaseT::operator++(); + } + + // Construct the begin iterator. The begin iterator requires to know where end + // is, so that it can properly stop when it hits end. + filter_iterator(WrappedIteratorT Begin, WrappedIteratorT End, PredicateT Pred) + : BaseT(std::move(Begin)), + Payload(PayloadType{std::move(End), std::move(Pred)}) { + findNextValid(); + } + + // Construct the end iterator. It's not incrementable, so Payload doesn't + // have to be engaged. + filter_iterator(WrappedIteratorT End) : BaseT(End) {} + +public: + using BaseT::operator++; + + filter_iterator &operator++() { + BaseT::operator++(); + findNextValid(); + return *this; + } + + template + friend iterator_range, PT>> + make_filter_range(RT &&, PT); +}; + +/// Convenience function that takes a range of elements and a predicate, +/// and return a new filter_iterator range. +/// +/// FIXME: Currently if RangeT && is a rvalue reference to a temporary, the +/// lifetime of that temporary is not kept by the returned range object, and the +/// temporary is going to be dropped on the floor after the make_iterator_range +/// full expression that contains this function call. +template +iterator_range, PredicateT>> +make_filter_range(RangeT &&Range, PredicateT Pred) { + using FilterIteratorT = + filter_iterator, PredicateT>; + return make_range(FilterIteratorT(std::begin(std::forward(Range)), + std::end(std::forward(Range)), + std::move(Pred)), + FilterIteratorT(std::end(std::forward(Range)))); +} + //===----------------------------------------------------------------------===// // Extra additions to //===----------------------------------------------------------------------===// Modified: projects/clang390-import/contrib/llvm/include/llvm/ADT/Triple.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/ADT/Triple.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/ADT/Triple.h Wed Aug 17 19:41:29 2016 (r304310) @@ -174,6 +174,7 @@ public: UnknownEnvironment, GNU, + GNUABI64, GNUEABI, GNUEABIHF, GNUX32, @@ -476,8 +477,9 @@ public: bool isGNUEnvironment() const { EnvironmentType Env = getEnvironment(); - return Env == Triple::GNU || Env == Triple::GNUEABI || - Env == Triple::GNUEABIHF || Env == Triple::GNUX32; + return Env == Triple::GNU || Env == Triple::GNUABI64 || + Env == Triple::GNUEABI || Env == Triple::GNUEABIHF || + Env == Triple::GNUX32; } /// Checks if the environment could be MSVC. Modified: projects/clang390-import/contrib/llvm/include/llvm/ADT/iterator.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/ADT/iterator.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/ADT/iterator.h Wed Aug 17 19:41:29 2016 (r304310) @@ -155,7 +155,14 @@ template < typename T = typename std::iterator_traits::value_type, typename DifferenceTypeT = typename std::iterator_traits::difference_type, - typename PointerT = T *, typename ReferenceT = T &, + typename PointerT = typename std::conditional< + std::is_same::value_type>::value, + typename std::iterator_traits::pointer, T *>::type, + typename ReferenceT = typename std::conditional< + std::is_same::value_type>::value, + typename std::iterator_traits::reference, T &>::type, // Don't provide these, they are mostly to act as aliases below. typename WrappedTraitsT = std::iterator_traits> class iterator_adaptor_base @@ -168,15 +175,7 @@ protected: iterator_adaptor_base() = default; - template - explicit iterator_adaptor_base( - U &&u, - typename std::enable_if< - !std::is_base_of::type>::type, - DerivedT>::value, - int>::type = 0) - : I(std::forward(u)) {} + explicit iterator_adaptor_base(WrappedIteratorT u) : I(std::move(u)) {} const WrappedIteratorT &wrapped() const { return I; } Modified: projects/clang390-import/contrib/llvm/include/llvm/Analysis/CallGraph.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/Analysis/CallGraph.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/Analysis/CallGraph.h Wed Aug 17 19:41:29 2016 (r304310) @@ -410,6 +410,7 @@ public: // traversals. template <> struct GraphTraits { typedef CallGraphNode NodeType; + typedef CallGraphNode *NodeRef; typedef CallGraphNode::CallRecord CGNPairTy; typedef std::pointer_to_unary_function @@ -431,6 +432,7 @@ template <> struct GraphTraits struct GraphTraits { typedef const CallGraphNode NodeType; + typedef const CallGraphNode *NodeRef; typedef CallGraphNode::CallRecord CGNPairTy; typedef std::pointer_to_unary_function Modified: projects/clang390-import/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h Wed Aug 17 19:41:29 2016 (r304310) @@ -196,6 +196,13 @@ namespace llvm { /// block. Value *expandCodeFor(const SCEV *SH, Type *Ty, Instruction *I); + /// \brief Insert code to directly compute the specified SCEV expression + /// into the program. The inserted code is inserted into the SCEVExpander's + /// current insertion point. If a type is specified, the result will be + /// expanded to have that type, with a cast if necessary. + Value *expandCodeFor(const SCEV *SH, Type *Ty = nullptr); + + /// \brief Generates a code sequence that evaluates this predicate. /// The inserted instructions will be at position \p Loc. /// The result will be of type i1 and will have a value of 0 when the @@ -253,6 +260,15 @@ namespace llvm { void enableLSRMode() { LSRMode = true; } + /// \brief Set the current insertion point. This is useful if multiple calls + /// to expandCodeFor() are going to be made with the same insert point and + /// the insert point may be moved during one of the expansions (e.g. if the + /// insert point is not a block terminator). + void setInsertPoint(Instruction *IP) { + assert(IP); + Builder.SetInsertPoint(IP); + } + /// \brief Clear the current insertion point. This is useful if the /// instruction that had been serving as the insertion point may have been /// deleted. @@ -313,12 +329,6 @@ namespace llvm { Value *expand(const SCEV *S); - /// \brief Insert code to directly compute the specified SCEV expression - /// into the program. The inserted code is inserted into the SCEVExpander's - /// current insertion point. If a type is specified, the result will be - /// expanded to have that type, with a cast if necessary. - Value *expandCodeFor(const SCEV *SH, Type *Ty = nullptr); - /// \brief Determine the most "relevant" loop for the given SCEV. const Loop *getRelevantLoop(const SCEV *); Modified: projects/clang390-import/contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/CodeGen/MachineBasicBlock.h Wed Aug 17 19:41:29 2016 (r304310) @@ -740,6 +740,7 @@ struct MBB2NumberFunctor : template <> struct GraphTraits { typedef MachineBasicBlock NodeType; + typedef MachineBasicBlock *NodeRef; typedef MachineBasicBlock::succ_iterator ChildIteratorType; static NodeType *getEntryNode(MachineBasicBlock *BB) { return BB; } @@ -753,6 +754,7 @@ template <> struct GraphTraits struct GraphTraits { typedef const MachineBasicBlock NodeType; + typedef const MachineBasicBlock *NodeRef; typedef MachineBasicBlock::const_succ_iterator ChildIteratorType; static NodeType *getEntryNode(const MachineBasicBlock *BB) { return BB; } @@ -772,6 +774,7 @@ template <> struct GraphTraits struct GraphTraits > { typedef MachineBasicBlock NodeType; + typedef MachineBasicBlock *NodeRef; typedef MachineBasicBlock::pred_iterator ChildIteratorType; static NodeType *getEntryNode(Inverse G) { return G.Graph; @@ -786,6 +789,7 @@ template <> struct GraphTraits struct GraphTraits > { typedef const MachineBasicBlock NodeType; + typedef const MachineBasicBlock *NodeRef; typedef MachineBasicBlock::const_pred_iterator ChildIteratorType; static NodeType *getEntryNode(Inverse G) { return G.Graph; Modified: projects/clang390-import/contrib/llvm/include/llvm/IR/Attributes.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/IR/Attributes.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/IR/Attributes.h Wed Aug 17 19:41:29 2016 (r304310) @@ -210,6 +210,7 @@ public: private: friend class AttrBuilder; friend class AttributeSetImpl; + friend class AttributeSetNode; template friend struct DenseMapInfo; /// \brief The attributes that we are managing. This can be null to represent Modified: projects/clang390-import/contrib/llvm/include/llvm/IR/CFG.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/IR/CFG.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/IR/CFG.h Wed Aug 17 19:41:29 2016 (r304310) @@ -155,6 +155,7 @@ struct isPodLike struct GraphTraits { typedef BasicBlock NodeType; + typedef BasicBlock *NodeRef; typedef succ_iterator ChildIteratorType; static NodeType *getEntryNode(BasicBlock *BB) { return BB; } @@ -168,6 +169,7 @@ template <> struct GraphTraits struct GraphTraits { typedef const BasicBlock NodeType; + typedef const BasicBlock *NodeRef; typedef succ_const_iterator ChildIteratorType; static NodeType *getEntryNode(const BasicBlock *BB) { return BB; } @@ -187,6 +189,7 @@ template <> struct GraphTraits struct GraphTraits > { typedef BasicBlock NodeType; + typedef BasicBlock *NodeRef; typedef pred_iterator ChildIteratorType; static NodeType *getEntryNode(Inverse G) { return G.Graph; } static inline ChildIteratorType child_begin(NodeType *N) { @@ -199,6 +202,7 @@ template <> struct GraphTraits struct GraphTraits > { typedef const BasicBlock NodeType; + typedef const BasicBlock *NodeRef; typedef const_pred_iterator ChildIteratorType; static NodeType *getEntryNode(Inverse G) { return G.Graph; Modified: projects/clang390-import/contrib/llvm/include/llvm/IR/IntrinsicsX86.td ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/IR/IntrinsicsX86.td Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/IR/IntrinsicsX86.td Wed Aug 17 19:41:29 2016 (r304310) @@ -479,6 +479,8 @@ let TargetPrefix = "x86" in { // All in Intrinsic<[llvm_v4f32_ty], [llvm_v2f64_ty], [IntrNoMem]>; def int_x86_sse2_cvtps2dq : GCCBuiltin<"__builtin_ia32_cvtps2dq">, Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty], [IntrNoMem]>; + def int_x86_sse2_cvttps2dq : GCCBuiltin<"__builtin_ia32_cvttps2dq">, + Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty], [IntrNoMem]>; def int_x86_sse2_cvtsd2si : GCCBuiltin<"__builtin_ia32_cvtsd2si">, Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>; def int_x86_sse2_cvtsd2si64 : GCCBuiltin<"__builtin_ia32_cvtsd2si64">, @@ -1512,8 +1514,12 @@ let TargetPrefix = "x86" in { // All in Intrinsic<[llvm_v4f32_ty], [llvm_v4f64_ty], [IntrNoMem]>; def int_x86_avx_cvt_ps2dq_256 : GCCBuiltin<"__builtin_ia32_cvtps2dq256">, Intrinsic<[llvm_v8i32_ty], [llvm_v8f32_ty], [IntrNoMem]>; + def int_x86_avx_cvtt_pd2dq_256 : GCCBuiltin<"__builtin_ia32_cvttpd2dq256">, + Intrinsic<[llvm_v4i32_ty], [llvm_v4f64_ty], [IntrNoMem]>; def int_x86_avx_cvt_pd2dq_256 : GCCBuiltin<"__builtin_ia32_cvtpd2dq256">, Intrinsic<[llvm_v4i32_ty], [llvm_v4f64_ty], [IntrNoMem]>; + def int_x86_avx_cvtt_ps2dq_256 : GCCBuiltin<"__builtin_ia32_cvttps2dq256">, + Intrinsic<[llvm_v8i32_ty], [llvm_v8f32_ty], [IntrNoMem]>; } // Vector bit test Modified: projects/clang390-import/contrib/llvm/include/llvm/Target/TargetLowering.h ============================================================================== --- projects/clang390-import/contrib/llvm/include/llvm/Target/TargetLowering.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/include/llvm/Target/TargetLowering.h Wed Aug 17 19:41:29 2016 (r304310) @@ -2349,6 +2349,10 @@ public: /// from getBooleanContents(). bool isConstFalseVal(const SDNode *N) const; + /// Return a constant of type VT that contains a true value that respects + /// getBooleanContents() + SDValue getConstTrueVal(SelectionDAG &DAG, EVT VT, const SDLoc &DL) const; + /// Return if \p N is a True value when extended to \p VT. bool isExtendedTrueVal(const ConstantSDNode *N, EVT VT, bool Signed) const; Modified: projects/clang390-import/contrib/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -623,6 +623,7 @@ template <> struct GraphTraitsgetIntegerBitWidth(); assert(ResultWidth <= 64 && @@ -1438,7 +1438,8 @@ Constant *ConstantFoldConvertToInt(const APFloat::opStatus status = Val.convertToInteger(&UIntVal, ResultWidth, /*isSigned=*/true, mode, &isExact); - if (status != APFloat::opOK && status != APFloat::opInexact) + if (status != APFloat::opOK && + (!roundTowardZero || status != APFloat::opInexact)) return nullptr; return ConstantInt::get(Ty, UIntVal, /*isSigned=*/true); } @@ -1676,17 +1677,17 @@ Constant *ConstantFoldScalarCall(StringR case Intrinsic::x86_sse2_cvtsd2si: case Intrinsic::x86_sse2_cvtsd2si64: if (ConstantFP *FPOp = - dyn_cast_or_null(Op->getAggregateElement(0U))) - return ConstantFoldConvertToInt(FPOp->getValueAPF(), - /*roundTowardZero=*/false, Ty); + dyn_cast_or_null(Op->getAggregateElement(0U))) + return ConstantFoldSSEConvertToInt(FPOp->getValueAPF(), + /*roundTowardZero=*/false, Ty); case Intrinsic::x86_sse_cvttss2si: case Intrinsic::x86_sse_cvttss2si64: case Intrinsic::x86_sse2_cvttsd2si: case Intrinsic::x86_sse2_cvttsd2si64: if (ConstantFP *FPOp = - dyn_cast_or_null(Op->getAggregateElement(0U))) - return ConstantFoldConvertToInt(FPOp->getValueAPF(), - /*roundTowardZero=*/true, Ty); + dyn_cast_or_null(Op->getAggregateElement(0U))) + return ConstantFoldSSEConvertToInt(FPOp->getValueAPF(), + /*roundTowardZero=*/true, Ty); } } Modified: projects/clang390-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -3400,7 +3400,10 @@ static Value *SimplifySelectInst(Value * return TrueVal; if (const auto *ICI = dyn_cast(CondVal)) { - unsigned BitWidth = Q.DL.getTypeSizeInBits(TrueVal->getType()); + // FIXME: This code is nearly duplicated in InstCombine. Using/refactoring + // decomposeBitTestICmp() might help. + unsigned BitWidth = + Q.DL.getTypeSizeInBits(TrueVal->getType()->getScalarType()); ICmpInst::Predicate Pred = ICI->getPredicate(); Value *CmpLHS = ICI->getOperand(0); Value *CmpRHS = ICI->getOperand(1); @@ -4274,7 +4277,8 @@ static bool replaceAndRecursivelySimplif // Gracefully handle edge cases where the instruction is not wired into any // parent block. - if (I->getParent()) + if (I->getParent() && !I->isEHPad() && !isa(I) && + !I->mayHaveSideEffects()) I->eraseFromParent(); } else { Worklist.insert(I); @@ -4302,7 +4306,8 @@ static bool replaceAndRecursivelySimplif // Gracefully handle edge cases where the instruction is not wired into any // parent block. - if (I->getParent()) + if (I->getParent() && !I->isEHPad() && !isa(I) && + !I->mayHaveSideEffects()) I->eraseFromParent(); } return Simplified; Modified: projects/clang390-import/contrib/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -115,13 +115,19 @@ bool UnrolledInstAnalyzer::visitLoad(Loa // We might have a vector load from an array. FIXME: for now we just bail // out in this case, but we should be able to resolve and simplify such // loads. - if(CDS->getElementType() != I.getType()) + if (CDS->getElementType() != I.getType()) return false; - int ElemSize = CDS->getElementType()->getPrimitiveSizeInBits() / 8U; - if (SimplifiedAddrOp->getValue().getActiveBits() >= 64) + unsigned ElemSize = CDS->getElementType()->getPrimitiveSizeInBits() / 8U; + if (SimplifiedAddrOp->getValue().getActiveBits() > 64) return false; - int64_t Index = SimplifiedAddrOp->getSExtValue() / ElemSize; + int64_t SimplifiedAddrOpV = SimplifiedAddrOp->getSExtValue(); + if (SimplifiedAddrOpV < 0) { + // FIXME: For now we conservatively ignore out of bound accesses, but + // we're allowed to perform the optimization in this case. + return false; + } + uint64_t Index = static_cast(SimplifiedAddrOpV) / ElemSize; if (Index >= CDS->getNumElements()) { // FIXME: For now we conservatively ignore out of bound accesses, but // we're allowed to perform the optimization in this case. Modified: projects/clang390-import/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -1610,8 +1610,7 @@ Value *SCEVExpander::visitUMaxExpr(const Value *SCEVExpander::expandCodeFor(const SCEV *SH, Type *Ty, Instruction *IP) { - assert(IP); - Builder.SetInsertPoint(IP); + setInsertPoint(IP); return expandCodeFor(SH, Ty); } Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -214,10 +214,7 @@ TypeIndex CodeViewDebug::getScopeIndex(c } TypeIndex CodeViewDebug::getFuncIdForSubprogram(const DISubprogram *SP) { - // It's possible to ask for the FuncId of a function which doesn't have a - // subprogram: inlining a function with debug info into a function with none. - if (!SP) - return TypeIndex::None(); + assert(SP); // Check if we've already translated this subprogram. auto I = TypeIndices.find({SP, nullptr}); @@ -621,11 +618,12 @@ void CodeViewDebug::emitDebugInfoForFunc std::string FuncName; auto *SP = GV->getSubprogram(); + assert(SP); setCurrentSubprogram(SP); // If we have a display name, build the fully qualified name by walking the // chain of scopes. - if (SP != nullptr && !SP->getDisplayName().empty()) + if (!SP->getDisplayName().empty()) FuncName = getFullyQualifiedName(SP->getScope().resolve(), SP->getDisplayName()); @@ -864,7 +862,7 @@ void CodeViewDebug::collectVariableInfo( void CodeViewDebug::beginFunction(const MachineFunction *MF) { assert(!CurFn && "Can't process two functions at once!"); - if (!Asm || !MMI->hasDebugInfo()) + if (!Asm || !MMI->hasDebugInfo() || !MF->getFunction()->getSubprogram()) return; DebugHandlerBase::beginFunction(MF); @@ -1939,7 +1937,8 @@ void CodeViewDebug::beginInstruction(con DebugHandlerBase::beginInstruction(MI); // Ignore DBG_VALUE locations and function prologue. - if (!Asm || MI->isDebugValue() || MI->getFlag(MachineInstr::FrameSetup)) + if (!Asm || !CurFn || MI->isDebugValue() || + MI->getFlag(MachineInstr::FrameSetup)) return; DebugLoc DL = MI->getDebugLoc(); if (DL == PrevInstLoc || !DL) Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/BranchFolding.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/BranchFolding.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/BranchFolding.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -996,6 +996,24 @@ bool BranchFolder::TailMergeBlocks(Machi MachineBasicBlock *IBB = &*I; MachineBasicBlock *PredBB = &*std::prev(I); MergePotentials.clear(); + MachineLoop *ML; + + // Bail if merging after placement and IBB is the loop header because + // -- If merging predecessors that belong to the same loop as IBB, the + // common tail of merged predecessors may become the loop top if block + // placement is called again and the predecessors may branch to this common + // tail and require more branches. This can be relaxed if + // MachineBlockPlacement::findBestLoopTop is more flexible. + // --If merging predecessors that do not belong to the same loop as IBB, the + // loop info of IBB's loop and the other loops may be affected. Calling the + // block placement again may make big change to the layout and eliminate the + // reason to do tail merging here. + if (AfterBlockPlacement && MLI) { + ML = MLI->getLoopFor(IBB); + if (ML && IBB == ML->getHeader()) + continue; + } + for (MachineBasicBlock *PBB : I->predecessors()) { if (MergePotentials.size() == TailMergeThreshold) break; @@ -1015,16 +1033,12 @@ bool BranchFolder::TailMergeBlocks(Machi if (PBB->hasEHPadSuccessor()) continue; - // Bail out if the loop header (IBB) is not the top of the loop chain - // after the block placement. Otherwise, the common tail of IBB's - // predecessors may become the loop top if block placement is called again - // and the predecessors may branch to this common tail. - // FIXME: Relaxed this check if the algorithm of finding loop top is - // changed in MBP. + // After block placement, only consider predecessors that belong to the + // same loop as IBB. The reason is the same as above when skipping loop + // header. if (AfterBlockPlacement && MLI) - if (MachineLoop *ML = MLI->getLoopFor(IBB)) - if (IBB == ML->getHeader() && ML == MLI->getLoopFor(PBB)) - continue; + if (ML != MLI->getLoopFor(PBB)) + continue; MachineBasicBlock *TBB = nullptr, *FBB = nullptr; SmallVector Cond; Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStack.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStack.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStack.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -530,7 +530,7 @@ Value *SafeStack::moveStaticAllocasToUns unsigned Align = std::max(DL->getPrefTypeAlignment(Ty), StackGuardSlot->getAlignment()); SSL.addObject(StackGuardSlot, getStaticAllocaAllocationSize(StackGuardSlot), - Align, SSC.getLiveRange(StackGuardSlot)); + Align, SSC.getFullLiveRange()); } for (Argument *Arg : ByValArguments) { Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStackColoring.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStackColoring.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStackColoring.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -25,7 +25,9 @@ static cl::opt ClColoring("safe-st cl::Hidden, cl::init(true)); const StackColoring::LiveRange &StackColoring::getLiveRange(AllocaInst *AI) { - return LiveRanges[AllocaNumbering[AI]]; + const auto IT = AllocaNumbering.find(AI); + assert(IT != AllocaNumbering.end()); + return LiveRanges[IT->second]; } bool StackColoring::readMarker(Instruction *I, bool *IsStart) { Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStackLayout.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStackLayout.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/SafeStackLayout.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -100,7 +100,8 @@ void StackLayout::layoutObject(StackObje } // Split starting and ending regions if necessary. - for (StackRegion &R : Regions) { + for (unsigned i = 0; i < Regions.size(); ++i) { + StackRegion &R = Regions[i]; if (Start > R.Start && Start < R.End) { StackRegion R0 = R; R.Start = R0.End = Start; Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -6198,13 +6198,27 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SD } } - // sext(setcc x, y, cc) -> (select (setcc x, y, cc), -1, 0) - unsigned ElementWidth = VT.getScalarType().getSizeInBits(); + // sext(setcc x, y, cc) -> (select (setcc x, y, cc), T, 0) + // Here, T can be 1 or -1, depending on the type of the setcc and + // getBooleanContents(). + unsigned SetCCWidth = N0.getValueType().getScalarSizeInBits(); + SDLoc DL(N); - SDValue NegOne = - DAG.getConstant(APInt::getAllOnesValue(ElementWidth), DL, VT); + // To determine the "true" side of the select, we need to know the high bit + // of the value returned by the setcc if it evaluates to true. + // If the type of the setcc is i1, then the true case of the select is just + // sext(i1 1), that is, -1. + // If the type of the setcc is larger (say, i8) then the value of the high + // bit depends on getBooleanContents(). So, ask TLI for a real "true" value + // of the appropriate width. + SDValue ExtTrueVal = + (SetCCWidth == 1) + ? DAG.getConstant(APInt::getAllOnesValue(VT.getScalarSizeInBits()), + DL, VT) + : TLI.getConstTrueVal(DAG, VT, DL); + if (SDValue SCC = SimplifySelectCC( - DL, N0.getOperand(0), N0.getOperand(1), NegOne, + DL, N0.getOperand(0), N0.getOperand(1), ExtTrueVal, DAG.getConstant(0, DL, VT), cast(N0.getOperand(2))->get(), true)) return SCC; @@ -6215,10 +6229,10 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SD TLI.isOperationLegal(ISD::SETCC, N0.getOperand(0).getValueType())) { SDLoc DL(N); ISD::CondCode CC = cast(N0.getOperand(2))->get(); - SDValue SetCC = DAG.getSetCC(DL, SetCCVT, - N0.getOperand(0), N0.getOperand(1), CC); - return DAG.getSelect(DL, VT, SetCC, - NegOne, DAG.getConstant(0, DL, VT)); + SDValue SetCC = + DAG.getSetCC(DL, SetCCVT, N0.getOperand(0), N0.getOperand(1), CC); + return DAG.getSelect(DL, VT, SetCC, ExtTrueVal, + DAG.getConstant(0, DL, VT)); } } } Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -6639,19 +6639,26 @@ void SelectionDAG::TransferDbgValues(SDV SDNode *FromNode = From.getNode(); SDNode *ToNode = To.getNode(); ArrayRef DVs = GetDbgValues(FromNode); + SmallVector ClonedDVs; for (ArrayRef::iterator I = DVs.begin(), E = DVs.end(); I != E; ++I) { SDDbgValue *Dbg = *I; // Only add Dbgvalues attached to same ResNo. if (Dbg->getKind() == SDDbgValue::SDNODE && - Dbg->getResNo() == From.getResNo()) { + Dbg->getSDNode() == From.getNode() && + Dbg->getResNo() == From.getResNo() && !Dbg->isInvalidated()) { + assert(FromNode != ToNode && + "Should not transfer Debug Values intranode"); SDDbgValue *Clone = getDbgValue(Dbg->getVariable(), Dbg->getExpression(), ToNode, To.getResNo(), Dbg->isIndirect(), Dbg->getOffset(), Dbg->getDebugLoc(), Dbg->getOrder()); - AddDbgValue(Clone, ToNode, false); + ClonedDVs.push_back(Clone); + Dbg->setIsInvalidated(); } } + for (SDDbgValue *I : ClonedDVs) + AddDbgValue(I, ToNode, false); } //===----------------------------------------------------------------------===// Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -1234,6 +1234,16 @@ bool TargetLowering::isConstTrueVal(cons llvm_unreachable("Invalid boolean contents"); } +SDValue TargetLowering::getConstTrueVal(SelectionDAG &DAG, EVT VT, + const SDLoc &DL) const { + unsigned ElementWidth = VT.getScalarSizeInBits(); + APInt TrueInt = + getBooleanContents(VT) == TargetLowering::ZeroOrOneBooleanContent + ? APInt(ElementWidth, 1) + : APInt::getAllOnesValue(ElementWidth); + return DAG.getConstant(TrueInt, DL, VT); +} + bool TargetLowering::isConstFalseVal(const SDNode *N) const { if (!N) return false; Modified: projects/clang390-import/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp Wed Aug 17 19:41:29 2016 (r304310) @@ -29,7 +29,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/CodeGen/LiveIntervalAnalysis.h" @@ -539,6 +539,16 @@ regsAreCompatible(unsigned RegA, unsigne return TRI->regsOverlap(RegA, RegB); } +// Returns true if Reg is equal or aliased to at least one register in Set. +static bool regOverlapsSet(const SmallVectorImpl &Set, unsigned Reg, + const TargetRegisterInfo *TRI) { + for (unsigned R : Set) + if (TRI->regsOverlap(R, Reg)) + return true; + + return false; +} + /// Return true if it's potentially profitable to commute the two-address /// instruction that's being processed. bool @@ -864,9 +874,9 @@ rescheduleMIBelowKill(MachineBasicBlock: // FIXME: Needs more sophisticated heuristics. return false; - SmallSet Uses; - SmallSet Kills; - SmallSet Defs; + SmallVector Uses; + SmallVector Kills; + SmallVector Defs; for (const MachineOperand &MO : MI->operands()) { if (!MO.isReg()) continue; @@ -874,12 +884,12 @@ rescheduleMIBelowKill(MachineBasicBlock: if (!MOReg) continue; if (MO.isDef()) - Defs.insert(MOReg); + Defs.push_back(MOReg); else { - Uses.insert(MOReg); + Uses.push_back(MOReg); if (MOReg != Reg && (MO.isKill() || (LIS && isPlainlyKilled(MI, MOReg, LIS)))) - Kills.insert(MOReg); + Kills.push_back(MOReg); } } @@ -888,8 +898,9 @@ rescheduleMIBelowKill(MachineBasicBlock: MachineBasicBlock::iterator AfterMI = std::next(Begin); MachineBasicBlock::iterator End = AfterMI; - while (End->isCopy() && Defs.count(End->getOperand(1).getReg())) { - Defs.insert(End->getOperand(0).getReg()); + while (End->isCopy() && + regOverlapsSet(Defs, End->getOperand(1).getReg(), TRI)) { + Defs.push_back(End->getOperand(0).getReg()); ++End; } @@ -915,21 +926,21 @@ rescheduleMIBelowKill(MachineBasicBlock: if (!MOReg) continue; if (MO.isDef()) { - if (Uses.count(MOReg)) + if (regOverlapsSet(Uses, MOReg, TRI)) // Physical register use would be clobbered. return false; - if (!MO.isDead() && Defs.count(MOReg)) + if (!MO.isDead() && regOverlapsSet(Defs, MOReg, TRI)) // May clobber a physical register def. // FIXME: This may be too conservative. It's ok if the instruction // is sunken completely below the use. return false; } else { - if (Defs.count(MOReg)) + if (regOverlapsSet(Defs, MOReg, TRI)) return false; bool isKill = MO.isKill() || (LIS && isPlainlyKilled(&OtherMI, MOReg, LIS)); - if (MOReg != Reg && - ((isKill && Uses.count(MOReg)) || Kills.count(MOReg))) + if (MOReg != Reg && ((isKill && regOverlapsSet(Uses, MOReg, TRI)) || + regOverlapsSet(Kills, MOReg, TRI))) // Don't want to extend other live ranges and update kills. return false; if (MOReg == Reg && !isKill) Modified: projects/clang390-import/contrib/llvm/lib/IR/AttributeImpl.h ============================================================================== --- projects/clang390-import/contrib/llvm/lib/IR/AttributeImpl.h Wed Aug 17 19:38:11 2016 (r304309) +++ projects/clang390-import/contrib/llvm/lib/IR/AttributeImpl.h Wed Aug 17 19:41:29 2016 (r304310) @@ -19,8 +19,8 @@ #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/Optional.h" #include "llvm/IR/Attributes.h" +#include "AttributeSetNode.h" #include "llvm/Support/DataTypes.h" -#include "llvm/Support/TrailingObjects.h" #include #include *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***