From 96c90c19c6febb1f12f95cbdb5f5a8fa57ec8902 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 27 Aug 2023 20:48:18 -0700 Subject: [PATCH] irjit: Reduce unnecessary shuffles. If it's never used as a Vec4 again, it's often not worth it. --- Core/MIPS/IR/IRPassSimplify.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/IR/IRPassSimplify.cpp b/Core/MIPS/IR/IRPassSimplify.cpp index ade8e5b86a..9284b61598 100644 --- a/Core/MIPS/IR/IRPassSimplify.cpp +++ b/Core/MIPS/IR/IRPassSimplify.cpp @@ -1981,6 +1981,20 @@ bool ReduceVec4Flush(const IRWriter &in, IRWriter &out, const IROptions &opts) { return false; }; + auto usedLaterAsVec4 = [&](IRReg r) { + for (int j = i + 1; j < inCount; ++j) { + IRInst inst = in.GetInstructions()[j]; + const IRMeta *m = GetIRMeta(inst.op); + if (m->types[0] == 'V' && inst.dest == r) + return true; + if (m->types[1] == 'V' && inst.src1 == r) + return true; + if (m->types[2] == 'V' && inst.src2 == r) + return true; + } + return false; + }; + switch (inst.op) { case IROp::SetConstF: if (isVec4[inst.dest & ~3] && findAvailTempVec4()) { @@ -2063,7 +2077,7 @@ bool ReduceVec4Flush(const IRWriter &in, IRWriter &out, const IROptions &opts) { case IROp::FSub: case IROp::FMul: case IROp::FDiv: - if (isVec4[inst.dest & ~3] && isVec4Dirty[inst.dest & ~3] && findAvailTempVec4()) { + if (isVec4[inst.dest & ~3] && isVec4Dirty[inst.dest & ~3] && usedLaterAsVec4(inst.dest & ~3) && findAvailTempVec4()) { u8 blendMask = 1 << (inst.dest & 3); out.Write(inst.op, temp, inst.src1, inst.src2); out.Write(IROp::Vec4Shuffle, temp, temp, 0);