From e0eec323f2f54bcaaea41f9aa82e1cec3fdce41a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Oct 2018 17:45:33 -0400 Subject: [PATCH 1/4] constant_propagation_pass: Combine zero-extension folding code into its own function Separates the behavior from the actual switch statement and gets rid of duplication, now that we can use the general GetImmediateAsU64() function. --- src/ir_opt/constant_propagation_pass.cpp | 29 ++++++++++-------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/ir_opt/constant_propagation_pass.cpp b/src/ir_opt/constant_propagation_pass.cpp index aec32546..6cab7fc4 100644 --- a/src/ir_opt/constant_propagation_pass.cpp +++ b/src/ir_opt/constant_propagation_pass.cpp @@ -113,6 +113,15 @@ void FoldOR(IR::Inst& inst, bool is_32_bit) { inst.ReplaceUsesWith(lhs); } } + +void FoldZeroExtendXToWord(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const u64 value = inst.GetArg(0).GetImmediateAsU64(); + inst.ReplaceUsesWith(IR::Value{static_cast(value)}); +} } // Anonymous namespace void ConstantPropagation(IR::Block& block) { @@ -154,24 +163,10 @@ void ConstantPropagation(IR::Block& block) { case IR::Opcode::Not64: FoldNOT(inst, opcode == IR::Opcode::Not32); break; - case IR::Opcode::ZeroExtendByteToWord: { - if (!inst.AreAllArgsImmediates()) - break; - - u8 byte = inst.GetArg(0).GetU8(); - u32 value = static_cast(byte); - inst.ReplaceUsesWith(IR::Value{value}); + case IR::Opcode::ZeroExtendByteToWord: + case IR::Opcode::ZeroExtendHalfToWord: + FoldZeroExtendXToWord(inst); break; - } - case IR::Opcode::ZeroExtendHalfToWord: { - if (!inst.AreAllArgsImmediates()) - break; - - u16 half = inst.GetArg(0).GetU16(); - u32 value = static_cast(half); - inst.ReplaceUsesWith(IR::Value{value}); - break; - } default: break; } From f47c5e4edef70397194a255f21dde38412586a04 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Oct 2018 18:00:15 -0400 Subject: [PATCH 2/4] constant_propagation_pass: Fold ZeroExtend{Type}ToLong opcodes if possible These are equivalent to the ZeroExtendXToWord variants, so we can trivially do this as well. --- src/ir_opt/constant_propagation_pass.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ir_opt/constant_propagation_pass.cpp b/src/ir_opt/constant_propagation_pass.cpp index 6cab7fc4..037f522e 100644 --- a/src/ir_opt/constant_propagation_pass.cpp +++ b/src/ir_opt/constant_propagation_pass.cpp @@ -122,6 +122,15 @@ void FoldZeroExtendXToWord(IR::Inst& inst) { const u64 value = inst.GetArg(0).GetImmediateAsU64(); inst.ReplaceUsesWith(IR::Value{static_cast(value)}); } + +void FoldZeroExtendXToLong(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const u64 value = inst.GetArg(0).GetImmediateAsU64(); + inst.ReplaceUsesWith(IR::Value{value}); +} } // Anonymous namespace void ConstantPropagation(IR::Block& block) { @@ -167,6 +176,11 @@ void ConstantPropagation(IR::Block& block) { case IR::Opcode::ZeroExtendHalfToWord: FoldZeroExtendXToWord(inst); break; + case IR::Opcode::ZeroExtendByteToLong: + case IR::Opcode::ZeroExtendHalfToLong: + case IR::Opcode::ZeroExtendWordToLong: + FoldZeroExtendXToLong(inst); + break; default: break; } From 4f03ca65a0ebe737a619866d96df4c570d8a7e1f Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Oct 2018 18:08:16 -0400 Subject: [PATCH 3/4] constant_propagation_pass: Fold SignExtend{Type}ToWord opcodes if possible --- src/ir_opt/constant_propagation_pass.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/ir_opt/constant_propagation_pass.cpp b/src/ir_opt/constant_propagation_pass.cpp index 037f522e..10f1d720 100644 --- a/src/ir_opt/constant_propagation_pass.cpp +++ b/src/ir_opt/constant_propagation_pass.cpp @@ -114,6 +114,15 @@ void FoldOR(IR::Inst& inst, bool is_32_bit) { } } +void FoldSignExtendXToWord(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const s64 value = inst.GetArg(0).GetImmediateAsS64(); + inst.ReplaceUsesWith(IR::Value{static_cast(value)}); +} + void FoldZeroExtendXToWord(IR::Inst& inst) { if (!inst.AreAllArgsImmediates()) { return; @@ -172,6 +181,10 @@ void ConstantPropagation(IR::Block& block) { case IR::Opcode::Not64: FoldNOT(inst, opcode == IR::Opcode::Not32); break; + case IR::Opcode::SignExtendByteToWord: + case IR::Opcode::SignExtendHalfToWord: + FoldSignExtendXToWord(inst); + break; case IR::Opcode::ZeroExtendByteToWord: case IR::Opcode::ZeroExtendHalfToWord: FoldZeroExtendXToWord(inst); From f1d907c9806b3ea42fa7d5f149ffe0a9b148d35b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Oct 2018 18:14:56 -0400 Subject: [PATCH 4/4] constant_propagation_pass: Fold SignExtend{Type}ToLong opcodes if possible --- src/ir_opt/constant_propagation_pass.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ir_opt/constant_propagation_pass.cpp b/src/ir_opt/constant_propagation_pass.cpp index 10f1d720..a8018711 100644 --- a/src/ir_opt/constant_propagation_pass.cpp +++ b/src/ir_opt/constant_propagation_pass.cpp @@ -123,6 +123,15 @@ void FoldSignExtendXToWord(IR::Inst& inst) { inst.ReplaceUsesWith(IR::Value{static_cast(value)}); } +void FoldSignExtendXToLong(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const s64 value = inst.GetArg(0).GetImmediateAsS64(); + inst.ReplaceUsesWith(IR::Value{static_cast(value)}); +} + void FoldZeroExtendXToWord(IR::Inst& inst) { if (!inst.AreAllArgsImmediates()) { return; @@ -185,6 +194,11 @@ void ConstantPropagation(IR::Block& block) { case IR::Opcode::SignExtendHalfToWord: FoldSignExtendXToWord(inst); break; + case IR::Opcode::SignExtendByteToLong: + case IR::Opcode::SignExtendHalfToLong: + case IR::Opcode::SignExtendWordToLong: + FoldSignExtendXToLong(inst); + break; case IR::Opcode::ZeroExtendByteToWord: case IR::Opcode::ZeroExtendHalfToWord: FoldZeroExtendXToWord(inst);