Index: llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp =================================================================== --- llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -1169,7 +1169,7 @@ if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) && hasFloatVersion(Name)) - Shrunk = optimizeUnaryDoubleFP(Pow, B, true); + Shrunk = optimizeBinaryDoubleFP(Pow, B); // Propagate the math semantics from the call to any created instructions. IRBuilder<>::FastMathFlagGuard Guard(B); Index: llvm/test/Transforms/InstCombine/double-float-shrink-1.ll =================================================================== --- llvm/test/Transforms/InstCombine/double-float-shrink-1.ll +++ llvm/test/Transforms/InstCombine/double-float-shrink-1.ll @@ -344,11 +344,9 @@ ret double %call } -; FIXME: Miscompile - we dropped the 2nd argument! - define float @pow_test1(float %f, float %g) { ; CHECK-LABEL: @pow_test1( -; CHECK-NEXT: [[POWF:%.*]] = call fast float @powf(float [[F:%.*]]) +; CHECK-NEXT: [[POWF:%.*]] = call fast float @powf(float [[F:%.*]], float [[G:%.*]]) ; CHECK-NEXT: ret float [[POWF]] ; %df = fpext float %f to double @@ -358,14 +356,11 @@ ret float %fr } -; TODO: This should shrink? - define double @pow_test2(float %f, float %g) { ; CHECK-LABEL: @pow_test2( -; CHECK-NEXT: [[DF:%.*]] = fpext float [[F:%.*]] to double -; CHECK-NEXT: [[DG:%.*]] = fpext float [[G:%.*]] to double -; CHECK-NEXT: [[CALL:%.*]] = call fast double @pow(double [[DF]], double [[DG]]) -; CHECK-NEXT: ret double [[CALL]] +; CHECK-NEXT: [[POWF:%.*]] = call fast float @powf(float [[F:%.*]], float [[G:%.*]]) +; CHECK-NEXT: [[TMP1:%.*]] = fpext float [[POWF]] to double +; CHECK-NEXT: ret double [[TMP1]] ; %df = fpext float %f to double %dg = fpext float %g to double