Skip to content

Commit 2399d87

Browse files
authored
[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.
1 parent 2afa193 commit 2399d87

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2579,14 +2579,13 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
25792579
}
25802580
break;
25812581
}
2582-
case Intrinsic::sin: {
2582+
case Intrinsic::sin:
2583+
case Intrinsic::amdgcn_sin: {
25832584
Value *X;
25842585
if (match(II->getArgOperand(0), m_OneUse(m_FNeg(m_Value(X))))) {
25852586
// sin(-x) --> -sin(x)
2586-
Value *NewSin = Builder.CreateUnaryIntrinsic(Intrinsic::sin, X, II);
2587-
Instruction *FNeg = UnaryOperator::CreateFNeg(NewSin);
2588-
FNeg->copyFastMathFlags(II);
2589-
return FNeg;
2587+
Value *NewSin = Builder.CreateUnaryIntrinsic(IID, X, II);
2588+
return UnaryOperator::CreateFNegFMF(NewSin, II);
25902589
}
25912590
break;
25922591
}

llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,60 @@ define float @cos_fabs_unary_fneg_f32(float %x) {
10231023
ret float %cos
10241024
}
10251025

1026+
1027+
; --------------------------------------------------------------------
1028+
; llvm.amdgcn.sin
1029+
; --------------------------------------------------------------------
1030+
declare float @llvm.amdgcn.sin.f32(float) nounwind readnone
1031+
1032+
define float @sin_fneg_f32(float %x) {
1033+
; CHECK-LABEL: @sin_fneg_f32(
1034+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X:%.*]])
1035+
; CHECK-NEXT: [[SIN:%.*]] = fneg float [[TMP1]]
1036+
; CHECK-NEXT: ret float [[SIN]]
1037+
;
1038+
%x.fneg = fneg float %x
1039+
%sin = call float @llvm.amdgcn.sin.f32(float %x.fneg)
1040+
ret float %sin
1041+
}
1042+
1043+
define float @sin_fabs_f32(float %x) {
1044+
; CHECK-LABEL: @sin_fabs_f32(
1045+
; CHECK-NEXT: [[X_FABS:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
1046+
; CHECK-NEXT: [[SIN:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X_FABS]])
1047+
; CHECK-NEXT: ret float [[SIN]]
1048+
;
1049+
%x.fabs = call float @llvm.fabs.f32(float %x)
1050+
%sin = call float @llvm.amdgcn.sin.f32(float %x.fabs)
1051+
ret float %sin
1052+
}
1053+
1054+
define float @sin_fabs_fneg_f32(float %x) {
1055+
; CHECK-LABEL: @sin_fabs_fneg_f32(
1056+
; CHECK-NEXT: [[X_FABS:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
1057+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X_FABS]])
1058+
; CHECK-NEXT: [[SIN:%.*]] = fneg float [[TMP1]]
1059+
; CHECK-NEXT: ret float [[SIN]]
1060+
;
1061+
%x.fabs = call float @llvm.fabs.f32(float %x)
1062+
%x.fabs.fneg = fneg float %x.fabs
1063+
%sin = call float @llvm.amdgcn.sin.f32(float %x.fabs.fneg)
1064+
ret float %sin
1065+
}
1066+
1067+
define float @sin_fabs_fneg_fast_f32(float %x) {
1068+
; CHECK-LABEL: @sin_fabs_fneg_fast_f32(
1069+
; CHECK-NEXT: [[X_FABS:%.*]] = call fast float @llvm.fabs.f32(float [[X:%.*]])
1070+
; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.amdgcn.sin.f32(float [[X_FABS]])
1071+
; CHECK-NEXT: [[SIN:%.*]] = fneg fast float [[TMP1]]
1072+
; CHECK-NEXT: ret float [[SIN]]
1073+
;
1074+
%x.fabs = call fast float @llvm.fabs.f32(float %x)
1075+
%x.fabs.fneg = fneg float %x.fabs
1076+
%sin = call fast float @llvm.amdgcn.sin.f32(float %x.fabs.fneg)
1077+
ret float %sin
1078+
}
1079+
10261080
; --------------------------------------------------------------------
10271081
; llvm.amdgcn.cvt.pkrtz
10281082
; --------------------------------------------------------------------

0 commit comments

Comments
 (0)