<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Quentin,<br>
    I pushed the following patch which turns off the default behavior of
    my patch:<br>
    <a class="moz-txt-link-freetext" href="https://reviews.llvm.org/D27745">https://reviews.llvm.org/D27745</a><br>
    <br>
    I will re-enable it once I figure out a fix.<br>
    <br>
    --Mandeep<br>
    <br>
    <div class="moz-cite-prefix">On 12/13/2016 5:21 PM, Quentin Colombet
      wrote:<br>
    </div>
    <blockquote
      cite="mid:C672FE92-9DF3-4E90-B4F3-C179BCFD5A92@apple.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      Hi,
      <div class=""><br class="">
      </div>
      <div class="">This seems to crash the bots.</div>
      <div class="">E.g.,</div>
      <div class=""><a moz-do-not-send="true"
href="http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_check/31314/testReport/junit/LLVM/CodeGen_AMDGPU/ctlz_zero_undef_ll/"
          class="">http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_check/31314/testReport/junit/LLVM/CodeGen_AMDGPU/ctlz_zero_undef_ll/</a></div>
      <div class=""><br class="">
      </div>
      <div class="">Could you fix or revert?</div>
      <div class=""><br class="">
      </div>
      <div class="">Thanks,</div>
      <div class="">-Quentin<br class="">
        <div>
          <blockquote type="cite" class="">
            <div class="">On Dec 13, 2016, at 4:15 PM, Mandeep Singh
              Grang via llvm-commits <<a moz-do-not-send="true"
                href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>>
              wrote:</div>
            <br class="Apple-interchange-newline">
            <div class="">
              <div class="">Author: mgrang<br class="">
                Date: Tue Dec 13 18:15:57 2016<br class="">
                New Revision: 289619<br class="">
                <br class="">
                URL: <a moz-do-not-send="true"
                  href="http://llvm.org/viewvc/llvm-project?rev=289619&view=rev"
                  class="">http://llvm.org/viewvc/llvm-project?rev=289619&view=rev</a><br
                  class="">
                Log:<br class="">
                [llvm] Iterate SmallPtrSet in reverse order to uncover
                non-determinism in codegen<br class="">
                <br class="">
                Summary:<br class="">
                Given a flag (-mllvm -reverse-iterate) this patch will
                enable iteration of SmallPtrSet in reverse order.<br
                  class="">
                The idea is to compile the same source with and without
                this flag and expect the code to not change.<br class="">
                If there is a difference in codegen then it would mean
                that the codegen is sensitive to the iteration order of
                SmallPtrSet.<br class="">
                This is enabled only with
                LLVM_ENABLE_ABI_BREAKING_CHECKS.<br class="">
                <br class="">
                Reviewers: chandlerc, dexonsmith, mehdi_amini<br
                  class="">
                <br class="">
                Subscribers: mgorny, emaste, llvm-commits<br class="">
                <br class="">
                Differential Revision: <a moz-do-not-send="true"
                  href="https://reviews.llvm.org/D26718" class="">https://reviews.llvm.org/D26718</a><br
                  class="">
                <br class="">
                Added:<br class="">
                   llvm/trunk/unittests/ADT/ReverseIterationTest.cpp<br
                  class="">
                Modified:<br class="">
                   llvm/trunk/include/llvm/ADT/SmallPtrSet.h<br class="">
                   llvm/trunk/lib/Support/CommandLine.cpp<br class="">
                   llvm/trunk/unittests/ADT/CMakeLists.txt<br class="">
                <br class="">
                Modified: llvm/trunk/include/llvm/ADT/SmallPtrSet.h<br
                  class="">
                URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallPtrSet.h?rev=289619&r1=289618&r2=289619&view=diff"
                  class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallPtrSet.h?rev=289619&r1=289618&r2=289619&view=diff</a><br
                  class="">
