23 Operation *op = v.getDefiningOp();
24 if (!op || depth == 5)
25 return KnownBits(v.getType().getIntOrFloatBitWidth());
28 if (
auto constant = dyn_cast<hw::ConstantOp>(op))
29 return KnownBits::makeConstant(constant.getValue());
32 if (
auto concatOp = dyn_cast<ConcatOp>(op)) {
34 for (
size_t i = 1, e = concatOp.getNumOperands(); i != e; ++i) {
36 unsigned width = otherBits.getBitWidth();
37 unsigned newWidth = result.getBitWidth() + width;
39 (result.Zero.zext(newWidth) << width) | otherBits.Zero.zext(newWidth);
41 (result.One.zext(newWidth) << width) | otherBits.One.zext(newWidth);
47 if (
auto andOp = dyn_cast<AndOp>(op)) {
49 for (
size_t i = 1, e = andOp.getNumOperands(); i != e; ++i)
55 if (
auto orOp = dyn_cast<OrOp>(op)) {
57 for (
size_t i = 1, e = orOp.getNumOperands(); i != e; ++i)
63 if (
auto xorOp = dyn_cast<XorOp>(op)) {
65 for (
size_t i = 1, e = xorOp.getNumOperands(); i != e; ++i) {
67 if (result.isUnknown())
75 if (
auto muxOp = dyn_cast<MuxOp>(op)) {
78 return lhs.intersectWith(rhs);
81 return KnownBits(v.getType().getIntOrFloatBitWidth());
static KnownBits computeKnownBits(Value v, unsigned depth)
Given an integer SSA value, check to see if we know anything about the result of the computation.