From 1165a35a7312ccd723bbe3e5fe95cd3a3109ec66 Mon Sep 17 00:00:00 2001 From: River Riddle Date: Fri, 1 May 2020 11:56:21 -0700 Subject: [PATCH] [IndexedAccessorRange] Only offset the base if the index is non-zero. This is more efficient and removes the need for derived ranges to handle the degenerate empty case. --- flang/lib/Optimizer/Dialect/FIROps.cpp | 6 ++---- llvm/include/llvm/ADT/STLExtras.h | 10 ++++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp index e2d9488..2e67c86 100644 --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -611,8 +611,7 @@ void fir::IterWhileOp::build(mlir::OpBuilder &builder, bodyRegion->push_back(new Block{}); bodyRegion->front().addArgument(builder.getIndexType()); bodyRegion->front().addArgument(iterate.getType()); - for (auto v : iterArgs) - bodyRegion->front().addArgument(v.getType()); + bodyRegion->front().addArguments(iterArgs.getTypes()); result.addAttributes(attributes); } @@ -799,8 +798,7 @@ void fir::LoopOp::build(mlir::OpBuilder &builder, mlir::OperationState &result, if (iterArgs.empty()) LoopOp::ensureTerminator(*bodyRegion, builder, result.location); bodyRegion->front().addArgument(builder.getIndexType()); - for (auto v : iterArgs) - bodyRegion->front().addArgument(v.getType()); + bodyRegion->front().addArguments(iterArgs.getTypes()); if (unordered) result.addAttribute(unorderedAttrName(), builder.getUnitAttr()); result.addAttributes(attributes); diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index 595ecbd..30bcdf5 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -1108,7 +1108,7 @@ public: }; indexed_accessor_range_base(iterator begin, iterator end) - : base(DerivedT::offset_base(begin.getBase(), begin.getIndex())), + : base(offset_base(begin.getBase(), begin.getIndex())), count(end.getIndex() - begin.getIndex()) {} indexed_accessor_range_base(const iterator_range &range) : indexed_accessor_range_base(range.begin(), range.end()) {} @@ -1141,7 +1141,7 @@ public: /// Drop the first N elements, and keep M elements. DerivedT slice(size_t n, size_t m) const { assert(n + m <= size() && "invalid size specifiers"); - return DerivedT(DerivedT::offset_base(base, n), m); + return DerivedT(offset_base(base, n), m); } /// Drop the first n elements. @@ -1174,6 +1174,12 @@ public: return RangeT(iterator_range(*this)); } +private: + /// Offset the given base by the given amount. + static BaseT offset_base(const BaseT &base, size_t n) { + return n == 0 ? base : DerivedT::offset_base(base, n); + } + protected: indexed_accessor_range_base(const indexed_accessor_range_base &) = default; indexed_accessor_range_base(indexed_accessor_range_base &&) = default; -- 2.7.4