[OCaml] Add Llvm.instr_clone.

llvm-svn: 220008
This commit is contained in:
Peter Zotov 2014-10-17 01:02:40 +00:00
parent 461cf76486
commit c5418e39bd
4 changed files with 31 additions and 0 deletions

View File

@ -955,6 +955,7 @@ external instr_pred : llvalue -> (llbasicblock, llvalue) llrev_pos
external instr_opcode : llvalue -> Opcode.t = "llvm_instr_get_opcode"
external icmp_predicate : llvalue -> Icmp.t option = "llvm_instr_icmp_predicate"
external instr_clone : llvalue -> llvalue = "llvm_instr_clone"
let rec iter_instrs_range f i e =
if i = e then () else

View File

@ -1699,6 +1699,11 @@ val instr_opcode : llvalue -> Opcode.t
instruction [i]. *)
val icmp_predicate : llvalue -> Icmp.t option
(** [inst_clone i] returns a copy of instruction [i],
The instruction has no parent, and no name.
See the method [llvm::Instruction::clone]. *)
val instr_clone : llvalue -> llvalue
(** {7 Operations on call sites} *)

View File

@ -1358,6 +1358,13 @@ CAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
CAMLreturn(Val_int(0));
}
/* llvalue -> llvalue */
CAMLprim LLVMValueRef llvm_instr_clone(LLVMValueRef Inst) {
if (!LLVMIsAInstruction(Inst))
failwith("Not an instruction");
return LLVMInstructionClone(Inst);
}
/*--... Operations on call sites ...........................................--*/

View File

@ -842,6 +842,24 @@ let test_instructions () =
insist ("One<-Two<-" = fold_right_instrs rf bb "");
dispose_module m
end;
group "clone instr";
begin
(* CHECK: %clone = add i32 %0, 2
*)
let fty = function_type void_type [| i32_type |] in
let fn = define_function "BuilderParent" fty m in
let bb = entry_block fn in
let b = builder_at_end context bb in
let p = param fn 0 in
let sum = build_add p p "sum" b in
let y = const_int i32_type 2 in
let clone = instr_clone sum in
set_operand clone 0 p;
set_operand clone 1 y;
insert_into_builder clone "clone" b;
ignore (build_ret_void b)
end