From a6bb2b5a7cf36e074e12ccaed32990b437deb784 Mon Sep 17 00:00:00 2001 From: pcpa Date: Thu, 9 Jan 2025 13:08:08 -0300 Subject: Fix incorrect optimization on a load/followed by a store The logic was not expecting using memory to zero or sign extend a value. To keep the original intent of the optimization, only loads followed by a store of a wordsize value are kept, to prevent too many noops by some code generation/translation tool. --- lib/lightning.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'lib/lightning.c') diff --git a/lib/lightning.c b/lib/lightning.c index 643c5f1..656e5f7 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -3817,12 +3817,13 @@ _simplify_stxi(jit_state_t *_jit, jit_node_t *prev, jit_node_t *node) if (value->kind == 0) { switch (node->code) { /* no information about signed/unsigned either */ - case jit_code_stxi_c: value->code = jit_code_ldxi_c; break; - case jit_code_stxi_s: value->code = jit_code_ldxi_s; break; +#if __WORDSIZE == 32 case jit_code_stxi_i: value->code = jit_code_ldxi_i; break; - case jit_code_stxi_l: value->code = jit_code_ldxi_l; break; case jit_code_stxi_f: value->code = jit_code_ldxi_f; break; +#else + case jit_code_stxi_l: value->code = jit_code_ldxi_l; break; case jit_code_stxi_d: value->code = jit_code_ldxi_d; break; +#endif default: abort(); } value->kind = jit_kind_code; @@ -3943,20 +3944,26 @@ _simplify(jit_state_t *_jit) simplify_spill(node = prev, regno); } break; - case jit_code_ldxi_c: case jit_code_ldxi_uc: - case jit_code_ldxi_s: case jit_code_ldxi_us: - case jit_code_ldxi_i: case jit_code_ldxi_ui: +#if __WORDSIZE == 32 + case jit_code_ldxi_i: + case jit_code_ldxi_f: +#else case jit_code_ldxi_l: - case jit_code_ldxi_f: case jit_code_ldxi_d: + case jit_code_ldxi_d: +#endif regno = jit_regno(node->u.w); if (simplify_ldxi(prev, node)) { result = 1; simplify_spill(node = prev, regno); } break; - case jit_code_stxi_c: case jit_code_stxi_s: - case jit_code_stxi_i: case jit_code_stxi_l: - case jit_code_stxi_f: case jit_code_stxi_d: +#if __WORDSIZE == 32 + case jit_code_stxi_i: + case jit_code_stxi_f: +#else + case jit_code_stxi_l: + case jit_code_stxi_d: +#endif regno = jit_regno(node->u.w); if (simplify_stxi(prev, node)) { result = 1; -- cgit v1.2.3

AltStyle によって変換されたページ (->オリジナル) /