mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-20 18:52:46 +00:00
PR2731: C and Ocaml bindings for setTailCall and isTailCall.
Based on patch by Giorgos Korfiatis. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55570 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
699609cf91
commit
07cabf6102
@ -586,6 +586,10 @@ external instruction_call_conv: llvalue -> int
|
||||
external set_instruction_call_conv: int -> llvalue -> unit
|
||||
= "llvm_set_instruction_call_conv"
|
||||
|
||||
(*--... Operations on call instructions (only) .............................--*)
|
||||
external is_tail_call : llvalue -> bool = "llvm_is_tail_call"
|
||||
external set_tail_call : bool -> llvalue -> unit = "llvm_set_tail_call"
|
||||
|
||||
(*--... Operations on phi nodes ............................................--*)
|
||||
external add_incoming : (llvalue * llbasicblock) -> llvalue -> unit
|
||||
= "llvm_add_incoming"
|
||||
|
@ -1126,6 +1126,17 @@ external instruction_call_conv: llvalue -> int
|
||||
external set_instruction_call_conv: int -> llvalue -> unit
|
||||
= "llvm_set_instruction_call_conv"
|
||||
|
||||
(** {Operations on call instructions (only)} *)
|
||||
|
||||
(** [is_tail_call ci] is [true] if the call instruction [ci] is flagged as
|
||||
eligible for tail call optimization, [false] otherwise.
|
||||
See the method [llvm::CallInst::isTailCall]. *)
|
||||
external is_tail_call : llvalue -> bool = "llvm_is_tail_call"
|
||||
|
||||
(** [set_tail_call tc ci] flags the call instruction [ci] as eligible for tail
|
||||
call optimization if [tc] is [true], clears otherwise.
|
||||
See the method [llvm::CallInst::setTailCall]. *)
|
||||
external set_tail_call : bool -> llvalue -> unit = "llvm_set_tail_call"
|
||||
|
||||
(** {7 Operations on phi nodes} *)
|
||||
|
||||
|
@ -733,6 +733,20 @@ CAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/*--... Operations on call instructions (only) .............................--*/
|
||||
|
||||
/* llvalue -> bool */
|
||||
CAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
|
||||
return Val_bool(LLVMIsTailCall(CallInst));
|
||||
}
|
||||
|
||||
/* bool -> llvalue -> unit */
|
||||
CAMLprim value llvm_set_tail_call(value IsTailCall,
|
||||
LLVMValueRef CallInst) {
|
||||
LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/*--... Operations on phi nodes ............................................--*/
|
||||
|
||||
/* (llvalue * llbasicblock) -> llvalue -> unit */
|
||||
|
@ -460,6 +460,10 @@ void LLVMRemoveInstrParamAttr(LLVMValueRef Instr, unsigned index,
|
||||
void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
|
||||
unsigned align);
|
||||
|
||||
/* Operations on call instructions (only) */
|
||||
int LLVMIsTailCall(LLVMValueRef CallInst);
|
||||
void LLVMSetTailCall(LLVMValueRef CallInst, int IsTailCall);
|
||||
|
||||
/* Operations on phi nodes */
|
||||
void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
|
||||
LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
|
||||
|
@ -963,6 +963,16 @@ void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
|
||||
ParamAttr::constructAlignmentFromInt(align)));
|
||||
}
|
||||
|
||||
/*--.. Operations on call instructions (only) ..............................--*/
|
||||
|
||||
int LLVMIsTailCall(LLVMValueRef Call) {
|
||||
return unwrap<CallInst>(Call)->isTailCall();
|
||||
}
|
||||
|
||||
void LLVMSetTailCall(LLVMValueRef Call, int isTailCall) {
|
||||
unwrap<CallInst>(Call)->setTailCall(isTailCall);
|
||||
}
|
||||
|
||||
/*--.. Operations on phi nodes .............................................--*/
|
||||
|
||||
void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
|
||||
|
@ -979,11 +979,15 @@ let test_builder () =
|
||||
* RUN: grep {Inst49.*extractelement.*Vec1.*P2} < %t.ll
|
||||
* RUN: grep {Inst50.*insertelement.*Vec1.*P1.*P2} < %t.ll
|
||||
* RUN: grep {Inst51.*shufflevector.*Vec1.*Vec2.*1.*1.*0.*0} < %t.ll
|
||||
* RUN: grep {CallInst.*tail call} < %t.ll
|
||||
*)
|
||||
let ci = build_call fn [| p2; p1 |] "CallInst" atentry in
|
||||
insist (CallConv.c = instruction_call_conv ci);
|
||||
set_instruction_call_conv 63 ci;
|
||||
insist (63 = instruction_call_conv ci);
|
||||
insist (not (is_tail_call ci));
|
||||
set_tail_call true ci;
|
||||
insist (is_tail_call ci);
|
||||
|
||||
let inst46 = build_icmp Icmp.Eq p1 p2 "Inst46" atentry in
|
||||
ignore (build_select inst46 p1 p2 "Inst47" atentry);
|
||||
|
Loading…
x
Reference in New Issue
Block a user