From 458d80002db5fadd8349eac0e9724ceec097d003 Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Thu, 2 Jan 2020 22:45:40 +0300 Subject: [PATCH] Add !align 8 to all managed allocators (calls) (#18283) --- mono/mini/mini-llvm-cpp.cpp | 11 +++++++++++ mono/mini/mini-llvm-cpp.h | 3 +++ mono/mini/mini-llvm.c | 5 ++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/mono/mini/mini-llvm-cpp.cpp b/mono/mini/mini-llvm-cpp.cpp index 3c95c3e5c79..0ca6853d29e 100644 --- a/mono/mini/mini-llvm-cpp.cpp +++ b/mono/mini/mini-llvm-cpp.cpp @@ -409,6 +409,17 @@ mono_llvm_set_call_noalias_ret (LLVMValueRef wrapped_calli) dyn_cast(calli)->addAttribute (AttributeList::ReturnIndex, Attribute::NoAlias); } +void +mono_llvm_set_alignment_ret (LLVMValueRef call, int alignment) +{ + Instruction *ins = unwrap (call); + auto &ctx = ins->getContext (); + if (isa (ins)) + dyn_cast(ins)->addAttribute (AttributeList::ReturnIndex, Attribute::getWithAlignment(ctx, alignment)); + else + dyn_cast(ins)->addAttribute (AttributeList::ReturnIndex, Attribute::getWithAlignment(ctx, alignment)); +} + static Attribute::AttrKind convert_attr (AttrKind kind) { diff --git a/mono/mini/mini-llvm-cpp.h b/mono/mini/mini-llvm-cpp.h index ef56a6f3790..2ba11511c3c 100644 --- a/mono/mini/mini-llvm-cpp.h +++ b/mono/mini/mini-llvm-cpp.h @@ -135,6 +135,9 @@ void mono_llvm_set_call_noalias_ret (LLVMValueRef wrapped_calli); void +mono_llvm_set_alignment_ret (LLVMValueRef val, int alignment); + +void mono_llvm_add_func_attr (LLVMValueRef func, AttrKind kind); void diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c index f335d6caa10..3a91bdc6535 100644 --- a/mono/mini/mini-llvm.c +++ b/mono/mini/mini-llvm.c @@ -4121,8 +4121,11 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, // As per the LLVM docs, a function has a noalias return value if and only if // it is an allocation function. This is an allocation function. - if (call->method && call->method->wrapper_type == MONO_WRAPPER_ALLOC) + if (call->method && call->method->wrapper_type == MONO_WRAPPER_ALLOC) { mono_llvm_set_call_noalias_ret (lcall); + // All objects are expected to be 8-byte aligned (SGEN_ALLOC_ALIGN) + mono_llvm_set_alignment_ret (lcall, 8); + } /* * Modify cconv and parameter attributes to pass rgctx/imt correctly. -- 2.11.4.GIT