==============================================================================<br
                  class="">
                --- llvm/trunk/include/llvm/ADT/SmallPtrSet.h (original)<br
                  class="">
                +++ llvm/trunk/include/llvm/ADT/SmallPtrSet.h Tue Dec 13
                18:15:57 2016<br class="">
                @@ -15,6 +15,7 @@<br class="">
                #ifndef LLVM_ADT_SMALLPTRSET_H<br class="">
                #define LLVM_ADT_SMALLPTRSET_H<br class="">
                <br class="">
                +#include "llvm/Config/abi-breaking.h"<br class="">
                #include "llvm/Support/Compiler.h"<br class="">
                #include "llvm/Support/PointerLikeTypeTraits.h"<br
                  class="">
                #include <cassert><br class="">
                @@ -25,6 +26,13 @@<br class="">
                #include <iterator><br class="">
                #include <utility><br class="">
                <br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +namespace llvm {<br class="">
                +template <class T = void> struct ReverseIterate {
                static bool value; };<br class="">
                +template <class T> bool
                ReverseIterate<T>::value = true;<br class="">
                +}<br class="">
                +#endif<br class="">
                +<br class="">
                namespace llvm {<br class="">
                <br class="">
                /// SmallPtrSetImplBase - This is the common code shared
                among all the<br class="">
                @@ -206,6 +214,12 @@ protected:<br class="">
                public:<br class="">
                  explicit SmallPtrSetIteratorImpl(const void *const
                *BP, const void*const *E)<br class="">
                    : Bucket(BP), End(E) {<br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +    if (ReverseIterate<bool>::value) {<br
                  class="">
                +      RetreatIfNotValid();<br class="">
                +      return;<br class="">
                +    }<br class="">
                +#endif<br class="">
                    AdvanceIfNotValid();<br class="">
                  }<br class="">
                <br class="">
                @@ -227,6 +241,17 @@ protected:<br class="">
                            *Bucket ==
                SmallPtrSetImplBase::getTombstoneMarker()))<br class="">
                      ++Bucket;<br class="">
                  }<br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +  void RetreatIfNotValid() {<br class="">
                +    --Bucket;<br class="">
                +    assert(Bucket <= End);<br class="">
                +    while (Bucket != End &&<br class="">
                +           (*Bucket ==
                SmallPtrSetImplBase::getEmptyMarker() ||<br class="">
                +            *Bucket ==
                SmallPtrSetImplBase::getTombstoneMarker())) {<br
                  class="">
                +      --Bucket;<br class="">
                +    }<br class="">
                +  }<br class="">
                +#endif<br class="">
                };<br class="">
                <br class="">
                /// SmallPtrSetIterator - This implements a
                const_iterator for SmallPtrSet.<br class="">
                @@ -252,13 +277,27 @@ public:<br class="">
                  }<br class="">
                <br class="">
                  inline SmallPtrSetIterator& operator++() {
                         // Preincrement<br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +    if (ReverseIterate<bool>::value) {<br
                  class="">
                +      RetreatIfNotValid();<br class="">
                +      return *this;<br class="">
                +    }<br class="">
                +#endif<br class="">
                    ++Bucket;<br class="">
                    AdvanceIfNotValid();<br class="">
                    return *this;<br class="">
                  }<br class="">
                <br class="">
                  SmallPtrSetIterator operator++(int) {        //
                Postincrement<br class="">
                -    SmallPtrSetIterator tmp = *this; ++*this; return
                tmp;<br class="">
                +    SmallPtrSetIterator tmp = *this;<br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +    if (ReverseIterate<bool>::value) {<br
                  class="">
                +      --*this;<br class="">
                +      return tmp;<br class="">
                +    }<br class="">
                +#endif<br class="">
                +    ++*this;<br class="">
                +    return tmp;<br class="">
                  }<br class="">
                };<br class="">
                <br class="">
                @@ -343,9 +382,22 @@ public:<br class="">
                  }<br class="">
                <br class="">
                  inline iterator begin() const {<br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +    if (ReverseIterate<bool>::value)<br class="">
                +      return endPtr();<br class="">
                +#endif<br class="">
                    return iterator(CurArray, EndPointer());<br class="">
                  }<br class="">
                  inline iterator end() const {<br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +    if (ReverseIterate<bool>::value)<br class="">
                +      return iterator(CurArray, CurArray);<br class="">
                +#endif<br class="">
                +    return endPtr();<br class="">
                +  }<br class="">
                +<br class="">
                +private:<br class="">
                +  inline iterator endPtr() const {<br class="">
                    const void *const *End = EndPointer();<br class="">
                    return iterator(End, End);<br class="">
                  }<br class="">
                <br class="">
                Modified: llvm/trunk/lib/Support/CommandLine.cpp<br
                  class="">
                URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=289619&r1=289618&r2=289619&view=diff"
                  class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=289619&r1=289618&r2=289619&view=diff</a><br
                  class="">
==============================================================================<br
                  class="">
                --- llvm/trunk/lib/Support/CommandLine.cpp (original)<br
                  class="">
                +++ llvm/trunk/lib/Support/CommandLine.cpp Tue Dec 13
                18:15:57 2016<br class="">
                @@ -45,6 +45,17 @@ using namespace cl;<br class="">
                <br class="">
                #define DEBUG_TYPE "commandline"<br class="">
                <br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +namespace llvm {<br class="">
                +// If LLVM_ENABLE_ABI_BREAKING_CHECKS is set the flag
                -mllvm -reverse-iterate<br class="">
                +// can be used to toggle forward/reverse iteration of
                unordered containers.<br class="">
                +// This will help uncover differences in codegen caused
                due to undefined<br class="">
                +// iteration order.<br class="">
                +static cl::opt<bool, true>
                ReverseIteration("reverse-iterate",<br class="">
                +  cl::location(ReverseIterate<bool>::value),
                cl::init(true));<br class="">
                +}<br class="">
                +#endif<br class="">
                +<br class="">
