mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-24 03:25:00 +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<[]>,
|
||||
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
|
||||
let Properties = [IntrNoMem] in {
|
||||
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)];
|
||||
|
||||
const Value *Callee(I.getCalledValue());
|
||||
const Function *Fn = dyn_cast<Function>(Callee);
|
||||
if (isa<InlineAsm>(Callee))
|
||||
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);
|
||||
|
||||
// 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:
|
||||
// Discard region information.
|
||||
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