[llvm] r340000 - [MISC]Fix wrong usage of std::equal()
Chen Zheng via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 17 00:51:01 PDT 2018
Author: shchenz
Date: Fri Aug 17 00:51:01 2018
New Revision: 340000
URL: http://llvm.org/viewvc/llvm-project?rev=340000&view=rev
Log:
[MISC]Fix wrong usage of std::equal()
Differential Revision: https://reviews.llvm.org/D49958
Modified:
llvm/trunk/include/llvm/ADT/STLExtras.h
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp
llvm/trunk/unittests/ADT/STLExtrasTest.cpp
Modified: llvm/trunk/include/llvm/ADT/STLExtras.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/STLExtras.h?rev=340000&r1=339999&r2=340000&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/STLExtras.h (original)
+++ llvm/trunk/include/llvm/ADT/STLExtras.h Fri Aug 17 00:51:01 2018
@@ -1005,6 +1005,18 @@ void DeleteContainerSeconds(Container &C
C.clear();
}
+/// Get the size of a range. This is a wrapper function around std::distance
+/// which is only enabled when the operation is O(1).
+template <typename R>
+auto size(R &&Range, typename std::enable_if<
+ std::is_same<typename std::iterator_traits<decltype(
+ Range.begin())>::iterator_category,
+ std::random_access_iterator_tag>::value,
+ void>::type * = nullptr)
+ -> decltype(std::distance(Range.begin(), Range.end())) {
+ return std::distance(Range.begin(), Range.end());
+}
+
/// Provide wrappers to std::for_each which take ranges instead of having to
/// pass begin/end explicitly.
template <typename R, typename UnaryPredicate>
@@ -1115,6 +1127,15 @@ auto lower_bound(R &&Range, ForwardIt I)
return std::lower_bound(adl_begin(Range), adl_end(Range), I);
}
+/// Wrapper function around std::equal to detect if all elements
+/// in a container are same.
+template <typename R>
+bool is_splat(R &&Range) {
+ size_t range_size = size(Range);
+ return range_size != 0 && (range_size == 1 ||
+ std::equal(adl_begin(Range) + 1, adl_end(Range), adl_begin(Range)));
+}
+
/// Given a range of type R, iterate the entire range and return a
/// SmallVector with elements of the vector. This is useful, for example,
/// when you want to iterate a range and then sort the results.
@@ -1136,18 +1157,6 @@ void erase_if(Container &C, UnaryPredica
C.erase(remove_if(C, P), C.end());
}
-/// Get the size of a range. This is a wrapper function around std::distance
-/// which is only enabled when the operation is O(1).
-template <typename R>
-auto size(R &&Range, typename std::enable_if<
- std::is_same<typename std::iterator_traits<decltype(
- Range.begin())>::iterator_category,
- std::random_access_iterator_tag>::value,
- void>::type * = nullptr)
- -> decltype(std::distance(Range.begin(), Range.end())) {
- return std::distance(Range.begin(), Range.end());
-}
-
//===----------------------------------------------------------------------===//
// Extra additions to <memory>
//===----------------------------------------------------------------------===//
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=340000&r1=339999&r2=340000&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Fri Aug 17 00:51:01 2018
@@ -2931,7 +2931,7 @@ void SelectionDAGBuilder::visitSelect(co
ISD::VSELECT : ISD::SELECT;
// Min/max matching is only viable if all output VTs are the same.
- if (std::equal(ValueVTs.begin(), ValueVTs.end(), ValueVTs.begin())) {
+ if (is_splat(ValueVTs)) {
EVT VT = ValueVTs[0];
LLVMContext &Ctx = *DAG.getContext();
auto &TLI = DAG.getTargetLoweringInfo();
Modified: llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp?rev=340000&r1=339999&r2=340000&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp Fri Aug 17 00:51:01 2018
@@ -3174,10 +3174,7 @@ bool NewGVN::singleReachablePHIPath(
SmallVector<const Value *, 32> OperandList;
std::copy(FilteredPhiArgs.begin(), FilteredPhiArgs.end(),
std::back_inserter(OperandList));
- bool Okay = OperandList.size() == 1;
- if (!Okay)
- Okay =
- std::equal(OperandList.begin(), OperandList.end(), OperandList.begin());
+ bool Okay = is_splat(OperandList);
if (Okay)
return singleReachablePHIPath(Visited, cast<MemoryAccess>(OperandList[0]),
Second);
@@ -3272,8 +3269,7 @@ void NewGVN::verifyMemoryCongruency() co
const MemoryDef *MD = cast<MemoryDef>(U);
return ValueToClass.lookup(MD->getMemoryInst());
});
- assert(std::equal(PhiOpClasses.begin(), PhiOpClasses.end(),
- PhiOpClasses.begin()) &&
+ assert(is_splat(PhiOpClasses) &&
"All MemoryPhi arguments should be in the same class");
}
}
Modified: llvm/trunk/unittests/ADT/STLExtrasTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/STLExtrasTest.cpp?rev=340000&r1=339999&r2=340000&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/STLExtrasTest.cpp (original)
+++ llvm/trunk/unittests/ADT/STLExtrasTest.cpp Fri Aug 17 00:51:01 2018
@@ -415,4 +415,19 @@ TEST(STLExtrasTest, EarlyIncrementTest)
EXPECT_EQ(EIR.end(), I);
}
+TEST(STLExtrasTest, splat) {
+ std::vector<int> V;
+ EXPECT_FALSE(is_splat(V));
+
+ V.push_back(1);
+ EXPECT_TRUE(is_splat(V));
+
+ V.push_back(1);
+ V.push_back(1);
+ EXPECT_TRUE(is_splat(V));
+
+ V.push_back(2);
+ EXPECT_FALSE(is_splat(V));
+}
+
} // namespace
More information about the llvm-commits
mailing list