//===----------------------------------------------------------------------===//<br
                  class="">
                // Template instantiations and anchors.<br class="">
                //<br class="">
                <br class="">
                Modified: llvm/trunk/unittests/ADT/CMakeLists.txt<br
                  class="">
                URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/CMakeLists.txt?rev=289619&r1=289618&r2=289619&view=diff"
                  class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/CMakeLists.txt?rev=289619&r1=289618&r2=289619&view=diff</a><br
                  class="">
==============================================================================<br
                  class="">
                --- llvm/trunk/unittests/ADT/CMakeLists.txt (original)<br
                  class="">
                +++ llvm/trunk/unittests/ADT/CMakeLists.txt Tue Dec 13
                18:15:57 2016<br class="">
                @@ -41,6 +41,7 @@ set(ADTSources<br class="">
                  PostOrderIteratorTest.cpp<br class="">
                  PriorityWorklistTest.cpp<br class="">
                  RangeAdapterTest.cpp<br class="">
                +  ReverseIterationTest.cpp<br class="">
                  SCCIteratorTest.cpp<br class="">
                  STLExtrasTest.cpp<br class="">
                  ScopeExitTest.cpp<br class="">
                <br class="">
                Added: llvm/trunk/unittests/ADT/ReverseIterationTest.cpp<br
                  class="">
                URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/ReverseIterationTest.cpp?rev=289619&view=auto"
                  class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/ReverseIterationTest.cpp?rev=289619&view=auto</a><br
                  class="">
==============================================================================<br
                  class="">
                --- llvm/trunk/unittests/ADT/ReverseIterationTest.cpp
                (added)<br class="">
                +++ llvm/trunk/unittests/ADT/ReverseIterationTest.cpp
                Tue Dec 13 18:15:57 2016<br class="">
                @@ -0,0 +1,39 @@<br class="">
                +//===- llvm/unittest/ADT/ReverseIterationTest.cpp
                ------------------------------===//<br class="">
                +//<br class="">
                +//                     The LLVM Compiler Infrastructure<br
                  class="">
                +//<br class="">
                +// This file is distributed under the University of
                Illinois Open Source<br class="">
                +// License. See LICENSE.TXT for details.<br class="">
                +//<br class="">
+//===----------------------------------------------------------------------===//<br
                  class="">
                +//<br class="">
                +// ReverseIteration unit tests.<br class="">
                +//<br class="">
+//===----------------------------------------------------------------------===//<br
                  class="">
                +<br class="">
                +#include "gtest/gtest.h"<br class="">
                +#include "llvm/ADT/SmallPtrSet.h"<br class="">
                +<br class="">
                +#if LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">
                +using namespace llvm;<br class="">
                +<br class="">
                +TEST(ReverseIterationTest, SmallPtrSetTest) {<br
                  class="">
                +<br class="">
                +  SmallPtrSet<void*, 4> Set;<br class="">
                +  void *Ptrs[] = { (void*)0x1, (void*)0x2, (void*)0x3,
                (void*)0x4 };<br class="">
                +  void *ReversePtrs[] = { (void*)0x4, (void*)0x3,
                (void*)0x2, (void*)0x1 };<br class="">
                +<br class="">
                +  for (auto *Ptr: Ptrs)<br class="">
                +    Set.insert(Ptr);<br class="">
                +<br class="">
                +  // Check forward iteration.<br class="">
                +  ReverseIterate<bool>::value = false;<br
                  class="">
                +  for (const auto &Tuple : zip(Set, Ptrs))<br
                  class="">
                +    ASSERT_EQ(std::get<0>(Tuple),
                std::get<1>(Tuple));<br class="">
                +<br class="">
                +  // Check reverse iteration.<br class="">
                +  ReverseIterate<bool>::value = true;<br class="">
                +  for (const auto &Tuple : zip(Set, ReversePtrs))<br
                  class="">
                +    ASSERT_EQ(std::get<0>(Tuple),
                std::get<1>(Tuple));<br class="">
                +}<br class="">
                +#endif<br class="">
                <br class="">
                <br class="">
                _______________________________________________<br
                  class="">
                llvm-commits mailing list<br class="">
                <a moz-do-not-send="true"
                  href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br
                  class="">
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="">
              </div>
            </div>
          </blockquote>
        </div>
        <br class="">
      </div>
    </blockquote>
    <br>
  </body>
</html>