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