From ef155e63ca5dc6fe005365c0e283232a7c334838 Mon Sep 17 00:00:00 2001 From: Jay Foad Date: Thu, 14 Mar 2024 11:47:45 +0000 Subject: [PATCH 1/2] [APInt] Simplify APIntOps::avgFloorS etc. NFC. Removing the extension to FullWidth should make them much more efficient in the 64-bit case, because 65-bit APInts use a separate allocation for their bits. --- llvm/lib/Support/APInt.cpp | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index 7053f3b87682f..371d42b221ed6 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -3096,37 +3096,21 @@ void llvm::LoadIntFromMemory(APInt &IntVal, const uint8_t *Src, } APInt APIntOps::avgFloorS(const APInt &C1, const APInt &C2) { - // Return floor((C1 + C2)/2) - assert(C1.getBitWidth() == C2.getBitWidth() && "Unequal bitwidths"); - unsigned FullWidth = C1.getBitWidth() + 1; - APInt C1Ext = C1.sext(FullWidth); - APInt C2Ext = C2.sext(FullWidth); - return (C1Ext + C2Ext).extractBits(C1.getBitWidth(), 1); + // Return floor((C1 + C2) / 2) + return (C1 & C2) + (C1 ^ C2).ashr(1); } APInt APIntOps::avgFloorU(const APInt &C1, const APInt &C2) { - // Return floor((C1 + C2)/2) - assert(C1.getBitWidth() == C2.getBitWidth() && "Unequal bitwidths"); - unsigned FullWidth = C1.getBitWidth() + 1; - APInt C1Ext = C1.zext(FullWidth); - APInt C2Ext = C2.zext(FullWidth); - return (C1Ext + C2Ext).extractBits(C1.getBitWidth(), 1); + // Return floor((C1 + C2) / 2) + return (C1 & C2) + (C1 ^ C2).lshr(1); } APInt APIntOps::avgCeilS(const APInt &C1, const APInt &C2) { - // Return ceil((C1 + C2)/2) - assert(C1.getBitWidth() == C2.getBitWidth() && "Unequal bitwidths"); - unsigned FullWidth = C1.getBitWidth() + 1; - APInt C1Ext = C1.sext(FullWidth); - APInt C2Ext = C2.sext(FullWidth); - return (C1Ext + C2Ext + 1).extractBits(C1.getBitWidth(), 1); + // Return ceil((C1 + C2) / 2) + return (C1 | C2) - (C1 ^ C2).ashr(1); } APInt APIntOps::avgCeilU(const APInt &C1, const APInt &C2) { - // Return ceil((C1 + C2)/2) - assert(C1.getBitWidth() == C2.getBitWidth() && "Unequal bitwidths"); - unsigned FullWidth = C1.getBitWidth() + 1; - APInt C1Ext = C1.zext(FullWidth); - APInt C2Ext = C2.zext(FullWidth); - return (C1Ext + C2Ext + 1).extractBits(C1.getBitWidth(), 1); + // Return ceil((C1 + C2) / 2) + return (C1 | C2) - (C1 ^ C2).ashr(1); } From ca33cac3eb864d4a8b63d8ea89522fa559f2b4ad Mon Sep 17 00:00:00 2001 From: Jay Foad Date: Thu, 14 Mar 2024 12:04:36 +0000 Subject: [PATCH 2/2] Fix the deliberate mistake --- llvm/lib/Support/APInt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index 371d42b221ed6..c530f7b78e186 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -3112,5 +3112,5 @@ APInt APIntOps::avgCeilS(const APInt &C1, const APInt &C2) { APInt APIntOps::avgCeilU(const APInt &C1, const APInt &C2) { // Return ceil((C1 + C2) / 2) - return (C1 | C2) - (C1 ^ C2).ashr(1); + return (C1 | C2) - (C1 ^ C2).lshr(1); }