[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:
Guozhi Wei 2017-10-04 20:14:08 +00:00
parent 2d9aa7432f
commit eb301875b8
2 changed files with 7 additions and 1 deletions

View File

@ -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.

View File

@ -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