shader_ir: Pass decoded nodes as a whole instead of per basic blocks

Some games call LDG at the top of a basic block, making the tracking
heuristic to fail. This commit lets the heuristic the decoded nodes as a
whole instead of per basic blocks.

This may lead to some false positives but allows it the heuristic to
track cases it previously couldn't.
This commit is contained in:
ReinUsesLisp
2019-01-30 01:56:33 -03:00
parent eceab45dac
commit 6a6fabea58
27 changed files with 62 additions and 57 deletions

View File

@ -591,31 +591,31 @@ private:
*/
u32 DecodeInstr(BasicBlock& bb, u32 pc);
u32 DecodeArithmetic(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeArithmeticImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeBfe(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeBfi(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeShift(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeArithmeticInteger(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeArithmeticIntegerImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeArithmeticHalf(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeArithmeticHalfImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeFfma(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeHfma2(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeConversion(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeFloatSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeIntegerSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeHalfSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodePredicateSetRegister(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodePredicateSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeRegisterSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeFloatSet(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeIntegerSet(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeHalfSet(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeVideo(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeXmad(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeOther(BasicBlock& bb, const BasicBlock& code, u32 pc);
u32 DecodeArithmetic(BasicBlock& bb, u32 pc);
u32 DecodeArithmeticImmediate(BasicBlock& bb, u32 pc);
u32 DecodeBfe(BasicBlock& bb, u32 pc);
u32 DecodeBfi(BasicBlock& bb, u32 pc);
u32 DecodeShift(BasicBlock& bb, u32 pc);
u32 DecodeArithmeticInteger(BasicBlock& bb, u32 pc);
u32 DecodeArithmeticIntegerImmediate(BasicBlock& bb, u32 pc);
u32 DecodeArithmeticHalf(BasicBlock& bb, u32 pc);
u32 DecodeArithmeticHalfImmediate(BasicBlock& bb, u32 pc);
u32 DecodeFfma(BasicBlock& bb, u32 pc);
u32 DecodeHfma2(BasicBlock& bb, u32 pc);
u32 DecodeConversion(BasicBlock& bb, u32 pc);
u32 DecodeMemory(BasicBlock& bb, u32 pc);
u32 DecodeFloatSetPredicate(BasicBlock& bb, u32 pc);
u32 DecodeIntegerSetPredicate(BasicBlock& bb, u32 pc);
u32 DecodeHalfSetPredicate(BasicBlock& bb, u32 pc);
u32 DecodePredicateSetRegister(BasicBlock& bb, u32 pc);
u32 DecodePredicateSetPredicate(BasicBlock& bb, u32 pc);
u32 DecodeRegisterSetPredicate(BasicBlock& bb, u32 pc);
u32 DecodeFloatSet(BasicBlock& bb, u32 pc);
u32 DecodeIntegerSet(BasicBlock& bb, u32 pc);
u32 DecodeHalfSet(BasicBlock& bb, u32 pc);
u32 DecodeVideo(BasicBlock& bb, u32 pc);
u32 DecodeXmad(BasicBlock& bb, u32 pc);
u32 DecodeOther(BasicBlock& bb, u32 pc);
/// Internalizes node's data and returns a managed pointer to a clone of that node
Node StoreNode(NodeData&& node_data);
@ -804,6 +804,7 @@ private:
std::map<std::pair<u32, u32>, ExitMethod> exit_method_map;
std::map<u32, BasicBlock> basic_blocks;
BasicBlock global_code;
std::vector<std::unique_ptr<NodeData>> stored_nodes;