mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
a4be43cc7e
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
193 lines
6.6 KiB
LLVM
193 lines
6.6 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
|
|
|
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_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 reassoc double @llvm.log.f64(double %1)
|
|
ret double %2
|
|
}
|
|
|
|
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 reassoc double @llvm.exp.f64(double %a)
|
|
%2 = call double @llvm.log.f64(double %1)
|
|
ret double %2
|
|
}
|
|
|
|
define double @log_exp_log_exp(double %a) {
|
|
; CHECK-LABEL: @log_exp_log_exp(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp.f64(double [[A:%.*]])
|
|
; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]])
|
|
; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp.f64(double [[TMP2]])
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.log.f64(double [[TMP3]])
|
|
; CHECK-NEXT: ret double [[TMP4]]
|
|
;
|
|
%1 = call double @llvm.exp.f64(double %a)
|
|
%2 = call double @llvm.log.f64(double %1)
|
|
%3 = call double @llvm.exp.f64(double %2)
|
|
%4 = call double @llvm.log.f64(double %3)
|
|
ret double %4
|
|
}
|
|
|
|
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 reassoc double @llvm.log.f64(double %1)
|
|
%3 = call double @llvm.exp.f64(double %2)
|
|
%4 = call reassoc double @llvm.log.f64(double %3)
|
|
ret double %4
|
|
}
|
|
|
|
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 reassoc double @llvm.log2.f64(double %1)
|
|
ret double %2
|
|
}
|
|
|
|
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 reassoc double @llvm.exp2.f64(double %a)
|
|
%2 = call double @llvm.log2.f64(double %1)
|
|
ret double %2
|
|
}
|
|
|
|
define double @log2_exp2_log2_exp2(double %a) {
|
|
; CHECK-LABEL: @log2_exp2_log2_exp2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp2.f64(double [[A:%.*]])
|
|
; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]])
|
|
; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp2.f64(double [[TMP2]])
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.log2.f64(double [[TMP3]])
|
|
; CHECK-NEXT: ret double [[TMP4]]
|
|
;
|
|
%1 = call double @llvm.exp2.f64(double %a)
|
|
%2 = call double @llvm.log2.f64(double %1)
|
|
%3 = call double @llvm.exp2.f64(double %2)
|
|
%4 = call double @llvm.log2.f64(double %3)
|
|
ret double %4
|
|
}
|
|
|
|
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 reassoc double @llvm.log2.f64(double %1)
|
|
%3 = call double @llvm.exp2.f64(double %2)
|
|
%4 = call reassoc double @llvm.log2.f64(double %3)
|
|
ret double %4
|
|
}
|
|
|
|
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 reassoc double @llvm.exp.f64(double %1)
|
|
ret double %2
|
|
}
|
|
|
|
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 reassoc double @llvm.log.f64(double %a)
|
|
%2 = call double @llvm.exp.f64(double %1)
|
|
ret double %2
|
|
}
|
|
|
|
define double @exp_log_exp_log(double %a) {
|
|
; CHECK-LABEL: @exp_log_exp_log(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log.f64(double [[A:%.*]])
|
|
; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]])
|
|
; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log.f64(double [[TMP2]])
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.exp.f64(double [[TMP3]])
|
|
; CHECK-NEXT: ret double [[TMP4]]
|
|
;
|
|
%1 = call double @llvm.log.f64(double %a)
|
|
%2 = call double @llvm.exp.f64(double %1)
|
|
%3 = call double @llvm.log.f64(double %2)
|
|
%4 = call double @llvm.exp.f64(double %3)
|
|
ret double %4
|
|
}
|
|
|
|
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 reassoc double @llvm.exp.f64(double %1)
|
|
%3 = call double @llvm.log.f64(double %2)
|
|
%4 = call reassoc double @llvm.exp.f64(double %3)
|
|
ret double %4
|
|
}
|
|
|
|
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 reassoc double @llvm.exp2.f64(double %1)
|
|
ret double %2
|
|
}
|
|
|
|
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 reassoc double @llvm.log2.f64(double %a)
|
|
%2 = call double @llvm.exp2.f64(double %1)
|
|
ret double %2
|
|
}
|
|
|
|
define double @exp2_log2_exp2_log2(double %a) {
|
|
; CHECK-LABEL: @exp2_log2_exp2_log2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log2.f64(double [[A:%.*]])
|
|
; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]])
|
|
; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log2.f64(double [[TMP2]])
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.exp2.f64(double [[TMP3]])
|
|
; CHECK-NEXT: ret double [[TMP4]]
|
|
;
|
|
%1 = call double @llvm.log2.f64(double %a)
|
|
%2 = call double @llvm.exp2.f64(double %1)
|
|
%3 = call double @llvm.log2.f64(double %2)
|
|
%4 = call double @llvm.exp2.f64(double %3)
|
|
ret double %4
|
|
}
|
|
|
|
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 reassoc double @llvm.exp2.f64(double %1)
|
|
%3 = call double @llvm.log2.f64(double %2)
|
|
%4 = call reassoc double @llvm.exp2.f64(double %3)
|
|
ret double %4
|
|
}
|
|
|