Index: llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp =================================================================== --- llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -1209,8 +1209,17 @@ Function *CalleeFn = BaseFn->getCalledFunction(); if (CalleeFn && TLI->getLibFunc(CalleeFn->getName(), LibFn) && (LibFn == LibFunc_exp || LibFn == LibFunc_exp2) && TLI->has(LibFn)) { + Value *ExpFn; + + // Create new exp{,2}() with the product as its argument. Value *FMul = B.CreateFMul(BaseFn->getArgOperand(0), Expo, "mul"); - return emitUnaryFloatFnCall(FMul, CalleeFn->getName(), B, Attrs); + ExpFn = emitUnaryFloatFnCall(FMul, CalleeFn->getName(), B, Attrs); + + // Erase original exp{,2}(). + BaseFn->replaceAllUsesWith(ExpFn); + BaseFn->eraseFromParent(); + + return ExpFn; } } Index: llvm/test/Transforms/InstCombine/pow-exp.ll =================================================================== --- llvm/test/Transforms/InstCombine/pow-exp.ll +++ llvm/test/Transforms/InstCombine/pow-exp.ll @@ -108,10 +108,8 @@ ret double %pow } -; FIXME: Should not result in two calls to exp2(). define double @pow_exp2_libcall(double %x, double %y) { ; CHECK-LABEL: @pow_exp2_libcall( -; CHECK-NEXT: [[CALL:%.*]] = call fast double @exp2(double [[X:%.*]]) ; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[X]], [[Y:%.*]] ; CHECK-NEXT: [[EXP2:%.*]] = call fast double @exp2(double [[MUL]]) ; CHECK-NEXT: ret double [[EXP2]]