mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-03 09:14:30 +00:00
add a new @llvm.donothing intrinsic that, well, does nothing, and teach CodeGen to ignore calls to it
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159383 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
926dc168c8
commit
85b408991a
@ -412,6 +412,9 @@ def int_trap : Intrinsic<[], [], [IntrNoReturn]>,
|
|||||||
def int_debugtrap : Intrinsic<[]>,
|
def int_debugtrap : Intrinsic<[]>,
|
||||||
GCCBuiltin<"__builtin_debugtrap">;
|
GCCBuiltin<"__builtin_debugtrap">;
|
||||||
|
|
||||||
|
// NOP: calls/invokes to this intrinsic are removed by codegen
|
||||||
|
def int_donothing : Intrinsic<[], [], [IntrNoMem]>;
|
||||||
|
|
||||||
// Intrisics to support half precision floating point format
|
// Intrisics to support half precision floating point format
|
||||||
let Properties = [IntrNoMem] in {
|
let Properties = [IntrNoMem] in {
|
||||||
def int_convert_to_fp16 : Intrinsic<[llvm_i16_ty], [llvm_float_ty]>,
|
def int_convert_to_fp16 : Intrinsic<[llvm_i16_ty], [llvm_float_ty]>,
|
||||||
|
@ -1828,9 +1828,13 @@ void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
|
|||||||
MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)];
|
MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)];
|
||||||
|
|
||||||
const Value *Callee(I.getCalledValue());
|
const Value *Callee(I.getCalledValue());
|
||||||
|
const Function *Fn = dyn_cast<Function>(Callee);
|
||||||
if (isa<InlineAsm>(Callee))
|
if (isa<InlineAsm>(Callee))
|
||||||
visitInlineAsm(&I);
|
visitInlineAsm(&I);
|
||||||
else
|
else if (Fn && Fn->isIntrinsic()) {
|
||||||
|
assert(Fn->getIntrinsicID() == Intrinsic::donothing);
|
||||||
|
return; // ignore invokes to @llvm.donothing
|
||||||
|
} else
|
||||||
LowerCallTo(&I, getValue(Callee), false, LandingPad);
|
LowerCallTo(&I, getValue(Callee), false, LandingPad);
|
||||||
|
|
||||||
// If the value of the invoke is used outside of its defining block, make it
|
// If the value of the invoke is used outside of its defining block, make it
|
||||||
@ -5178,6 +5182,9 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|||||||
case Intrinsic::lifetime_end:
|
case Intrinsic::lifetime_end:
|
||||||
// Discard region information.
|
// Discard region information.
|
||||||
return 0;
|
return 0;
|
||||||
|
case Intrinsic::donothing:
|
||||||
|
// ignore
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
31
test/CodeGen/Generic/donothing.ll
Normal file
31
test/CodeGen/Generic/donothing.ll
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
; RUN: llc < %s | FileCheck %s
|
||||||
|
|
||||||
|
declare i32 @__gxx_personality_v0(...)
|
||||||
|
declare void @__cxa_call_unexpected(i8*)
|
||||||
|
declare void @llvm.donothing() readnone
|
||||||
|
|
||||||
|
; CHECK: f1
|
||||||
|
define void @f1() nounwind uwtable ssp {
|
||||||
|
entry:
|
||||||
|
; CHECK-NOT donothing
|
||||||
|
invoke void @llvm.donothing()
|
||||||
|
to label %invoke.cont unwind label %lpad
|
||||||
|
|
||||||
|
invoke.cont:
|
||||||
|
ret void
|
||||||
|
|
||||||
|
lpad:
|
||||||
|
%0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||||
|
filter [0 x i8*] zeroinitializer
|
||||||
|
%1 = extractvalue { i8*, i32 } %0, 0
|
||||||
|
tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
|
||||||
|
unreachable
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK: f2
|
||||||
|
define void @f2() nounwind {
|
||||||
|
entry:
|
||||||
|
; CHECK-NOT donothing
|
||||||
|
call void @llvm.donothing()
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user