[llvm] [ConstantFolding] Add edge cases for llvm.log{, 2, 10} (PR #173304)
Stefan Weigl-Bosker via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 23 13:28:58 PST 2025
https://github.com/sweiglbosker updated https://github.com/llvm/llvm-project/pull/173304
>From 73cf37d935e9e612b98c8148aa77fe845ea5c793 Mon Sep 17 00:00:00 2001
From: Stefan Weigl-Bosker <stefan at s00.xyz>
Date: Mon, 22 Dec 2025 15:11:43 -0500
Subject: [PATCH 1/4] [ConstantFolding] Fold llvm.log{,2,10} in cases where
libm errors
---
llvm/lib/Analysis/ConstantFolding.cpp | 18 +++
.../InstSimplify/ConstProp/calls.ll | 104 ++++++++++++++++++
2 files changed, 122 insertions(+)
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index a9b51065a1d99..7586b88bedb2f 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2719,11 +2719,29 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
switch (IntrinsicID) {
default: break;
case Intrinsic::log:
+ if (U.isZero())
+ return ConstantFP::getInfinity(Ty, true);
+ if (U.isNegative())
+ return ConstantFP::getNaN(Ty);
+ if (U.isExactlyValue(1))
+ return ConstantFP::getZero(Ty);
return ConstantFoldFP(log, APF, Ty);
case Intrinsic::log2:
+ if (U.isZero())
+ return ConstantFP::getInfinity(Ty, true);
+ if (U.isNegative())
+ return ConstantFP::getNaN(Ty);
+ if (U.isExactlyValue(1))
+ return ConstantFP::getZero(Ty);
// TODO: What about hosts that lack a C99 library?
return ConstantFoldFP(log2, APF, Ty);
case Intrinsic::log10:
+ if (U.isZero())
+ return ConstantFP::getInfinity(Ty, true);
+ if (U.isNegative())
+ return ConstantFP::getNaN(Ty);
+ if (U.isExactlyValue(1))
+ return ConstantFP::getZero(Ty);
// TODO: What about hosts that lack a C99 library?
return ConstantFoldFP(log10, APF, Ty);
case Intrinsic::exp:
diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/calls.ll b/llvm/test/Transforms/InstSimplify/ConstProp/calls.ll
index 26fb8c0d7a1c6..2fd3880f4b278 100644
--- a/llvm/test/Transforms/InstSimplify/ConstProp/calls.ll
+++ b/llvm/test/Transforms/InstSimplify/ConstProp/calls.ll
@@ -214,5 +214,109 @@ entry:
ret float %1
}
+define float @test_intrinsic_log() {
+entry:
+; CHECK-LABEL: @test_intrinsic_log(
+ %v = alloca <3 x float>
+ %f = alloca float
+
+; log(0.0) -> -inf
+; CHECK-NOT: call
+; CHECK: store float 0xFFF0000000000000
+ %1 = call float @llvm.log.f32(float 0.0)
+ store float %1, ptr %f
+
+; log(-0.0) -> -inf
+; CHECK-NOT: call
+; CHECK: store float 0xFFF0000000000000
+ %2 = call float @llvm.log.f32(float -0.0)
+ store float %2, ptr %f
+
+; log(-x) -> NaN
+; CHECK-NOT: call
+; CHECK: store float 0x7FF8000000000000
+ %3 = call float @llvm.log.f32(float -20.0)
+ store float %3, ptr %f
+
+; log(1.0) -> 0.0
+; CHECK-NOT: call
+; CHECK: store float 0.000000e+00
+ %4 = call float @llvm.log.f32(float 1.0)
+ store float %4, ptr %f
+
+; CHECK-NOT: call
+; CHECK: store <3 x float> <float 0xFFF0000000000000, float 0x7FF8000000000000, float 0.000000e+00>
+ %5 = call <3 x float> @llvm.log.v4f32(<3 x float> <float 0.0, float -6.0, float 1.0>)
+ store <3 x float> %5, ptr %v
+
+ ret float %1
+}
+
+define float @test_intrinsic_log2() {
+entry:
+; CHECK-LABEL: @test_intrinsic_log2(
+ %v = alloca <3 x float>
+ %f = alloca float
+
+; log2(0.0) -> -inf
+; CHECK: store float 0xFFF0000000000000
+ %1 = call float @llvm.log2.f32(float 0.0)
+ store float %1, ptr %f
+
+; log2(-0.0) -> -inf
+; CHECK: store float 0xFFF0000000000000
+ %2 = call float @llvm.log2.f32(float -0.0)
+ store float %2, ptr %f
+
+; log2(-x) -> NaN
+; CHECK: store float 0x7FF8000000000000
+ %3 = call float @llvm.log2.f32(float -20.0)
+ store float %3, ptr %f
+
+; log2(1.0) -> 0.0
+; CHECK: store float 0.000000e+00
+ %4 = call float @llvm.log2.f32(float 1.0)
+ store float %4, ptr %f
+
+; CHECK: store <3 x float> <float 0xFFF0000000000000, float 0x7FF8000000000000, float 0.000000e+00>
+ %5 = call <3 x float> @llvm.log2.v4f32(<3 x float> <float 0.0, float -6.0, float 1.0>)
+ store <3 x float> %5, ptr %v
+
+ ret float %1
+}
+
+define float @test_intrinsic_log10() {
+entry:
+; CHECK-LABEL: @test_intrinsic_log10(
+ %v = alloca <3 x float>
+ %f = alloca float
+
+; log10(0.0) -> -inf
+; CHECK: store float 0xFFF0000000000000
+ %1 = call float @llvm.log10.f32(float 0.0)
+ store float %1, ptr %f
+
+; log10(-0.0) -> -inf
+; CHECK: store float 0xFFF0000000000000
+ %2 = call float @llvm.log10.f32(float -0.0)
+ store float %2, ptr %f
+
+; log10(-x) -> NaN
+; CHECK: store float 0x7FF8000000000000
+ %3 = call float @llvm.log10.f32(float -20.0)
+ store float %3, ptr %f
+
+; log10(1.0) -> 0.0
+; CHECK: store float 0.000000e+00
+ %4 = call float @llvm.log10.f32(float 1.0)
+ store float %4, ptr %f
+
+; CHECK: store <3 x float> <float 0xFFF0000000000000, float 0x7FF8000000000000, float 0.000000e+00>
+ %5 = call <3 x float> @llvm.log10.v3f32(<3 x float> <float 0.0, float -6.0, float 1.0>)
+ store <3 x float> %5, ptr %v
+
+ ret float %1
+}
+
declare double @llvm.pow.f64(double, double) nounwind readonly
declare float @llvm.pow.f32(float, float) nounwind readonly
>From 496387bf7451b62d25dc2546470de44b30a74cc6 Mon Sep 17 00:00:00 2001
From: Stefan Weigl-Bosker <stefan at s00.xyz>
Date: Mon, 22 Dec 2025 17:07:50 -0500
Subject: [PATCH 2/4] [NFC][AMDGPU]: Regenerate tests
---
llvm/test/CodeGen/AMDGPU/llvm.log.ll | 144 ++-----------------------
llvm/test/CodeGen/AMDGPU/llvm.log10.ll | 144 ++-----------------------
llvm/test/CodeGen/AMDGPU/llvm.log2.ll | 38 +++----
3 files changed, 33 insertions(+), 293 deletions(-)
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.log.ll b/llvm/test/CodeGen/AMDGPU/llvm.log.ll
index aa4178c6ed56d..6353640bed146 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.log.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.log.ll
@@ -5686,141 +5686,17 @@ define float @v_log_f32_undef() {
}
define float @v_log_f32_0() {
-; SI-SDAG-LABEL: v_log_f32_0:
-; SI-SDAG: ; %bb.0:
-; SI-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; SI-SDAG-NEXT: v_log_f32_e32 v0, 0
-; SI-SDAG-NEXT: s_mov_b32 s4, 0x3f317217
-; SI-SDAG-NEXT: s_mov_b32 s5, 0x3377d1cf
-; SI-SDAG-NEXT: s_mov_b32 s6, 0x7f800000
-; SI-SDAG-NEXT: v_mul_f32_e32 v1, 0x3f317217, v0
-; SI-SDAG-NEXT: v_fma_f32 v2, v0, s4, -v1
-; SI-SDAG-NEXT: v_fma_f32 v2, v0, s5, v2
-; SI-SDAG-NEXT: v_add_f32_e32 v1, v1, v2
-; SI-SDAG-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, s6
-; SI-SDAG-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; SI-SDAG-NEXT: v_add_f32_e32 v0, 0xc1b17218, v0
-; SI-SDAG-NEXT: s_setpc_b64 s[30:31]
-;
-; SI-GISEL-LABEL: v_log_f32_0:
-; SI-GISEL: ; %bb.0:
-; SI-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; SI-GISEL-NEXT: v_log_f32_e32 v0, 0
-; SI-GISEL-NEXT: v_mov_b32_e32 v1, 0x3f317217
-; SI-GISEL-NEXT: v_mov_b32_e32 v2, 0x3377d1cf
-; SI-GISEL-NEXT: v_mov_b32_e32 v3, 0x7f800000
-; SI-GISEL-NEXT: v_mul_f32_e32 v4, 0x3f317217, v0
-; SI-GISEL-NEXT: v_fma_f32 v1, v0, v1, -v4
-; SI-GISEL-NEXT: v_fma_f32 v1, v0, v2, v1
-; SI-GISEL-NEXT: v_add_f32_e32 v1, v4, v1
-; SI-GISEL-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, v3
-; SI-GISEL-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; SI-GISEL-NEXT: v_subrev_f32_e32 v0, 0x41b17218, v0
-; SI-GISEL-NEXT: s_setpc_b64 s[30:31]
-;
-; VI-SDAG-LABEL: v_log_f32_0:
-; VI-SDAG: ; %bb.0:
-; VI-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; VI-SDAG-NEXT: v_log_f32_e32 v0, 0
-; VI-SDAG-NEXT: s_mov_b32 s4, 0x7f800000
-; VI-SDAG-NEXT: v_and_b32_e32 v1, 0xfffff000, v0
-; VI-SDAG-NEXT: v_sub_f32_e32 v3, v0, v1
-; VI-SDAG-NEXT: v_mul_f32_e32 v2, 0x3805fdf4, v1
-; VI-SDAG-NEXT: v_mul_f32_e32 v4, 0x3805fdf4, v3
-; VI-SDAG-NEXT: v_mul_f32_e32 v3, 0x3f317000, v3
-; VI-SDAG-NEXT: v_add_f32_e32 v2, v2, v4
-; VI-SDAG-NEXT: v_mul_f32_e32 v1, 0x3f317000, v1
-; VI-SDAG-NEXT: v_add_f32_e32 v2, v3, v2
-; VI-SDAG-NEXT: v_add_f32_e32 v1, v1, v2
-; VI-SDAG-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, s4
-; VI-SDAG-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; VI-SDAG-NEXT: v_add_f32_e32 v0, 0xc1b17218, v0
-; VI-SDAG-NEXT: s_setpc_b64 s[30:31]
-;
-; VI-GISEL-LABEL: v_log_f32_0:
-; VI-GISEL: ; %bb.0:
-; VI-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; VI-GISEL-NEXT: v_log_f32_e32 v0, 0
-; VI-GISEL-NEXT: v_and_b32_e32 v1, 0xfffff000, v0
-; VI-GISEL-NEXT: v_sub_f32_e32 v2, v0, v1
-; VI-GISEL-NEXT: v_mul_f32_e32 v3, 0x3805fdf4, v1
-; VI-GISEL-NEXT: v_mul_f32_e32 v4, 0x3805fdf4, v2
-; VI-GISEL-NEXT: v_mul_f32_e32 v2, 0x3f317000, v2
-; VI-GISEL-NEXT: v_add_f32_e32 v3, v3, v4
-; VI-GISEL-NEXT: v_mul_f32_e32 v1, 0x3f317000, v1
-; VI-GISEL-NEXT: v_add_f32_e32 v2, v2, v3
-; VI-GISEL-NEXT: v_add_f32_e32 v1, v1, v2
-; VI-GISEL-NEXT: v_mov_b32_e32 v2, 0x7f800000
-; VI-GISEL-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, v2
-; VI-GISEL-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; VI-GISEL-NEXT: v_subrev_f32_e32 v0, 0x41b17218, v0
-; VI-GISEL-NEXT: s_setpc_b64 s[30:31]
-;
-; GFX900-SDAG-LABEL: v_log_f32_0:
-; GFX900-SDAG: ; %bb.0:
-; GFX900-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX900-SDAG-NEXT: v_log_f32_e32 v0, 0
-; GFX900-SDAG-NEXT: s_mov_b32 s4, 0x3f317217
-; GFX900-SDAG-NEXT: s_mov_b32 s5, 0x3377d1cf
-; GFX900-SDAG-NEXT: s_mov_b32 s6, 0x7f800000
-; GFX900-SDAG-NEXT: v_mul_f32_e32 v1, 0x3f317217, v0
-; GFX900-SDAG-NEXT: v_fma_f32 v2, v0, s4, -v1
-; GFX900-SDAG-NEXT: v_fma_f32 v2, v0, s5, v2
-; GFX900-SDAG-NEXT: v_add_f32_e32 v1, v1, v2
-; GFX900-SDAG-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, s6
-; GFX900-SDAG-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; GFX900-SDAG-NEXT: v_add_f32_e32 v0, 0xc1b17218, v0
-; GFX900-SDAG-NEXT: s_setpc_b64 s[30:31]
-;
-; GFX900-GISEL-LABEL: v_log_f32_0:
-; GFX900-GISEL: ; %bb.0:
-; GFX900-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX900-GISEL-NEXT: v_log_f32_e32 v0, 0
-; GFX900-GISEL-NEXT: v_mov_b32_e32 v1, 0x3f317217
-; GFX900-GISEL-NEXT: v_mov_b32_e32 v2, 0x3377d1cf
-; GFX900-GISEL-NEXT: v_mov_b32_e32 v3, 0x7f800000
-; GFX900-GISEL-NEXT: v_mul_f32_e32 v4, 0x3f317217, v0
-; GFX900-GISEL-NEXT: v_fma_f32 v1, v0, v1, -v4
-; GFX900-GISEL-NEXT: v_fma_f32 v1, v0, v2, v1
-; GFX900-GISEL-NEXT: v_add_f32_e32 v1, v4, v1
-; GFX900-GISEL-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, v3
-; GFX900-GISEL-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; GFX900-GISEL-NEXT: v_subrev_f32_e32 v0, 0x41b17218, v0
-; GFX900-GISEL-NEXT: s_setpc_b64 s[30:31]
-;
-; GFX1100-SDAG-LABEL: v_log_f32_0:
-; GFX1100-SDAG: ; %bb.0:
-; GFX1100-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX1100-SDAG-NEXT: v_log_f32_e32 v0, 0
-; GFX1100-SDAG-NEXT: s_waitcnt_depctr depctr_va_vdst(0)
-; GFX1100-SDAG-NEXT: v_mul_f32_e32 v1, 0x3f317217, v0
-; GFX1100-SDAG-NEXT: v_cmp_gt_f32_e64 vcc_lo, 0x7f800000, |v0|
-; GFX1100-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
-; GFX1100-SDAG-NEXT: v_fma_f32 v2, 0x3f317217, v0, -v1
-; GFX1100-SDAG-NEXT: v_fmamk_f32 v2, v0, 0x3377d1cf, v2
-; GFX1100-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
-; GFX1100-SDAG-NEXT: v_add_f32_e32 v1, v1, v2
-; GFX1100-SDAG-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo
-; GFX1100-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)
-; GFX1100-SDAG-NEXT: v_add_f32_e32 v0, 0xc1b17218, v0
-; GFX1100-SDAG-NEXT: s_setpc_b64 s[30:31]
+; GFX689-LABEL: v_log_f32_0:
+; GFX689: ; %bb.0:
+; GFX689-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX689-NEXT: v_mov_b32_e32 v0, 0xff800000
+; GFX689-NEXT: s_setpc_b64 s[30:31]
;
-; GFX1100-GISEL-LABEL: v_log_f32_0:
-; GFX1100-GISEL: ; %bb.0:
-; GFX1100-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX1100-GISEL-NEXT: v_log_f32_e32 v0, 0
-; GFX1100-GISEL-NEXT: s_waitcnt_depctr depctr_va_vdst(0)
-; GFX1100-GISEL-NEXT: v_mul_f32_e32 v1, 0x3f317217, v0
-; GFX1100-GISEL-NEXT: v_cmp_gt_f32_e64 vcc_lo, 0x7f800000, |v0|
-; GFX1100-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
-; GFX1100-GISEL-NEXT: v_fma_f32 v2, 0x3f317217, v0, -v1
-; GFX1100-GISEL-NEXT: v_fmac_f32_e32 v2, 0x3377d1cf, v0
-; GFX1100-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
-; GFX1100-GISEL-NEXT: v_add_f32_e32 v1, v1, v2
-; GFX1100-GISEL-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo
-; GFX1100-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)
-; GFX1100-GISEL-NEXT: v_subrev_f32_e32 v0, 0x41b17218, v0
-; GFX1100-GISEL-NEXT: s_setpc_b64 s[30:31]
+; GFX1100-LABEL: v_log_f32_0:
+; GFX1100: ; %bb.0:
+; GFX1100-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX1100-NEXT: v_mov_b32_e32 v0, 0xff800000
+; GFX1100-NEXT: s_setpc_b64 s[30:31]
;
; R600-LABEL: v_log_f32_0:
; R600: ; %bb.0:
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.log10.ll b/llvm/test/CodeGen/AMDGPU/llvm.log10.ll
index 1ead1bbda8a05..58665c7b24aea 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.log10.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.log10.ll
@@ -5686,141 +5686,17 @@ define float @v_log10_f32_undef() {
}
define float @v_log10_f32_0() {
-; SI-SDAG-LABEL: v_log10_f32_0:
-; SI-SDAG: ; %bb.0:
-; SI-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; SI-SDAG-NEXT: v_log_f32_e32 v0, 0
-; SI-SDAG-NEXT: s_mov_b32 s4, 0x3e9a209a
-; SI-SDAG-NEXT: s_mov_b32 s5, 0x3284fbcf
-; SI-SDAG-NEXT: s_mov_b32 s6, 0x7f800000
-; SI-SDAG-NEXT: v_mul_f32_e32 v1, 0x3e9a209a, v0
-; SI-SDAG-NEXT: v_fma_f32 v2, v0, s4, -v1
-; SI-SDAG-NEXT: v_fma_f32 v2, v0, s5, v2
-; SI-SDAG-NEXT: v_add_f32_e32 v1, v1, v2
-; SI-SDAG-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, s6
-; SI-SDAG-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; SI-SDAG-NEXT: v_add_f32_e32 v0, 0xc11a209b, v0
-; SI-SDAG-NEXT: s_setpc_b64 s[30:31]
-;
-; SI-GISEL-LABEL: v_log10_f32_0:
-; SI-GISEL: ; %bb.0:
-; SI-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; SI-GISEL-NEXT: v_log_f32_e32 v0, 0
-; SI-GISEL-NEXT: v_mov_b32_e32 v1, 0x3e9a209a
-; SI-GISEL-NEXT: v_mov_b32_e32 v2, 0x3284fbcf
-; SI-GISEL-NEXT: v_mov_b32_e32 v3, 0x7f800000
-; SI-GISEL-NEXT: v_mul_f32_e32 v4, 0x3e9a209a, v0
-; SI-GISEL-NEXT: v_fma_f32 v1, v0, v1, -v4
-; SI-GISEL-NEXT: v_fma_f32 v1, v0, v2, v1
-; SI-GISEL-NEXT: v_add_f32_e32 v1, v4, v1
-; SI-GISEL-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, v3
-; SI-GISEL-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; SI-GISEL-NEXT: v_subrev_f32_e32 v0, 0x411a209b, v0
-; SI-GISEL-NEXT: s_setpc_b64 s[30:31]
-;
-; VI-SDAG-LABEL: v_log10_f32_0:
-; VI-SDAG: ; %bb.0:
-; VI-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; VI-SDAG-NEXT: v_log_f32_e32 v0, 0
-; VI-SDAG-NEXT: s_mov_b32 s4, 0x7f800000
-; VI-SDAG-NEXT: v_and_b32_e32 v1, 0xfffff000, v0
-; VI-SDAG-NEXT: v_sub_f32_e32 v3, v0, v1
-; VI-SDAG-NEXT: v_mul_f32_e32 v2, 0x369a84fb, v1
-; VI-SDAG-NEXT: v_mul_f32_e32 v4, 0x369a84fb, v3
-; VI-SDAG-NEXT: v_mul_f32_e32 v3, 0x3e9a2000, v3
-; VI-SDAG-NEXT: v_add_f32_e32 v2, v2, v4
-; VI-SDAG-NEXT: v_mul_f32_e32 v1, 0x3e9a2000, v1
-; VI-SDAG-NEXT: v_add_f32_e32 v2, v3, v2
-; VI-SDAG-NEXT: v_add_f32_e32 v1, v1, v2
-; VI-SDAG-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, s4
-; VI-SDAG-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; VI-SDAG-NEXT: v_add_f32_e32 v0, 0xc11a209b, v0
-; VI-SDAG-NEXT: s_setpc_b64 s[30:31]
-;
-; VI-GISEL-LABEL: v_log10_f32_0:
-; VI-GISEL: ; %bb.0:
-; VI-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; VI-GISEL-NEXT: v_log_f32_e32 v0, 0
-; VI-GISEL-NEXT: v_and_b32_e32 v1, 0xfffff000, v0
-; VI-GISEL-NEXT: v_sub_f32_e32 v2, v0, v1
-; VI-GISEL-NEXT: v_mul_f32_e32 v3, 0x369a84fb, v1
-; VI-GISEL-NEXT: v_mul_f32_e32 v4, 0x369a84fb, v2
-; VI-GISEL-NEXT: v_mul_f32_e32 v2, 0x3e9a2000, v2
-; VI-GISEL-NEXT: v_add_f32_e32 v3, v3, v4
-; VI-GISEL-NEXT: v_mul_f32_e32 v1, 0x3e9a2000, v1
-; VI-GISEL-NEXT: v_add_f32_e32 v2, v2, v3
-; VI-GISEL-NEXT: v_add_f32_e32 v1, v1, v2
-; VI-GISEL-NEXT: v_mov_b32_e32 v2, 0x7f800000
-; VI-GISEL-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, v2
-; VI-GISEL-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; VI-GISEL-NEXT: v_subrev_f32_e32 v0, 0x411a209b, v0
-; VI-GISEL-NEXT: s_setpc_b64 s[30:31]
-;
-; GFX900-SDAG-LABEL: v_log10_f32_0:
-; GFX900-SDAG: ; %bb.0:
-; GFX900-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX900-SDAG-NEXT: v_log_f32_e32 v0, 0
-; GFX900-SDAG-NEXT: s_mov_b32 s4, 0x3e9a209a
-; GFX900-SDAG-NEXT: s_mov_b32 s5, 0x3284fbcf
-; GFX900-SDAG-NEXT: s_mov_b32 s6, 0x7f800000
-; GFX900-SDAG-NEXT: v_mul_f32_e32 v1, 0x3e9a209a, v0
-; GFX900-SDAG-NEXT: v_fma_f32 v2, v0, s4, -v1
-; GFX900-SDAG-NEXT: v_fma_f32 v2, v0, s5, v2
-; GFX900-SDAG-NEXT: v_add_f32_e32 v1, v1, v2
-; GFX900-SDAG-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, s6
-; GFX900-SDAG-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; GFX900-SDAG-NEXT: v_add_f32_e32 v0, 0xc11a209b, v0
-; GFX900-SDAG-NEXT: s_setpc_b64 s[30:31]
-;
-; GFX900-GISEL-LABEL: v_log10_f32_0:
-; GFX900-GISEL: ; %bb.0:
-; GFX900-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX900-GISEL-NEXT: v_log_f32_e32 v0, 0
-; GFX900-GISEL-NEXT: v_mov_b32_e32 v1, 0x3e9a209a
-; GFX900-GISEL-NEXT: v_mov_b32_e32 v2, 0x3284fbcf
-; GFX900-GISEL-NEXT: v_mov_b32_e32 v3, 0x7f800000
-; GFX900-GISEL-NEXT: v_mul_f32_e32 v4, 0x3e9a209a, v0
-; GFX900-GISEL-NEXT: v_fma_f32 v1, v0, v1, -v4
-; GFX900-GISEL-NEXT: v_fma_f32 v1, v0, v2, v1
-; GFX900-GISEL-NEXT: v_add_f32_e32 v1, v4, v1
-; GFX900-GISEL-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, v3
-; GFX900-GISEL-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc
-; GFX900-GISEL-NEXT: v_subrev_f32_e32 v0, 0x411a209b, v0
-; GFX900-GISEL-NEXT: s_setpc_b64 s[30:31]
-;
-; GFX1100-SDAG-LABEL: v_log10_f32_0:
-; GFX1100-SDAG: ; %bb.0:
-; GFX1100-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX1100-SDAG-NEXT: v_log_f32_e32 v0, 0
-; GFX1100-SDAG-NEXT: s_waitcnt_depctr depctr_va_vdst(0)
-; GFX1100-SDAG-NEXT: v_mul_f32_e32 v1, 0x3e9a209a, v0
-; GFX1100-SDAG-NEXT: v_cmp_gt_f32_e64 vcc_lo, 0x7f800000, |v0|
-; GFX1100-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
-; GFX1100-SDAG-NEXT: v_fma_f32 v2, 0x3e9a209a, v0, -v1
-; GFX1100-SDAG-NEXT: v_fmamk_f32 v2, v0, 0x3284fbcf, v2
-; GFX1100-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
-; GFX1100-SDAG-NEXT: v_add_f32_e32 v1, v1, v2
-; GFX1100-SDAG-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo
-; GFX1100-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)
-; GFX1100-SDAG-NEXT: v_add_f32_e32 v0, 0xc11a209b, v0
-; GFX1100-SDAG-NEXT: s_setpc_b64 s[30:31]
+; GFX689-LABEL: v_log10_f32_0:
+; GFX689: ; %bb.0:
+; GFX689-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX689-NEXT: v_mov_b32_e32 v0, 0xff800000
+; GFX689-NEXT: s_setpc_b64 s[30:31]
;
-; GFX1100-GISEL-LABEL: v_log10_f32_0:
-; GFX1100-GISEL: ; %bb.0:
-; GFX1100-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX1100-GISEL-NEXT: v_log_f32_e32 v0, 0
-; GFX1100-GISEL-NEXT: s_waitcnt_depctr depctr_va_vdst(0)
-; GFX1100-GISEL-NEXT: v_mul_f32_e32 v1, 0x3e9a209a, v0
-; GFX1100-GISEL-NEXT: v_cmp_gt_f32_e64 vcc_lo, 0x7f800000, |v0|
-; GFX1100-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
-; GFX1100-GISEL-NEXT: v_fma_f32 v2, 0x3e9a209a, v0, -v1
-; GFX1100-GISEL-NEXT: v_fmac_f32_e32 v2, 0x3284fbcf, v0
-; GFX1100-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
-; GFX1100-GISEL-NEXT: v_add_f32_e32 v1, v1, v2
-; GFX1100-GISEL-NEXT: v_cndmask_b32_e32 v0, v0, v1, vcc_lo
-; GFX1100-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)
-; GFX1100-GISEL-NEXT: v_subrev_f32_e32 v0, 0x411a209b, v0
-; GFX1100-GISEL-NEXT: s_setpc_b64 s[30:31]
+; GFX1100-LABEL: v_log10_f32_0:
+; GFX1100: ; %bb.0:
+; GFX1100-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX1100-NEXT: v_mov_b32_e32 v0, 0xff800000
+; GFX1100-NEXT: s_setpc_b64 s[30:31]
;
; R600-LABEL: v_log10_f32_0:
; R600: ; %bb.0:
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.log2.ll b/llvm/test/CodeGen/AMDGPU/llvm.log2.ll
index 46b8ab09d917c..cf2c8fe8fc574 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.log2.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.log2.ll
@@ -3441,32 +3441,17 @@ define float @v_log2_f32_undef() {
}
define float @v_log2_f32_0() {
-; GFX689-SDAG-LABEL: v_log2_f32_0:
-; GFX689-SDAG: ; %bb.0:
-; GFX689-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX689-SDAG-NEXT: v_log_f32_e32 v0, 0
-; GFX689-SDAG-NEXT: v_add_f32_e32 v0, 0xc2000000, v0
-; GFX689-SDAG-NEXT: s_setpc_b64 s[30:31]
-;
-; GFX689-GISEL-LABEL: v_log2_f32_0:
-; GFX689-GISEL: ; %bb.0:
-; GFX689-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX689-GISEL-NEXT: v_mov_b32_e32 v0, 0xff800000
-; GFX689-GISEL-NEXT: s_setpc_b64 s[30:31]
-;
-; GFX1100-SDAG-LABEL: v_log2_f32_0:
-; GFX1100-SDAG: ; %bb.0:
-; GFX1100-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX1100-SDAG-NEXT: v_log_f32_e32 v0, 0
-; GFX1100-SDAG-NEXT: s_waitcnt_depctr depctr_va_vdst(0)
-; GFX1100-SDAG-NEXT: v_add_f32_e32 v0, 0xc2000000, v0
-; GFX1100-SDAG-NEXT: s_setpc_b64 s[30:31]
+; GFX689-LABEL: v_log2_f32_0:
+; GFX689: ; %bb.0:
+; GFX689-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX689-NEXT: v_mov_b32_e32 v0, 0xff800000
+; GFX689-NEXT: s_setpc_b64 s[30:31]
;
-; GFX1100-GISEL-LABEL: v_log2_f32_0:
-; GFX1100-GISEL: ; %bb.0:
-; GFX1100-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX1100-GISEL-NEXT: v_mov_b32_e32 v0, 0xff800000
-; GFX1100-GISEL-NEXT: s_setpc_b64 s[30:31]
+; GFX1100-LABEL: v_log2_f32_0:
+; GFX1100: ; %bb.0:
+; GFX1100-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX1100-NEXT: v_mov_b32_e32 v0, 0xff800000
+; GFX1100-NEXT: s_setpc_b64 s[30:31]
;
; R600-LABEL: v_log2_f32_0:
; R600: ; %bb.0:
@@ -5216,3 +5201,6 @@ declare <2 x half> @llvm.fabs.v2f16(<2 x half>) #2
attributes #0 = { "denormal-fp-math-f32"="ieee,preserve-sign" }
attributes #1 = { "denormal-fp-math-f32"="dynamic,dynamic" }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; GFX689-GISEL: {{.*}}
+; GFX689-SDAG: {{.*}}
>From 95ecccd7a0fbc5d1916e0b004195b2f034e845d1 Mon Sep 17 00:00:00 2001
From: Stefan Weigl-Bosker <stefan at s00.xyz>
Date: Tue, 23 Dec 2025 16:28:30 -0500
Subject: [PATCH 3/4] Update llvm/lib/Analysis/ConstantFolding.cpp
Co-authored-by: Matt Arsenault <arsenm2 at gmail.com>
---
llvm/lib/Analysis/ConstantFolding.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 7586b88bedb2f..f59d2b08ea7a9 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2740,7 +2740,7 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
return ConstantFP::getInfinity(Ty, true);
if (U.isNegative())
return ConstantFP::getNaN(Ty);
- if (U.isExactlyValue(1))
+ if (U.isExactlyValue(1.0))
return ConstantFP::getZero(Ty);
// TODO: What about hosts that lack a C99 library?
return ConstantFoldFP(log10, APF, Ty);
>From e047e80e5f0e23beea8ed66ba15903f5ae08b02a Mon Sep 17 00:00:00 2001
From: Stefan Weigl-Bosker <stefan at s00.xyz>
Date: Tue, 23 Dec 2025 16:28:49 -0500
Subject: [PATCH 4/4] Update llvm/lib/Analysis/ConstantFolding.cpp
Co-authored-by: Matt Arsenault <arsenm2 at gmail.com>
---
llvm/lib/Analysis/ConstantFolding.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index f59d2b08ea7a9..b8fb6cc17deaa 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2731,7 +2731,7 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
return ConstantFP::getInfinity(Ty, true);
if (U.isNegative())
return ConstantFP::getNaN(Ty);
- if (U.isExactlyValue(1))
+ if (U.isExactlyValue(1.0))
return ConstantFP::getZero(Ty);
// TODO: What about hosts that lack a C99 library?
return ConstantFoldFP(log2, APF, Ty);
More information about the llvm-commits
mailing list