forked from OSchip/llvm-project
Fix affine expr flattener bug introduced by cl/225452174.
- inconsistent local var constraint size when repeatedly using the same flattener for all expressions in a map. PiperOrigin-RevId: 227067836
This commit is contained in:
parent
4c05f8cac6
commit
294687ef59
|
@ -128,7 +128,7 @@ public:
|
||||||
// In future, consider adding a prepass to determine how big the SmallVector's
|
// In future, consider adding a prepass to determine how big the SmallVector's
|
||||||
// will be, and linearize this to std::vector<int64_t> to prevent
|
// will be, and linearize this to std::vector<int64_t> to prevent
|
||||||
// SmallVector moves on re-allocation.
|
// SmallVector moves on re-allocation.
|
||||||
std::vector<SmallVector<int64_t, 32>> operandExprStack;
|
std::vector<SmallVector<int64_t, 8>> operandExprStack;
|
||||||
// Constraints connecting newly introduced local variables (for mod's and
|
// Constraints connecting newly introduced local variables (for mod's and
|
||||||
// div's) to existing (dimensional and symbolic) ones. These are always
|
// div's) to existing (dimensional and symbolic) ones. These are always
|
||||||
// inequalities.
|
// inequalities.
|
||||||
|
@ -426,16 +426,11 @@ static bool getFlattenedAffineExprs(
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
flattener.walkPostOrder(expr);
|
flattener.walkPostOrder(expr);
|
||||||
|
|
||||||
SmallVector<int64_t, 8> flattenedExpr;
|
|
||||||
flattenedExpr.reserve(flattener.numDims + flattener.numSymbols +
|
|
||||||
flattener.numLocals + 1);
|
|
||||||
for (auto v : flattener.operandExprStack.back()) {
|
|
||||||
flattenedExpr.push_back(v);
|
|
||||||
}
|
|
||||||
flattenedExprs->push_back(flattenedExpr);
|
|
||||||
flattener.operandExprStack.pop_back();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flattenedExprs->insert(flattenedExprs->end(),
|
||||||
|
flattener.operandExprStack.begin(),
|
||||||
|
flattener.operandExprStack.end());
|
||||||
if (localVarCst)
|
if (localVarCst)
|
||||||
localVarCst->clearAndCopyFrom(flattener.localVarCst);
|
localVarCst->clearAndCopyFrom(flattener.localVarCst);
|
||||||
|
|
||||||
|
@ -861,7 +856,7 @@ addMemRefAccessConstraints(const AffineValueMap &srcAccessMap,
|
||||||
// Add equality constraints for any dst symbols defined by constant ops.
|
// Add equality constraints for any dst symbols defined by constant ops.
|
||||||
addEqForConstOperands(dstOperands);
|
addEqForConstOperands(dstOperands);
|
||||||
|
|
||||||
// TODO(bondhugula): add srcLocalVarCst, destLocalVarCst to the dependence
|
// TODO(b/122081337): add srcLocalVarCst, destLocalVarCst to the dependence
|
||||||
// domain.
|
// domain.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -676,3 +676,26 @@ mlfunc @loop_nest_depth() {
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----
|
||||||
|
// Test case to exercise sanity when flattening multiple expressions involving
|
||||||
|
// mod/div's successively.
|
||||||
|
// CHECK-LABEL: mlfunc @mod_div_3d() {
|
||||||
|
mlfunc @mod_div_3d() {
|
||||||
|
%M = alloc() : memref<2x2x2xi32>
|
||||||
|
%c0 = constant 0 : i32
|
||||||
|
for %i0 = 0 to 8 {
|
||||||
|
for %i1 = 0 to 8 {
|
||||||
|
for %i2 = 0 to 8 {
|
||||||
|
%idx = affine_apply (d0, d1, d2) -> (d0 floordiv 4, d1 mod 2, d2 floordiv 4) (%i0, %i1, %i2)
|
||||||
|
// Dependences below are conservative due to TODO(b/122081337).
|
||||||
|
store %c0, %M[%idx#0, %idx#1, %idx#2] : memref<2 x 2 x 2 x i32>
|
||||||
|
// expected-note@-1 {{dependence from 0 to 0 at depth 1 = [1, 7][-7, 7][-7, 7]}}
|
||||||
|
// expected-note@-2 {{dependence from 0 to 0 at depth 2 = [0, 0][2, 7][-7, 7]}}
|
||||||
|
// expected-note@-3 {{dependence from 0 to 0 at depth 3 = [0, 0][0, 0][1, 7]}}
|
||||||
|
// expected-note@-4 {{dependence from 0 to 0 at depth 4 = false}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue