From 43f078aedc88dc707e34b8c283b8ac59714d1a50 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 12 Aug 2026 14:52:37 +0100 Subject: [PATCH] Infer `asm #side_effects` where possible from the mnemonics --- .../isa/x86/tablegen/cpp-compiler/cpp-gen.odin | 13 ++++++++++++- src/asm_tables_amd64.cpp | 13 ++++++++++++- src/llvm_backend_asm.cpp | 9 +++------ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/core/rexcode/isa/x86/tablegen/cpp-compiler/cpp-gen.odin b/core/rexcode/isa/x86/tablegen/cpp-compiler/cpp-gen.odin index cb23e4666..e6a8a863f 100644 --- a/core/rexcode/isa/x86/tablegen/cpp-compiler/cpp-gen.odin +++ b/core/rexcode/isa/x86/tablegen/cpp-compiler/cpp-gen.odin @@ -200,7 +200,18 @@ main :: proc() { strings.write_string(&sb, "\t\t\t\t SideEffectFlag_SERIALIZING)) != 0;\n") strings.write_string(&sb, "\t\t}\n") strings.write_string(&sb, "\t\tbool implies_side_effects() {\n") - strings.write_string(&sb, "\t\t\treturn side_effects;\n") + strings.write_string(&sb, "\t\t\tu16 const VOLATILE_SE =\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_FENCE |\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_SERIALIZING |\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CACHE |\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_TRAP |\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_INTERRUPT |\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_HALT |\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_PRIVILEGED |\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CONTROL |\n") + strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CET;\n") + strings.write_string(&sb, "\t\t\t\t// NOTE: SideEffectFlag_HINT deliberately excluded — inert, may be DCE'd.\n") + strings.write_string(&sb, "\t\t\treturn ((side_effects & VOLATILE_SE) != 0);\n") strings.write_string(&sb, "\t\t}\n") strings.write_string(&sb, "\t};\n") } diff --git a/src/asm_tables_amd64.cpp b/src/asm_tables_amd64.cpp index f35abb5d3..8151ad8a4 100644 --- a/src/asm_tables_amd64.cpp +++ b/src/asm_tables_amd64.cpp @@ -205,7 +205,18 @@ struct Asm_amd64 { SideEffectFlag_SERIALIZING)) != 0; } bool implies_side_effects() { - return side_effects; + u16 const VOLATILE_SE = + SideEffectFlag_FENCE | + SideEffectFlag_SERIALIZING | + SideEffectFlag_CACHE | + SideEffectFlag_TRAP | + SideEffectFlag_INTERRUPT | + SideEffectFlag_HALT | + SideEffectFlag_PRIVILEGED | + SideEffectFlag_CONTROL | + SideEffectFlag_CET; + // NOTE: SideEffectFlag_HINT deliberately excluded — inert, may be DCE'd. + return ((side_effects & VOLATILE_SE) != 0); } }; diff --git a/src/llvm_backend_asm.cpp b/src/llvm_backend_asm.cpp index 1803489b9..406622921 100644 --- a/src/llvm_backend_asm.cpp +++ b/src/llvm_backend_asm.cpp @@ -480,21 +480,18 @@ struct lbAsmGenerate_amd64 : lbAsmGenerate { LLVMTypeRef fn_ty = LLVMFunctionType(ret_ty, param_types.data, cast(unsigned)param_types.count, /*vararg*/false); - // TODO(bill): determine all the cases when side-effects happen - bool has_side_effects = tmpl_node->has_side_effects; - LLVMValueRef ia = LLVMGetInlineAsm( fn_ty, asm_string, cast(size_t)gb_string_length(asm_string), constraints, cast(size_t)gb_string_length(constraints), - /*HasSideEffects*/ has_side_effects, - /*IsAlignStack*/ tmpl_node->is_align_stack, + /*HasSideEffects*/ tmpl_entity->AsmTemplate.has_side_effects, + /*IsAlignStack*/ tmpl_entity->AsmTemplate.is_align_stack, LLVMInlineAsmDialectATT, /*CanThrow*/ false); LLVMValueRef call = LLVMBuildCall2(p->builder, fn_ty, ia, call_args.data, cast(unsigned)call_args.count, ""); - if (false) { + if (true) { // DEBUG PRINT!!! // DEBUG PRINT!!! // DEBUG PRINT!!!