forked from OSchip/llvm-project
[InstSimplify] allow exp/log simplifications with only 'reassoc' FMF
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 llvm-svn: 324967
This commit is contained in:
parent
02eed775c0
commit
246d769232
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue