[llvm] 5e6a204 - InstCombine: Add baseline tests for fneg of ldexp combine
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 11 16:16:30 PDT 2023
Author: Matt Arsenault
Date: 2023-08-11T19:16:20-04:00
New Revision: 5e6a20441744c5721f7f657cded04b28299a8589
URL: https://github.com/llvm/llvm-project/commit/5e6a20441744c5721f7f657cded04b28299a8589
DIFF: https://github.com/llvm/llvm-project/commit/5e6a20441744c5721f7f657cded04b28299a8589.diff
LOG: InstCombine: Add baseline tests for fneg of ldexp combine
Added:
Modified:
llvm/test/Transforms/InstCombine/fneg.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/fneg.ll b/llvm/test/Transforms/InstCombine/fneg.ll
index 207e38f0953ed1..d9047ad53e814a 100644
--- a/llvm/test/Transforms/InstCombine/fneg.ll
+++ b/llvm/test/Transforms/InstCombine/fneg.ll
@@ -1,6 +1,8 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
+declare float @llvm.ldexp.f32.i32(float, i32)
+declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>)
declare void @use(float)
define float @fneg_fneg(float %a) {
@@ -829,3 +831,161 @@ define float @select_fneg_use3(float %x, float %y, i1 %b) {
%r = fneg float %s
ret float %r
}
+
+define float @fneg_ldexp(float %x, i32 %n) {
+; CHECK-LABEL: @fneg_ldexp(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fneg float %ldexp
+ ret float %neg
+}
+
+define float @fsub_fneg_ldexp(float %x, i32 %n) {
+; CHECK-LABEL: @fsub_fneg_ldexp(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fsub float -0.0, %ldexp
+ ret float %neg
+}
+
+define float @fsub_fneg_ldexp_nsz(float %x, i32 %n) {
+; CHECK-LABEL: @fsub_fneg_ldexp_nsz(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg nsz float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fsub nsz float -0.0, %ldexp
+ ret float %neg
+}
+
+define float @fsub_fneg_ldexp_p0_nsz(float %x, i32 %n) {
+; CHECK-LABEL: @fsub_fneg_ldexp_p0_nsz(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg nsz float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fsub nsz float 0.0, %ldexp
+ ret float %neg
+}
+
+define float @fsub_fneg_ldexp_p0(float %x, i32 %n) {
+; CHECK-LABEL: @fsub_fneg_ldexp_p0(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fsub float 0.000000e+00, [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fsub float 0.0, %ldexp
+ ret float %neg
+}
+
+define <2 x float> @fneg_ldexp_vector(<2 x float> %x, <2 x i32> %n) {
+; CHECK-LABEL: @fneg_ldexp_vector(
+; CHECK-NEXT: [[LDEXP:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X:%.*]], <2 x i32> [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg <2 x float> [[LDEXP]]
+; CHECK-NEXT: ret <2 x float> [[NEG]]
+;
+ %ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> %n)
+ %neg = fneg <2 x float> %ldexp
+ ret <2 x float> %neg
+}
+
+define float @fneg_ldexp_multiuse(float %x, i32 %n, ptr %ptr) {
+; CHECK-LABEL: @fneg_ldexp_multiuse(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: store float [[LDEXP]], ptr [[PTR:%.*]], align 4
+; CHECK-NEXT: [[NEG:%.*]] = fneg float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ store float %ldexp, ptr %ptr
+ %neg = fneg float %ldexp
+ ret float %neg
+}
+
+define float @fneg_ldexp_fmf_ldexp(float %x, i32 %n) {
+; CHECK-LABEL: @fneg_ldexp_fmf_ldexp(
+; CHECK-NEXT: [[LDEXP:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call nnan float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fneg float %ldexp
+ ret float %neg
+}
+
+define float @fneg_ldexp_fmf_neg(float %x, i32 %n) {
+; CHECK-LABEL: @fneg_ldexp_fmf_neg(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg nnan float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fneg nnan float %ldexp
+ ret float %neg
+}
+
+define float @fneg_ldexp_fmf(float %x, i32 %n) {
+; CHECK-LABEL: @fneg_ldexp_fmf(
+; CHECK-NEXT: [[LDEXP:%.*]] = call ninf float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg nnan float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call ninf float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fneg nnan float %ldexp
+ ret float %neg
+}
+
+define float @fneg_ldexp_contract0(float %x, i32 %n) {
+; CHECK-LABEL: @fneg_ldexp_contract0(
+; CHECK-NEXT: [[LDEXP:%.*]] = call contract float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call contract float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fneg float %ldexp
+ ret float %neg
+}
+
+define float @fneg_ldexp_contract1(float %x, i32 %n) {
+; CHECK-LABEL: @fneg_ldexp_contract1(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg contract float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fneg contract float %ldexp
+ ret float %neg
+}
+
+define float @fneg_ldexp_contract(float %x, i32 %n) {
+; CHECK-LABEL: @fneg_ldexp_contract(
+; CHECK-NEXT: [[LDEXP:%.*]] = call contract float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]])
+; CHECK-NEXT: [[NEG:%.*]] = fneg contract float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call contract float @llvm.ldexp.f32.i32(float %x, i32 %n)
+ %neg = fneg contract float %ldexp
+ ret float %neg
+}
+
+define float @fneg_ldexp_metadata(float %x, i32 %n) {
+; CHECK-LABEL: @fneg_ldexp_metadata(
+; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[N:%.*]]), !arst !0
+; CHECK-NEXT: [[NEG:%.*]] = fneg float [[LDEXP]]
+; CHECK-NEXT: ret float [[NEG]]
+;
+ %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n), !arst !0
+ %neg = fneg float %ldexp
+ ret float %neg
+}
+
+!0 = !{}
More information about the llvm-commits
mailing list