[PATCH] D130557: [Support] Add KnownBits::concatBits helper
Simon Pilgrim via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 26 02:47:23 PDT 2022
RKSimon created this revision.
RKSimon added reviewers: spatel, nikic.
Herald added subscribers: foad, hiraditya.
Herald added a project: All.
RKSimon requested review of this revision.
Herald added a project: LLVM.
Add a helper for the various cases where we need to concatenate 2 KnownBits together (BUILD_PAIR and SHIFT_PARTS in particular).
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D130557
Files:
llvm/include/llvm/Support/KnownBits.h
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/unittests/Support/KnownBitsTest.cpp
Index: llvm/unittests/Support/KnownBitsTest.cpp
===================================================================
--- llvm/unittests/Support/KnownBitsTest.cpp
+++ llvm/unittests/Support/KnownBitsTest.cpp
@@ -508,4 +508,29 @@
});
}
+TEST(KnownBitsTest, ConcatBits) {
+ unsigned Bits = 4;
+ for (unsigned LoBits = 1; LoBits < Bits; ++LoBits) {
+ unsigned HiBits = Bits - LoBits;
+ ForeachKnownBits(LoBits, [&](const KnownBits &KnownLo) {
+ ForeachKnownBits(HiBits, [&](const KnownBits &KnownHi) {
+ KnownBits KnownAll = KnownBits::concatBits(KnownLo, KnownHi);
+
+ EXPECT_EQ(KnownLo.countMinPopulation() + KnownHi.countMinPopulation(),
+ KnownAll.countMinPopulation());
+ EXPECT_EQ(KnownLo.countMaxPopulation() + KnownHi.countMaxPopulation(),
+ KnownAll.countMaxPopulation());
+
+ KnownBits ExtractLo = KnownAll.extractBits(LoBits, 0);
+ KnownBits ExtractHi = KnownAll.extractBits(HiBits, LoBits);
+
+ EXPECT_EQ(KnownLo.One.getZExtValue(), ExtractLo.One.getZExtValue());
+ EXPECT_EQ(KnownHi.One.getZExtValue(), ExtractHi.One.getZExtValue());
+ EXPECT_EQ(KnownLo.Zero.getZExtValue(), ExtractLo.Zero.getZExtValue());
+ EXPECT_EQ(KnownHi.Zero.getZExtValue(), ExtractHi.Zero.getZExtValue());
+ });
+ });
+ }
+}
+
} // end anonymous namespace
Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -2225,11 +2225,7 @@
if (SimplifyDemandedBits(Op.getOperand(1), MaskHi, KnownHi, TLO, Depth + 1))
return true;
- Known.Zero = KnownLo.Zero.zext(BitWidth) |
- KnownHi.Zero.zext(BitWidth).shl(HalfBitWidth);
-
- Known.One = KnownLo.One.zext(BitWidth) |
- KnownHi.One.zext(BitWidth).shl(HalfBitWidth);
+ Known = KnownBits::concatBits(KnownLo, KnownHi);
break;
}
case ISD::ZERO_EXTEND:
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -3335,13 +3335,11 @@
assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
// Collect lo/hi source values and concatenate.
- // TODO: Would a KnownBits::concatBits helper be useful?
unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
- Known = Known.anyext(LoBits + HiBits);
- Known.insertBits(Known2, LoBits);
+ Known = KnownBits::concatBits(Known, Known2);
// Collect shift amount.
Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
Index: llvm/include/llvm/Support/KnownBits.h
===================================================================
--- llvm/include/llvm/Support/KnownBits.h
+++ llvm/include/llvm/Support/KnownBits.h
@@ -304,6 +304,16 @@
return KnownBits(~C, C);
}
+ /// Concatenate 2 known bits together.
+ static KnownBits concatBits(const KnownBits &Lo, const KnownBits &Hi) {
+ unsigned LoBits = Lo.getBitWidth();
+ unsigned HiBits = Hi.getBitWidth();
+ KnownBits Concat(LoBits + HiBits);
+ Concat.insertBits(Lo, 0);
+ Concat.insertBits(Hi, LoBits);
+ return Concat;
+ }
+
/// Compute known bits common to LHS and RHS.
static KnownBits commonBits(const KnownBits &LHS, const KnownBits &RHS) {
return KnownBits(LHS.Zero & RHS.Zero, LHS.One & RHS.One);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D130557.447631.patch
Type: text/x-patch
Size: 3787 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220726/11c9b006/attachment.bin>
More information about the llvm-commits
mailing list