From c8eeeeaed96d7753efe1b597c1b6b68098d82c79 Mon Sep 17 00:00:00 2001 From: Max Graey Date: Mon, 26 Oct 2020 22:27:54 +0200 Subject: Сonstant value truncation during store operation (#3117) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/passes/OptimizeInstructions.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src') diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index 982f99a04..0ce1f5f95 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -826,6 +826,19 @@ struct OptimizeInstructions optimizeMemoryAccess(load->ptr, load->offset); } else if (auto* store = curr->dynCast()) { optimizeMemoryAccess(store->ptr, store->offset); + if (store->valueType.isInteger()) { + // truncates constant values during stores + // (i32|i64).store(8|16|32)(p, C) ==> + // (i32|i64).store(8|16|32)(p, C & mask) + if (auto* c = store->value->dynCast()) { + if (store->valueType == Type::i64 && store->bytes == 4) { + c->value = c->value.and_(Literal(uint64_t(0xffffffff))); + } else { + c->value = c->value.and_(Literal::makeFromInt32( + Bits::lowBitMask(store->bytes * 8), store->valueType)); + } + } + } // stores of fewer bits truncates anyhow if (auto* binary = store->value->dynCast()) { if (binary->op == AndInt32) { -- cgit v1.2.3