[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
Sun Oct 13 23:20:56 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 don't think the consideration of doesNotAccessMemory belongs down in ConstantFoldFP. It should produce the constant folded value regardless of the side effects. The legality of ignoring the side effects is context dependent
https://github.com/llvm/llvm-project/pull/112113
More information about the llvm-commits
mailing list