OSDN Git Service

[InstSimplify] allow exp/log simplifications with only 'reassoc' FMF
authorSanjay Patel <spatel@rotateright.com>
Mon, 12 Feb 2018 23:51:23 +0000 (23:51 +0000)
committerSanjay Patel <spatel@rotateright.com>
Mon, 12 Feb 2018 23:51:23 +0000 (23:51 +0000)
These intrinsic folds were added with D41381, but only allowed with isFast().
That's more than necessary because FMF has 'reassoc' to apply to these
kinds of folds after D39304, and that's all we need in these cases.

Differential Revision: https://reviews.llvm.org/D43160

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@324967 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/log-exp-intrinsic.ll

index b81ecc8..43fbeb8 100644 (file)
@@ -4571,28 +4571,28 @@ static Value *SimplifyIntrinsic(Function *F, IterTy ArgBegin, IterTy ArgEnd,
     }
     case Intrinsic::exp: {
       // exp(log(x)) -> x
-      if (Q.CxtI->isFast() &&
+      if (Q.CxtI->hasAllowReassoc() &&
           match(IIOperand, m_Intrinsic<Intrinsic::log>(m_Value(X))))
         return X;
       return nullptr;
     }
     case Intrinsic::exp2: {
       // exp2(log2(x)) -> x
-      if (Q.CxtI->isFast() &&
+      if (Q.CxtI->hasAllowReassoc() &&
           match(IIOperand, m_Intrinsic<Intrinsic::log2>(m_Value(X))))
         return X;
       return nullptr;
     }
     case Intrinsic::log: {
       // log(exp(x)) -> x
-      if (Q.CxtI->isFast() &&
+      if (Q.CxtI->hasAllowReassoc() &&
           match(IIOperand, m_Intrinsic<Intrinsic::exp>(m_Value(X))))
         return X;
       return nullptr;
     }
     case Intrinsic::log2: {
       // log2(exp2(x)) -> x
-      if (Q.CxtI->isFast() &&
+      if (Q.CxtI->hasAllowReassoc() &&
           match(IIOperand, m_Intrinsic<Intrinsic::exp2>(m_Value(X)))) {
         return X;
       }
index f91e4f0..826ec42 100644 (file)
@@ -3,23 +3,25 @@
 
 declare double @llvm.log.f64(double)
 declare double @llvm.exp.f64(double)
+declare double @llvm.log2.f64(double)
+declare double @llvm.exp2.f64(double)
 
-define double @log_fast_exp_strict(double %a) {
-; CHECK-LABEL: @log_fast_exp_strict(
+define double @log_reassoc_exp_strict(double %a) {
+; CHECK-LABEL: @log_reassoc_exp_strict(
 ; CHECK-NEXT:    ret double [[A:%.*]]
 ;
   %1 = call double @llvm.exp.f64(double %a)
-  %2 = call fast double @llvm.log.f64(double %1)
+  %2 = call reassoc double @llvm.log.f64(double %1)
   ret double %2
 }
 
-define double @log_strict_exp_fast(double %a) {
-; CHECK-LABEL: @log_strict_exp_fast(
-; CHECK-NEXT:    [[TMP1:%.*]] = call fast double @llvm.exp.f64(double [[A:%.*]])
+define double @log_strict_exp_reassoc(double %a) {
+; CHECK-LABEL: @log_strict_exp_reassoc(
+; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp.f64(double [[A:%.*]])
 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]])
 ; CHECK-NEXT:    ret double [[TMP2]]
 ;
-  %1 = call fast double @llvm.exp.f64(double %a)
+  %1 = call reassoc double @llvm.exp.f64(double %a)
   %2 = call double @llvm.log.f64(double %1)
   ret double %2
 }
@@ -39,36 +41,33 @@ define double @log_exp_log_exp(double %a) {
   ret double %4
 }
 
-define double @log_exp_log_exp_fast(double %a) {
-; CHECK-LABEL: @log_exp_log_exp_fast(
+define double @log_exp_log_exp_reassoc(double %a) {
+; CHECK-LABEL: @log_exp_log_exp_reassoc(
 ; CHECK-NEXT:    ret double [[A:%.*]]
 ;
   %1 = call double @llvm.exp.f64(double %a)
-  %2 = call fast double @llvm.log.f64(double %1)
+  %2 = call reassoc double @llvm.log.f64(double %1)
   %3 = call double @llvm.exp.f64(double %2)
-  %4 = call fast double @llvm.log.f64(double %3)
+  %4 = call reassoc double @llvm.log.f64(double %3)
   ret double %4
 }
 
-declare double @llvm.log2.f64(double)
-declare double @llvm.exp2.f64(double)
-
-define double @log2_fast_exp2_strict(double %a) {
-; CHECK-LABEL: @log2_fast_exp2_strict(
+define double @log2_reassoc_exp2_strict(double %a) {
+; CHECK-LABEL: @log2_reassoc_exp2_strict(
 ; CHECK-NEXT:    ret double [[A:%.*]]
 ;
   %1 = call double @llvm.exp2.f64(double %a)
-  %2 = call fast double @llvm.log2.f64(double %1)
+  %2 = call reassoc double @llvm.log2.f64(double %1)
   ret double %2
 }
 
-define double @log2_strict_exp2_fast(double %a) {
-; CHECK-LABEL: @log2_strict_exp2_fast(
-; CHECK-NEXT:    [[TMP1:%.*]] = call fast double @llvm.exp2.f64(double [[A:%.*]])
+define double @log2_strict_exp2_reassoc(double %a) {
+; CHECK-LABEL: @log2_strict_exp2_reassoc(
+; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp2.f64(double [[A:%.*]])
 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]])
 ; CHECK-NEXT:    ret double [[TMP2]]
 ;
-  %1 = call fast double @llvm.exp2.f64(double %a)
+  %1 = call reassoc double @llvm.exp2.f64(double %a)
   %2 = call double @llvm.log2.f64(double %1)
   ret double %2
 }
@@ -88,33 +87,33 @@ define double @log2_exp2_log2_exp2(double %a) {
   ret double %4
 }
 
-define double @log2_exp2_log2_exp2_fast(double %a) {
-; CHECK-LABEL: @log2_exp2_log2_exp2_fast(
+define double @log2_exp2_log2_exp2_reassoc(double %a) {
+; CHECK-LABEL: @log2_exp2_log2_exp2_reassoc(
 ; CHECK-NEXT:    ret double [[A:%.*]]
 ;
   %1 = call double @llvm.exp2.f64(double %a)
-  %2 = call fast double @llvm.log2.f64(double %1)
+  %2 = call reassoc double @llvm.log2.f64(double %1)
   %3 = call double @llvm.exp2.f64(double %2)
-  %4 = call fast double @llvm.log2.f64(double %3)
+  %4 = call reassoc double @llvm.log2.f64(double %3)
   ret double %4
 }
 
-define double @exp_fast_log_strict(double %a) {
-; CHECK-LABEL: @exp_fast_log_strict(
+define double @exp_reassoc_log_strict(double %a) {
+; CHECK-LABEL: @exp_reassoc_log_strict(
 ; CHECK-NEXT:    ret double [[A:%.*]]
 ;
   %1 = call double @llvm.log.f64(double %a)
-  %2 = call fast double @llvm.exp.f64(double %1)
+  %2 = call reassoc double @llvm.exp.f64(double %1)
   ret double %2
 }
 
-define double @exp_strict_log_fast(double %a) {
-; CHECK-LABEL: @exp_strict_log_fast(
-; CHECK-NEXT:    [[TMP1:%.*]] = call fast double @llvm.log.f64(double [[A:%.*]])
+define double @exp_strict_log_reassoc(double %a) {
+; CHECK-LABEL: @exp_strict_log_reassoc(
+; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.log.f64(double [[A:%.*]])
 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]])
 ; CHECK-NEXT:    ret double [[TMP2]]
 ;
-  %1 = call fast double @llvm.log.f64(double %a)
+  %1 = call reassoc double @llvm.log.f64(double %a)
   %2 = call double @llvm.exp.f64(double %1)
   ret double %2
 }
@@ -134,33 +133,33 @@ define double @exp_log_exp_log(double %a) {
   ret double %4
 }
 
-define double @exp_log_exp_log_fast(double %a) {
-; CHECK-LABEL: @exp_log_exp_log_fast(
+define double @exp_log_exp_log_reassoc(double %a) {
+; CHECK-LABEL: @exp_log_exp_log_reassoc(
 ; CHECK-NEXT:    ret double [[A:%.*]]
 ;
   %1 = call double @llvm.log.f64(double %a)
-  %2 = call fast double @llvm.exp.f64(double %1)
+  %2 = call reassoc double @llvm.exp.f64(double %1)
   %3 = call double @llvm.log.f64(double %2)
-  %4 = call fast double @llvm.exp.f64(double %3)
+  %4 = call reassoc double @llvm.exp.f64(double %3)
   ret double %4
 }
 
-define double @exp2_fast_log2_strict(double %a) {
-; CHECK-LABEL: @exp2_fast_log2_strict(
+define double @exp2_reassoc_log2_strict(double %a) {
+; CHECK-LABEL: @exp2_reassoc_log2_strict(
 ; CHECK-NEXT:    ret double [[A:%.*]]
 ;
   %1 = call double @llvm.log2.f64(double %a)
-  %2 = call fast double @llvm.exp2.f64(double %1)
+  %2 = call reassoc double @llvm.exp2.f64(double %1)
   ret double %2
 }
 
-define double @exp2_strict_log2_fast(double %a) {
-; CHECK-LABEL: @exp2_strict_log2_fast(
-; CHECK-NEXT:    [[TMP1:%.*]] = call fast double @llvm.log2.f64(double [[A:%.*]])
+define double @exp2_strict_log2_reassoc(double %a) {
+; CHECK-LABEL: @exp2_strict_log2_reassoc(
+; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.log2.f64(double [[A:%.*]])
 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]])
 ; CHECK-NEXT:    ret double [[TMP2]]
 ;
-  %1 = call fast double @llvm.log2.f64(double %a)
+  %1 = call reassoc double @llvm.log2.f64(double %a)
   %2 = call double @llvm.exp2.f64(double %1)
   ret double %2
 }
@@ -180,14 +179,14 @@ define double @exp2_log2_exp2_log2(double %a) {
   ret double %4
 }
 
-define double @exp2_log2_exp2_log2_fast(double %a) {
-; CHECK-LABEL: @exp2_log2_exp2_log2_fast(
+define double @exp2_log2_exp2_log2_reassoc(double %a) {
+; CHECK-LABEL: @exp2_log2_exp2_log2_reassoc(
 ; CHECK-NEXT:    ret double [[A:%.*]]
 ;
   %1 = call double @llvm.log2.f64(double %a)
-  %2 = call fast double @llvm.exp2.f64(double %1)
+  %2 = call reassoc double @llvm.exp2.f64(double %1)
   %3 = call double @llvm.log2.f64(double %2)
-  %4 = call fast double @llvm.exp2.f64(double %3)
+  %4 = call reassoc double @llvm.exp2.f64(double %3)
   ret double %4
 }