diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 60b8243d6ba66..a76f0856691be 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -2509,11 +2509,12 @@ 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); + Value *NewSin = Builder.CreateUnaryIntrinsic(IID, X, II); Instruction *FNeg = UnaryOperator::CreateFNeg(NewSin); FNeg->copyFastMathFlags(II); return FNeg; diff --git a/llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll b/llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll index 94c32e3cbe99f..6a8525f5b62fb 100644 --- a/llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll +++ b/llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll @@ -1023,6 +1023,50 @@ define float @cos_fabs_unary_fneg_f32(float %x) { ret float %cos } + +; -------------------------------------------------------------------- +; llvm.amdgcn.sin +; -------------------------------------------------------------------- +declare float @llvm.amdgcn.sin.f32(float) nounwind readnone + +; CHECK-NEXT: ret float %sin +define float @sin_fneg_f32(float %x) { +; CHECK-LABEL: @sin_fneg_f32( +; CHECK-NEXT: [[X_FNEG:%.*]] = fsub float 0.000000e+00, [[X:%.*]] +; CHECK-NEXT: [[SIN:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X_FNEG]]) +; CHECK-NEXT: ret float [[SIN]] +; + %x.fneg = fsub float 0.0, %x + %sin = call float @llvm.amdgcn.sin.f32(float %x.fneg) + ret float %sin +} + +; CHECK-NEXT: 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 +} + +; CHECK-NEXT: 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 = fsub float -0.0, %x.fabs + %sin = call float @llvm.amdgcn.sin.f32(float %x.fabs.fneg) + ret float %sin +} + ; -------------------------------------------------------------------- ; llvm.amdgcn.cvt.pkrtz ; --------------------------------------------------------------------