Go to the documentation of this file.
18 #ifndef LLVM_ADT_ITERATOR_RANGE_H
19 #define LLVM_ADT_ITERATOR_RANGE_H
29 template <
typename IteratorT>
31 IteratorT begin_iterator, end_iterator;
36 template <
typename Container>
39 : begin_iterator(
c.
begin()), end_iterator(
c.
end()) {}
41 : begin_iterator(
std::
move(begin_iterator)),
42 end_iterator(
std::
move(end_iterator)) {}
44 IteratorT
begin()
const {
return begin_iterator; }
45 IteratorT
end()
const {
return end_iterator; }
46 bool empty()
const {
return begin_iterator == end_iterator; }
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
the resulting code requires compare and branches when and if * p
the resulting code requires compare and branches when and if the revised code is with conditional branches instead of More there is a byte word extend before each where there should be only and the condition codes are not remembered when the same two values are compared twice More LSR enhancements i8 and i32 load store addressing modes are identical int int c
iterator_range(Container &&c)
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
into llvm powi allowing the code generator to produce balanced multiplication trees the intrinsic needs to be extended to support and second the code generator needs to be enhanced to lower these to multiplication trees Interesting testcase for add shift mul int y
A range adaptor for a pair of iterators.