shader: share one find-first-bit lowering for S_FF0/FF1/FLBIT_I32_B64 and remove FindUMsb64

This commit is contained in:
nmzik
2026-10-21 22:39:34 +02:00
parent 6e5167598e
commit 4a1440197f
7 changed files with 27 additions and 56 deletions
@@ -118,7 +118,6 @@ VALUE_OPCODE(BitwiseNot32, U32, U32)
VALUE_OPCODE(BitReverse32, U32, U32)
VALUE_OPCODE(BitCount32, U32, U32)
VALUE_OPCODE(FindUMsb32, U32, U32)
VALUE_OPCODE(FindUMsb64, U32, U64)
VALUE_OPCODE(FindILsb32, U32, U32)
VALUE_OPCODE(SMin32, U32, U32, U32)
VALUE_OPCODE(UMin32, U32, U32, U32)
@@ -651,10 +651,15 @@ void FoldInstruction(Block& block, Block::iterator instruction,
}
return;
}
case ValueOpcode::BitCount32: {
case ValueOpcode::BitCount32:
case ValueOpcode::FindILsb32: {
const auto value = Arg(inst, 0);
if (IsImmediate(value, Type::U32)) {
Replace(inst, Value(static_cast<uint32_t>(std::popcount(value.U32()))));
const auto bits = value.U32();
Replace(inst, Value(static_cast<uint32_t>(
inst.GetOpcode() == ValueOpcode::BitCount32 ? std::popcount(bits)
: bits == 0u ? -1
: std::countr_zero(bits))));
}
return;
}
@@ -667,7 +672,9 @@ void FoldInstruction(Block& block, Block::iterator instruction,
});
return;
case ValueOpcode::UMin32:
FoldU32(inst, [](uint32_t a, uint32_t b) { return std::min(a, b); });
if (!FoldU32(inst, [](uint32_t a, uint32_t b) { return std::min(a, b); })) {
ReplaceBinaryIdentity(inst, Type::U32, ~0u);
}
return;
case ValueOpcode::UMax32:
FoldU32(inst, [](uint32_t a, uint32_t b) { return std::max(a, b); });