forked from OSchip/llvm-project
[TargetTransformInfo] Check if function pointer is valid before calling isLoweredToCall
Function isLoweredToCall can only accept non-null function pointer, but a function pointer can be null for indirect function call. So check it before calling isLoweredToCall from getInstructionLatency. Differential Revision: https://reviews.llvm.org/D38204 llvm-svn: 314927
This commit is contained in:
parent
2d9aa7432f
commit
eb301875b8
|
@ -188,6 +188,8 @@ public:
|
|||
}
|
||||
|
||||
bool isLoweredToCall(const Function *F) {
|
||||
assert(F && "A concrete function must be provided to this routine.");
|
||||
|
||||
// FIXME: These should almost certainly not be handled here, and instead
|
||||
// handled with the help of TLI or the target itself. This was largely
|
||||
// ported from existing analysis heuristics here so that such refactorings
|
||||
|
@ -828,7 +830,7 @@ public:
|
|||
// A real function call is much slower.
|
||||
if (auto *CI = dyn_cast<CallInst>(I)) {
|
||||
const Function *F = CI->getCalledFunction();
|
||||
if (static_cast<T *>(this)->isLoweredToCall(F))
|
||||
if (!F || static_cast<T *>(this)->isLoweredToCall(F))
|
||||
return 40;
|
||||
// Some intrinsics return a value and a flag, we use the value type
|
||||
// to decide its latency.
|
||||
|
|
|
@ -45,6 +45,10 @@ define i64 @foo(i64 %arg) {
|
|||
; CODESIZE: cost of 1 {{.*}} call
|
||||
%uadd = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 undef, i32 undef)
|
||||
|
||||
; LATENCY: cost of 40 {{.*}} call void undef
|
||||
; CODESIZE: cost of 1 {{.*}} call void undef
|
||||
call void undef()
|
||||
|
||||
; LATENCY: cost of 1 {{.*}} ret
|
||||
; CODESIZE: cost of 1 {{.*}} ret
|
||||
ret i64 undef
|
||||
|
|
Loading…
Reference in New Issue