From 16e08d53a0c78c149960b687c6ac735f21d5c405 Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Wed, 6 Apr 2022 17:29:13 -0400 Subject: [PATCH] Fix strict aliasing issue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `rb_id_table_lookup()` writes to a `VALUE`, which is definitely a distinct type from `st_table *`. With LTO, the compiler is allowed by N1256 ยง6.5p7 to remove the output parameter write via type-based alias analysis. See also: a0a8f2abf53 --- vm_insnhelper.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/vm_insnhelper.c b/vm_insnhelper.c index ce79c5a957..f56e01d7f7 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -4937,12 +4937,16 @@ vm_ic_compile_i(VALUE *code, VALUE insn, size_t index, void *ic) if (insn == BIN(getconstant)) { ID id = code[index + 1]; - rb_vm_t *vm = GET_VM(); - + struct rb_id_table *const_cache = GET_VM()->constant_cache; + VALUE lookup_result; st_table *ics; - if (!rb_id_table_lookup(vm->constant_cache, id, (VALUE *) &ics)) { + + if (rb_id_table_lookup(const_cache, id, &lookup_result)) { + ics = (st_table *)lookup_result; + } + else { ics = st_init_numtable(); - rb_id_table_insert(vm->constant_cache, id, (VALUE) ics); + rb_id_table_insert(const_cache, id, (VALUE)ics); } st_insert(ics, (st_data_t) ic, (st_data_t) Qtrue);