summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2018-01-11 15:19:02 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2018-01-11 15:19:02 +0000
commit44993ede605ddf9602e5bd7f1ed76d332421528e (patch)
tree5ba7caa5aad2e77b41f1a53c17f834054a5cb148
parente63d8dda5a9f39e1e636e1882ebea79ca7c53d09 (diff)
downloadbcm5719-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.cpp5
-rw-r--r--llvm/test/Transforms/InstCombine/fdiv-cos-sin.ll27
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 }
OpenPOWER on IntegriCloud