Skip to content

Commit

Permalink
[SimplifyLibCalls] fix crash with empty function name (PR43347)
Browse files Browse the repository at this point in the history
...and improve some variable names while here.

https://bugs.llvm.org/show_bug.cgi?id=43347

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372227 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rotateright committed Sep 18, 2019
1 parent cd206b7 commit e700dd9
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 15 deletions.
27 changes: 12 additions & 15 deletions lib/Transforms/Utils/SimplifyLibCalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1258,21 +1258,18 @@ static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,
if (!V[0] || (isBinary && !V[1]))
return nullptr;

StringRef CalleeNm = CalleeFn->getName();
AttributeList CalleeAt = CalleeFn->getAttributes();
bool CalleeIn = CalleeFn->isIntrinsic();

// If call isn't an intrinsic, check that it isn't within a function with the
// same name as the float version of this call, otherwise the result is an
// infinite loop. For example, from MinGW-w64:
//
// float expf(float val) { return (float) exp((double) val); }
if (!CalleeIn) {
const Function *Fn = CI->getFunction();
StringRef FnName = Fn->getName();
if (FnName.back() == 'f' &&
FnName.size() == (CalleeNm.size() + 1) &&
FnName.startswith(CalleeNm))
StringRef CalleeName = CalleeFn->getName();
bool IsIntrinsic = CalleeFn->isIntrinsic();
if (!IsIntrinsic) {
StringRef CallerName = CI->getFunction()->getName();
if (!CallerName.empty() && CallerName.back() == 'f' &&
CallerName.size() == (CalleeName.size() + 1) &&
CallerName.startswith(CalleeName))
return nullptr;
}

Expand All @@ -1282,16 +1279,16 @@ static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,

// g((double) float) -> (double) gf(float)
Value *R;
if (CalleeIn) {
if (IsIntrinsic) {
Module *M = CI->getModule();
Intrinsic::ID IID = CalleeFn->getIntrinsicID();
Function *Fn = Intrinsic::getDeclaration(M, IID, B.getFloatTy());
R = isBinary ? B.CreateCall(Fn, V) : B.CreateCall(Fn, V[0]);
} else {
AttributeList CalleeAttrs = CalleeFn->getAttributes();
R = isBinary ? emitBinaryFloatFnCall(V[0], V[1], CalleeName, B, CalleeAttrs)
: emitUnaryFloatFnCall(V[0], CalleeName, B, CalleeAttrs);
}
else
R = isBinary ? emitBinaryFloatFnCall(V[0], V[1], CalleeNm, B, CalleeAt)
: emitUnaryFloatFnCall(V[0], CalleeNm, B, CalleeAt);

return B.CreateFPExt(R, B.getDoubleTy());
}

Expand Down
12 changes: 12 additions & 0 deletions test/Transforms/InstCombine/sqrt.ll
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,17 @@ define float @test3(float* %v) nounwind uwtable ssp {
ret float %conv38
}

; PR43347 - https://bugs.llvm.org/show_bug.cgi?id=43347

define void @0(float %f) {
; CHECK-LABEL: @0(
; CHECK-NEXT: [[SQRTF:%.*]] = call float @sqrtf(float [[F:%.*]]) #2
; CHECK-NEXT: ret void
;
%d = fpext float %f to double
%r = call double @sqrt(double %d)
ret void
}

declare i32 @foo(double)
declare double @sqrt(double) readnone

0 comments on commit e700dd9

Please sign in to comment.