/// Returns true if Li and Lj only differ in dense.
bool onlyDenseDiff(unsigned i, unsigned j);
- /// Bit translation.
+ /// Bit translation (get tensor ID).
unsigned tensor(unsigned b) const { return b % numTensors; }
+ /// Bit translation (get loop index).
unsigned index(unsigned b) const { return b / numTensors; }
/// Returns true if bit corresponds to index of output tensor.
return tensor(b) == outTensor && index(b) == i;
}
+ /// Gets tensor ID for the output tensor.
+ unsigned getOutTensorID() const { return outTensor; }
+ /// Gets tensor ID for the synthetic tensor (used for all invariant tensor
+ /// expressions).
+ unsigned getSynTensorID() const { return syntheticTensor; }
+
/// Returns true if given tensor iterates *only* in the given tensor
/// expression. For the output tensor, this defines a "simply dynamic"
/// operation [Bik96]. For instance: a(i) *= 2.0 or a(i) += a(i) for
const unsigned l0 = 0;
MergerTest3T1L() : MergerTestBase(3, 1) {
+ EXPECT_TRUE(merger.getOutTensorID() == t2);
+
// Tensor 0: sparse input vector.
merger.addExp(Kind::kTensor, t0, -1u);
merger.setDimLevelType(t0, l0, DimLevelType::Compressed);
const unsigned l0 = 0;
MergerTest4T1L() : MergerTestBase(4, 1) {
+ EXPECT_TRUE(merger.getOutTensorID() == t3);
+
// Tensor 0: sparse input vector.
merger.addExp(Kind::kTensor, t0, -1u);
merger.setDimLevelType(t0, l0, DimLevelType::Compressed);
const unsigned l0 = 0;
MergerTest3T1LD() : MergerTestBase(3, 1) {
+ EXPECT_TRUE(merger.getOutTensorID() == t2);
+
// Tensor 0: sparse input vector.
merger.addExp(Kind::kTensor, t0, -1u);
merger.setDimLevelType(t0, l0, DimLevelType::Compressed);
class MergerTest4T1LU : public MergerTestBase {
protected:
- // Our three tensors (two inputs, one output).
+ // Our three tensors (three inputs, one output).
const unsigned t0 = 0, t1 = 1, t2 = 2, t3 = 3;
// Our single loop.
const unsigned l0 = 0;
MergerTest4T1LU() : MergerTestBase(4, 1) {
+ EXPECT_TRUE(merger.getOutTensorID() == t3);
+
// Tensor 0: undef input vector.
merger.addExp(Kind::kTensor, t0, -1u);
merger.setDimLevelType(t0, l0, DimLevelType::Undef);
const unsigned l0 = 0;
MergerTest3T1L_SO() : MergerTestBase(3, 1) {
+ EXPECT_TRUE(merger.getOutTensorID() == t2);
+ EXPECT_TRUE(merger.getSynTensorID() == t3);
+
merger.setHasSparseOut(true);
// Tensor 0: undef input vector.