From c2072c3f7c96eed6abbc7901c181bec92e3b9ced Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 6 Sep 2016 16:14:13 -0700 Subject: optimize loads+shifts into signed loads --- src/passes/OptimizeInstructions.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src') diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index 2a5e7b8c4..003d2ff60 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -168,6 +168,12 @@ struct OptimizeInstructions : public WalkerPasspatternMap.find(curr->_id); if (iter == database->patternMap.end()) return; auto& patterns = iter->second; @@ -184,6 +190,27 @@ struct OptimizeInstructions : public WalkerPassdynCast()) { + // pattern match a load of 8 bits and a sign extend using a shl of 24 then shr_s of 24 as well, etc. + if (binary->op == BinaryOp::ShrSInt32 && binary->right->is()) { + auto shifts = binary->right->cast()->value.geti32(); + if (shifts == 24 || shifts == 16) { + auto* left = binary->left->dynCast(); + if (left && left->op == ShlInt32 && left->right->is() && left->right->cast()->value.geti32() == shifts) { + auto* load = left->left->dynCast(); + if (load && ((load->bytes == 1 && shifts == 24) || (load->bytes == 2 && shifts == 16))) { + load->signed_ = true; + return load; + } + } + } + } + } + return nullptr; + } }; Pass *createOptimizeInstructionsPass() { -- cgit v1.2.3