[llvm] [AMDGPU] MCExpr printing helper with KnownBits support (PR #95951)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 13 13:06:54 PDT 2024
================
@@ -303,3 +305,369 @@ const AMDGPUMCExpr *AMDGPUMCExpr::createOccupancy(unsigned InitOcc,
CreateExpr(InitOcc), NumSGPRs, NumVGPRs},
Ctx);
}
+
+static KnownBits fromOptionalToKnownBits(std::optional<bool> CompareResult) {
+ static constexpr unsigned BitWidth = 64;
+ const APInt True(BitWidth, 1, /*isSigned=*/false);
+ const APInt False(BitWidth, 0, /*isSigned=*/false);
+ if (CompareResult) {
+ return *CompareResult ? KnownBits::makeConstant(True)
+ : KnownBits::makeConstant(False);
+ }
+
+ KnownBits UnknownBool(/*BitWidth=*/1);
+ return UnknownBool.zext(BitWidth);
+}
+
+using KnownBitsMap = DenseMap<const MCExpr *, KnownBits>;
+void knownBitsMapHelper(const MCExpr *Expr, KnownBitsMap &KBM,
+ unsigned Depth = 0);
+
+void binaryOpKnownBitsMapHelper(const MCExpr *Expr, KnownBitsMap &KBM,
+ unsigned Depth) {
+ static constexpr unsigned BitWidth = 64;
+ const MCBinaryExpr *BExpr = cast<MCBinaryExpr>(Expr);
+ const MCExpr *LHS = BExpr->getLHS();
+ const MCExpr *RHS = BExpr->getRHS();
+
+ knownBitsMapHelper(LHS, KBM, Depth + 1);
+ knownBitsMapHelper(RHS, KBM, Depth + 1);
+ KnownBits LHSKnown = KBM[LHS];
+ KnownBits RHSKnown = KBM[RHS];
+ std::optional<bool> CompareRes;
+
+ switch (BExpr->getOpcode()) {
+ default:
+ KBM[Expr] = KnownBits(BitWidth);
+ return;
+ case MCBinaryExpr::Opcode::Add: {
+ KBM[Expr] = KnownBits::add(LHSKnown, RHSKnown);
+ return;
+ }
+ case MCBinaryExpr::Opcode::And:
+ KBM[Expr] = LHSKnown & RHSKnown;
+ return;
+ case MCBinaryExpr::Opcode::Div:
+ KBM[Expr] = KnownBits::sdiv(LHSKnown, RHSKnown);
+ return;
+ case MCBinaryExpr::Opcode::EQ:
+ CompareRes = KnownBits::eq(LHSKnown, RHSKnown);
+ KBM[Expr] = fromOptionalToKnownBits(CompareRes);
+ return;
+ case MCBinaryExpr::Opcode::NE:
+ CompareRes = KnownBits::ne(LHSKnown, RHSKnown);
+ KBM[Expr] = fromOptionalToKnownBits(CompareRes);
+ return;
+ case MCBinaryExpr::Opcode::GT:
+ CompareRes = KnownBits::sgt(LHSKnown, RHSKnown);
+ KBM[Expr] = fromOptionalToKnownBits(CompareRes);
+ return;
+ case MCBinaryExpr::Opcode::GTE:
+ CompareRes = KnownBits::sge(LHSKnown, RHSKnown);
+ KBM[Expr] = fromOptionalToKnownBits(CompareRes);
+ return;
+ case MCBinaryExpr::Opcode::LAnd: {
+ const APInt False(BitWidth, 0, /*isSigned=*/false);
----------------
arsenm wrote:
isSigned is already false?
https://github.com/llvm/llvm-project/pull/95951
More information about the llvm-commits
mailing list