[llvm] 2399d87 - [Transforms] Let amdgcn take advantage of sin(-x) --> -sin(x) (#79700)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 30 00:09:40 PDT 2024
Author: AtariDreams
Date: 2024-06-30T09:09:36+02:00
New Revision: 2399d8776861760edd15f871c740a3b6b43ca9a1
URL: https://github.com/llvm/llvm-project/commit/2399d8776861760edd15f871c740a3b6b43ca9a1
DIFF: https://github.com/llvm/llvm-project/commit/2399d8776861760edd15f871c740a3b6b43ca9a1.diff
LOG: [Transforms] Let amdgcn take advantage of sin(-x) --> -sin(x) (#79700)
We do it for amdgcn_cos, and we should do it for amdgcn_sin as well.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 921ed6e67d022..9291e6e67ef71 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -2579,14 +2579,13 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
}
break;
}
- case Intrinsic::sin: {
+ case Intrinsic::sin:
+ case Intrinsic::amdgcn_sin: {
Value *X;
if (match(II->getArgOperand(0), m_OneUse(m_FNeg(m_Value(X))))) {
// sin(-x) --> -sin(x)
- Value *NewSin = Builder.CreateUnaryIntrinsic(Intrinsic::sin, X, II);
- Instruction *FNeg = UnaryOperator::CreateFNeg(NewSin);
- FNeg->copyFastMathFlags(II);
- return FNeg;
+ Value *NewSin = Builder.CreateUnaryIntrinsic(IID, X, II);
+ return UnaryOperator::CreateFNegFMF(NewSin, II);
}
break;
}
diff --git a/llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll b/llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
index 925e88d041715..59118a172a2bc 100644
--- a/llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
+++ b/llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
@@ -1023,6 +1023,60 @@ define float @cos_fabs_unary_fneg_f32(float %x) {
ret float %cos
}
+
+; --------------------------------------------------------------------
+; llvm.amdgcn.sin
+; --------------------------------------------------------------------
+declare float @llvm.amdgcn.sin.f32(float) nounwind readnone
+
+define float @sin_fneg_f32(float %x) {
+; CHECK-LABEL: @sin_fneg_f32(
+; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X:%.*]])
+; CHECK-NEXT: [[SIN:%.*]] = fneg float [[TMP1]]
+; CHECK-NEXT: ret float [[SIN]]
+;
+ %x.fneg = fneg float %x
+ %sin = call float @llvm.amdgcn.sin.f32(float %x.fneg)
+ ret float %sin
+}
+
+define float @sin_fabs_f32(float %x) {
+; CHECK-LABEL: @sin_fabs_f32(
+; CHECK-NEXT: [[X_FABS:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
+; CHECK-NEXT: [[SIN:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X_FABS]])
+; CHECK-NEXT: ret float [[SIN]]
+;
+ %x.fabs = call float @llvm.fabs.f32(float %x)
+ %sin = call float @llvm.amdgcn.sin.f32(float %x.fabs)
+ ret float %sin
+}
+
+define float @sin_fabs_fneg_f32(float %x) {
+; CHECK-LABEL: @sin_fabs_fneg_f32(
+; CHECK-NEXT: [[X_FABS:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
+; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X_FABS]])
+; CHECK-NEXT: [[SIN:%.*]] = fneg float [[TMP1]]
+; CHECK-NEXT: ret float [[SIN]]
+;
+ %x.fabs = call float @llvm.fabs.f32(float %x)
+ %x.fabs.fneg = fneg float %x.fabs
+ %sin = call float @llvm.amdgcn.sin.f32(float %x.fabs.fneg)
+ ret float %sin
+}
+
+define float @sin_fabs_fneg_fast_f32(float %x) {
+; CHECK-LABEL: @sin_fabs_fneg_fast_f32(
+; CHECK-NEXT: [[X_FABS:%.*]] = call fast float @llvm.fabs.f32(float [[X:%.*]])
+; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.amdgcn.sin.f32(float [[X_FABS]])
+; CHECK-NEXT: [[SIN:%.*]] = fneg fast float [[TMP1]]
+; CHECK-NEXT: ret float [[SIN]]
+;
+ %x.fabs = call fast float @llvm.fabs.f32(float %x)
+ %x.fabs.fneg = fneg float %x.fabs
+ %sin = call fast float @llvm.amdgcn.sin.f32(float %x.fabs.fneg)
+ ret float %sin
+}
+
; --------------------------------------------------------------------
; llvm.amdgcn.cvt.pkrtz
; --------------------------------------------------------------------
More information about the llvm-commits
mailing list