@@ -97,7 +97,7 @@ class DenseLevel : public SparseTensorLevel {
97
97
ValuePair peekRangeAt (OpBuilder &b, Location l, ValueRange batchPrefix,
98
98
ValueRange parentPos, Value inPadZone) const override {
99
99
assert (parentPos.size () == 1 && " Dense level can not be non-unique." );
100
- assert (!inPadZone && " Not implememnted " );
100
+ assert (!inPadZone && " Not implemented " );
101
101
Value p = parentPos.front ();
102
102
Value posLo = MULI (p, lvlSize);
103
103
return {posLo, lvlSize};
@@ -117,7 +117,7 @@ class BatchLevel : public SparseTensorLevel {
117
117
118
118
ValuePair peekRangeAt (OpBuilder &b, Location l, ValueRange,
119
119
ValueRange parentPos, Value inPadZone) const override {
120
- assert (!inPadZone && " Not implememnted " );
120
+ assert (!inPadZone && " Not implemented " );
121
121
assert (parentPos.size () == 1 && " Dense level can not be non-unique." );
122
122
// No need to linearize the position for non-annotated tensors.
123
123
return {C_IDX (0 ), lvlSize};
@@ -151,13 +151,14 @@ class CompressedLevel : public SparseLevel</*hasPosBuf=*/true> {
151
151
152
152
SmallVector<Type, 2 > types{b.getIndexType (), b.getIndexType ()};
153
153
scf::IfOp posRangeIf = b.create <scf::IfOp>(l, types, inPadZone, true );
154
- // True branch.
154
+ // True branch, returns a "fake" empty range [0, 0) if parent
155
+ // iterator is in pad zone.
155
156
b.setInsertionPointToStart (posRangeIf.thenBlock ());
156
- // Returns a "fake" empty range [0, 0) if parent iterator is in pad zone.
157
+
157
158
SmallVector<Value, 2 > emptyRange{C_IDX (0 ), C_IDX (0 )};
158
159
b.create <scf::YieldOp>(l, emptyRange);
159
160
160
- // False branch.
161
+ // False branch, returns the actual range .
161
162
b.setInsertionPointToStart (posRangeIf.elseBlock ());
162
163
auto [pLo, pHi] = loadRange ();
163
164
SmallVector<Value, 2 > loadedRange{pLo, pHi};
@@ -179,7 +180,7 @@ class LooseCompressedLevel : public SparseLevel</*hasPosBuf=*/true> {
179
180
ValueRange parentPos, Value inPadZone) const override {
180
181
assert (parentPos.size () == 1 &&
181
182
" loose-compressed level must be the first non-unique level." );
182
- assert (!inPadZone && " Not implememnted " );
183
+ assert (!inPadZone && " Not implemented " );
183
184
SmallVector<Value> memCrd (batchPrefix);
184
185
Value p = parentPos.front ();
185
186
p = MULI (p, C_IDX (2 ));
@@ -200,7 +201,7 @@ class SingletonLevel : public SparseLevel</*hasPosBuf=*/false> {
200
201
ValuePair peekRangeAt (OpBuilder &b, Location l, ValueRange batchPrefix,
201
202
ValueRange parentPos, Value inPadZone) const override {
202
203
assert (parentPos.size () == 1 || parentPos.size () == 2 );
203
- assert (!inPadZone && " Not implememnted " );
204
+ assert (!inPadZone && " Not implemented " );
204
205
Value p = parentPos.front ();
205
206
Value segHi = parentPos.size () == 2 ? parentPos.back () : nullptr ;
206
207
@@ -221,7 +222,7 @@ class NOutOfMLevel : public SparseLevel</*hasPosBuf=*/false> {
221
222
ValueRange parentPos, Value inPadZone) const override {
222
223
assert (parentPos.size () == 1 && isUnique () &&
223
224
" n:m level can not be non-unique." );
224
- assert (!inPadZone && " Not implememnted " );
225
+ assert (!inPadZone && " Not implemented " );
225
226
// Each n:m blk has exactly n specified elements.
226
227
auto n = getN (lt);
227
228
Value posLo = MULI (parentPos.front (), C_IDX (n));
@@ -487,6 +488,7 @@ class SimpleWrapIterator : public SparseIterator {
487
488
bool isBatchIterator () const override { return wrap->isBatchIterator (); }
488
489
bool randomAccessible () const override { return wrap->randomAccessible (); };
489
490
bool iteratableByFor () const override { return wrap->iteratableByFor (); };
491
+
490
492
SmallVector<Value> serialize () const override { return wrap->serialize (); };
491
493
void deserialize (ValueRange vs) override { wrap->deserialize (vs); };
492
494
ValueRange getCurPosition () const override { return wrap->getCurPosition (); }
@@ -601,9 +603,7 @@ class PadIterator : public SimpleWrapIterator {
601
603
Value padHigh)
602
604
: SimpleWrapIterator(std::move(wrap), IterKind::kPad ,
603
605
wrap->randomAccessible () ? 1 : 0),
604
- padLow(padLow), padHigh(padHigh) {
605
- // assert(!randomAccessible());
606
- }
606
+ padLow(padLow), padHigh(padHigh) {}
607
607
608
608
// For LLVM-style RTTI.
609
609
static bool classof (const SparseIterator *from) {
@@ -614,13 +614,20 @@ class PadIterator : public SimpleWrapIterator {
614
614
return std::string (" pad<" ) + wrap->getDebugInterfacePrefix () + " >" ;
615
615
}
616
616
617
+ // Returns a pair of values for *upper*, *lower* bound respectively.
618
+ ValuePair genForCond (OpBuilder &b, Location l) override {
619
+ if (randomAccessible ())
620
+ return {getCrd (), upperBound (b, l)};
621
+ return wrap->genForCond (b, l);
622
+ }
623
+
617
624
// For padded dense iterator, we append a `inPadZone: bool` in addition to
618
625
// values used by the wrapped iterator.
619
626
ValueRange getCurPosition () const override { return getCursor (); }
620
627
621
628
SmallVector<Type> getCursorValTypes (OpBuilder &b) const override {
622
629
SmallVector<Type> ret = wrap->getCursorValTypes (b);
623
- // Need a extra boolean value `inPadZone` for padded dense iterator.
630
+ // Need an extra boolean value `inPadZone` for padded dense iterator.
624
631
if (randomAccessible ())
625
632
ret.push_back (b.getI1Type ());
626
633
0 commit comments