#include <llvm/IR/Module.h>
#include <llvm/IR/DIBuilder.h>
#include <llvm/IR/CallSite.h>
+#include <llvm/IR/MDBuilder.h>
#include "mini-llvm-cpp.h"
return wrap (ins);
}
+LLVMValueRef
+mono_llvm_build_weighted_branch (LLVMBuilderRef builder, LLVMValueRef cond, LLVMBasicBlockRef t, LLVMBasicBlockRef f, uint32_t t_weight, uint32_t f_weight)
+{
+ auto b = unwrap (builder);
+ auto &ctx = b->getContext ();
+ MDBuilder mdb{ctx};
+ auto weights = mdb.createBranchWeights (t_weight, f_weight);
+ auto ins = b->CreateCondBr (unwrap (cond), unwrap (t), unwrap (f), weights);
+ return wrap (ins);
+}
+
+void
+mono_llvm_set_implicit_branch (LLVMBuilderRef builder, LLVMValueRef branch)
+{
+ auto b = unwrap (builder);
+ auto &ctx = b->getContext ();
+ auto ins = unwrap<Instruction> (branch);
+ ins->setMetadata (LLVMContext::MD_make_implicit, MDNode::get (ctx, {}));
+}
+
void
mono_llvm_set_must_tailcall (LLVMValueRef call_ins)
{
LLVMValueRef
mono_llvm_build_cmpxchg (LLVMBuilderRef builder, LLVMValueRef addr, LLVMValueRef comparand, LLVMValueRef value);
+LLVMValueRef
+mono_llvm_build_weighted_branch (LLVMBuilderRef builder, LLVMValueRef cond, LLVMBasicBlockRef t, LLVMBasicBlockRef f, uint32_t t_weight, uint32_t f_weight);
+
+void
+mono_llvm_set_implicit_branch (LLVMBuilderRef builder, LLVMValueRef branch);
+
void
mono_llvm_set_must_tailcall (LLVMValueRef call_ins);
args [1] = LLVMConstInt (LLVMInt1Type (), 1, FALSE);
cmp = LLVMBuildCall (ctx->builder, get_intrins (ctx, INTRINS_EXPECT_I1), args, 2, "");
- LLVMBuildCondBr (builder, cmp, cont_bb, poll_bb);
+ mono_llvm_build_weighted_branch (builder, cmp, cont_bb, poll_bb, 64, 4);
ctx->builder = builder = create_builder (ctx);
LLVMPositionBuilderAtEnd (builder, poll_bb);