[llvm] [ConstantFold] Fold `log1p` and `log1pf` when the input parameter is a constant value. (PR #112113)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 14 08:18:20 PDT 2024
================
@@ -0,0 +1,113 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
+
+define float @log1pf_const() {
+; CHECK-LABEL: define float @log1pf_const() {
+; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 7.000000e+00)
+; CHECK-NEXT: ret float 0x4000A2B240000000
+;
+ %r = call float @log1pf(float 7.000000e+00)
+ ret float %r
+}
+
+define double @log1p_const() {
+; CHECK-LABEL: define double @log1p_const() {
+; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 7.000000e+00)
+; CHECK-NEXT: ret double 0x4000A2B23F3BAB73
+;
+ %r = call double @log1p(double 7.000000e+00)
+ ret double %r
+}
+
+define float @log1pf_minus_one() {
+; CHECK-LABEL: define float @log1pf_minus_one() {
+; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float -1.000000e+00)
+; CHECK-NEXT: ret float [[R]]
+;
+ %r = call float @log1pf(float -1.000000e+00)
+ ret float %r
+}
+
+define double @log1p_minus_one() {
+; CHECK-LABEL: define double @log1p_minus_one() {
+; CHECK-NEXT: [[R:%.*]] = call double @log1p(double -1.000000e+00)
+; CHECK-NEXT: ret double [[R]]
+;
+ %r = call double @log1p(double -1.000000e+00)
+ ret double %r
+}
+
+define float @log1pf_zero() {
+; CHECK-LABEL: define float @log1pf_zero() {
+; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0.000000e+00)
+; CHECK-NEXT: ret float 0.000000e+00
+;
+ %r = call float @log1pf(float 0.000000e+00)
+ ret float %r
+}
+
+define double @log1p_zero() {
+; CHECK-LABEL: define double @log1p_zero() {
+; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0.000000e+00)
+; CHECK-NEXT: ret double 0.000000e+00
+;
+ %r = call double @log1p(double 0.000000e+00)
+ ret double %r
+}
+
+define float @log1pf_inf() {
+; CHECK-LABEL: define float @log1pf_inf() {
+; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0x7FF0000000000000)
+; CHECK-NEXT: ret float [[R]]
+;
+ %r = call float @log1pf(float 0x7FF0000000000000)
+ ret float %r
+}
+
+define double @log1p_inf() {
+; CHECK-LABEL: define double @log1p_inf() {
+; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0x7FF0000000000000)
+; CHECK-NEXT: ret double [[R]]
+;
+ %r = call double @log1p(double 0x7FF0000000000000)
+ ret double %r
+}
+
+define float @log1pf_nan() {
+; CHECK-LABEL: define float @log1pf_nan() {
+; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0x7FF8000000000000)
+; CHECK-NEXT: ret float [[R]]
+;
+ %r = call float @log1pf(float 0x7FF8000000000000)
+ ret float %r
+}
+
+define double @log1p_nan() {
+; CHECK-LABEL: define double @log1p_nan() {
+; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0x7FF8000000000000)
+; CHECK-NEXT: ret double [[R]]
+;
+ %r = call double @log1p(double 0x7FF8000000000000)
+ ret double %r
+}
+
+define float @log1pf_poison() {
+; CHECK-LABEL: define float @log1pf_poison() {
+; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float poison)
+; CHECK-NEXT: ret float [[R]]
+;
+ %r = call float @log1pf(float poison)
+ ret float %r
+}
+
+define double @log1p_poison() {
+; CHECK-LABEL: define double @log1p_poison() {
+; CHECK-NEXT: [[R:%.*]] = call double @log1p(double poison)
+; CHECK-NEXT: ret double [[R]]
+;
+ %r = call double @log1p(double poison)
+ ret double %r
+}
+
----------------
arsenm wrote:
I would consider that a defect of implementation. The separation of concerns should yield the result. If we wanted, we could produce a side piece of information for raised errors. Whether or not you care if an error occurred depend on the callsite (i.e we can ignore any exceptions in default FP environment, and memory(none) callsites can ignore errno writes)
https://github.com/llvm/llvm-project/pull/112113
More information about the llvm-commits
mailing list