diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2018-01-11 15:19:02 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2018-01-11 15:19:02 +0000 |
commit | 44993ede605ddf9602e5bd7f1ed76d332421528e (patch) | |
tree | 5ba7caa5aad2e77b41f1a53c17f834054a5cb148 | |
parent | e63d8dda5a9f39e1e636e1882ebea79ca7c53d09 (diff) | |
download | bcm5719-llvm-44993ede605ddf9602e5bd7f1ed76d332421528e.tar.gz bcm5719-llvm-44993ede605ddf9602e5bd7f1ed76d332421528e.zip |
[InstCombine] For cos/sin -> tan copy attributes from cos instead of the
parent function
Ideally we should merge the attributes from the functions somehow, but
this is obviously an improvement over taking random attributes from the
caller which will trip up the verifier if they're nonsensical for an
unary intrinsic call.
llvm-svn: 322284
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 5 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/fdiv-cos-sin.ll | 27 |
2 files changed, 18 insertions, 14 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 8abed5c14cb..aa333fdeabe 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -1494,8 +1494,9 @@ Instruction *InstCombiner::visitFDiv(BinaryOperator &I) { IRBuilder<> B(&I); IRBuilder<>::FastMathFlagGuard Guard(B); B.setFastMathFlags(I.getFastMathFlags()); - Value *Tan = emitUnaryFloatFnCall(A, TLI.getName(LibFunc_tan), - B, I.getFunction()->getAttributes()); + Value *Tan = emitUnaryFloatFnCall( + A, TLI.getName(LibFunc_tan), B, + CallSite(Op0).getCalledFunction()->getAttributes()); Value *One = ConstantFP::get(Tan->getType(), 1.0); Value *Div = B.CreateFDiv(One, Tan); return replaceInstUsesWith(I, Div); diff --git a/llvm/test/Transforms/InstCombine/fdiv-cos-sin.ll b/llvm/test/Transforms/InstCombine/fdiv-cos-sin.ll index 9dda806e30a..cc0cd9e8253 100644 --- a/llvm/test/Transforms/InstCombine/fdiv-cos-sin.ll +++ b/llvm/test/Transforms/InstCombine/fdiv-cos-sin.ll @@ -27,9 +27,9 @@ define double @fdiv_strict_cos_strict_sin_fast(double %a) { ret double %div } -define double @fdiv_fast_cos_strict_sin_strict(double %a) { +define double @fdiv_fast_cos_strict_sin_strict(double %a, i32* dereferenceable(2) %dummy) { ; CHECK-LABEL: @fdiv_fast_cos_strict_sin_strict( -; CHECK-NEXT: [[TAN:%.*]] = call fast double @tan(double [[A:%.*]]) +; CHECK-NEXT: [[TAN:%.*]] = call fast double @tan(double [[A:%.*]]) #1 ; CHECK-NEXT: [[TMP1:%.*]] = fdiv fast double 1.000000e+00, [[TAN]] ; CHECK-NEXT: ret double [[TMP1]] ; @@ -41,7 +41,7 @@ define double @fdiv_fast_cos_strict_sin_strict(double %a) { define double @fdiv_fast_cos_fast_sin_strict(double %a) { ; CHECK-LABEL: @fdiv_fast_cos_fast_sin_strict( -; CHECK-NEXT: [[TAN:%.*]] = call fast double @tan(double [[A:%.*]]) +; CHECK-NEXT: [[TAN:%.*]] = call fast double @tan(double [[A:%.*]]) #1 ; CHECK-NEXT: [[TMP1:%.*]] = fdiv fast double 1.000000e+00, [[TAN]] ; CHECK-NEXT: ret double [[TMP1]] ; @@ -68,7 +68,7 @@ define double @fdiv_cos_sin_fast_multiple_uses(double %a) { define double @fdiv_cos_sin_fast(double %a) { ; CHECK-LABEL: @fdiv_cos_sin_fast( -; CHECK-NEXT: [[TAN:%.*]] = call fast double @tan(double [[A:%.*]]) +; CHECK-NEXT: [[TAN:%.*]] = call fast double @tan(double [[A:%.*]]) #1 ; CHECK-NEXT: [[TMP1:%.*]] = fdiv fast double 1.000000e+00, [[TAN]] ; CHECK-NEXT: ret double [[TMP1]] ; @@ -80,7 +80,7 @@ define double @fdiv_cos_sin_fast(double %a) { define float @fdiv_cosf_sinf_fast(float %a) { ; CHECK-LABEL: @fdiv_cosf_sinf_fast( -; CHECK-NEXT: [[TANF:%.*]] = call fast float @tanf(float [[A:%.*]]) +; CHECK-NEXT: [[TANF:%.*]] = call fast float @tanf(float [[A:%.*]]) #1 ; CHECK-NEXT: [[TMP1:%.*]] = fdiv fast float 1.000000e+00, [[TANF]] ; CHECK-NEXT: ret float [[TMP1]] ; @@ -92,7 +92,7 @@ define float @fdiv_cosf_sinf_fast(float %a) { define fp128 @fdiv_cosfp128_sinfp128_fast(fp128 %a) { ; CHECK-LABEL: @fdiv_cosfp128_sinfp128_fast( -; CHECK-NEXT: [[TANL:%.*]] = call fast fp128 @tanl(fp128 [[A:%.*]]) +; CHECK-NEXT: [[TANL:%.*]] = call fast fp128 @tanl(fp128 [[A:%.*]]) #1 ; CHECK-NEXT: [[TMP1:%.*]] = fdiv fast fp128 0xL00000000000000003FFF000000000000, [[TANL]] ; CHECK-NEXT: ret fp128 [[TMP1]] ; @@ -102,12 +102,15 @@ define fp128 @fdiv_cosfp128_sinfp128_fast(fp128 %a) { ret fp128 %div } -declare double @llvm.cos.f64(double) -declare float @llvm.cos.f32(float) -declare fp128 @llvm.cos.fp128(fp128) +declare double @llvm.cos.f64(double) #1 +declare float @llvm.cos.f32(float) #1 +declare fp128 @llvm.cos.fp128(fp128) #1 -declare double @llvm.sin.f64(double) -declare float @llvm.sin.f32(float) -declare fp128 @llvm.sin.fp128(fp128) +declare double @llvm.sin.f64(double) #1 +declare float @llvm.sin.f32(float) #1 +declare fp128 @llvm.sin.fp128(fp128) #1 declare void @use(double) + +attributes #0 = { nounwind readnone speculatable } +attributes #1 = { nounwind readnone } |