Apply llvm fix for "Invalid PPC CTR loop!" error on powerpcspe
Merge commit d9d15af7873f from llvm git (Qiu Chaofan): [PowerPC] Treat llvm.fmuladd intrinsic as using CTR This fixes bug 55463, similar to D78668. This is a temporary fix since we will switch to post-isel CTR loop determination in the future. Reviewed By: dim, shchenz Differential Revision: https://reviews.llvm.org/D125746 MFC after: 2 weeks
This commit is contained in:
parent
f70de61e56
commit
1a0329799c
34
commit-d9d15af7873fe16d7a0dde4def30f40fa9901777.diff
Normal file
34
commit-d9d15af7873fe16d7a0dde4def30f40fa9901777.diff
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
commit d9d15af7873fe16d7a0dde4def30f40fa9901777
|
||||||
|
Author: Qiu Chaofan <qiucofan@cn.ibm.com>
|
||||||
|
Date: Wed May 18 15:55:02 2022 +0800
|
||||||
|
|
||||||
|
[PowerPC] Treat llvm.fmuladd intrinsic as using CTR
|
||||||
|
|
||||||
|
This fixes bug 55463, similar to D78668. This is a temporary fix since
|
||||||
|
we will switch to post-isel CTR loop determination in the future.
|
||||||
|
|
||||||
|
Reviewed By: dim, shchenz
|
||||||
|
|
||||||
|
Differential Revision: https://reviews.llvm.org/D125746
|
||||||
|
|
||||||
|
diff --git a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
|
||||||
|
index 501cfa07efeb..7b956fd3478e 100644
|
||||||
|
--- a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
|
||||||
|
+++ b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
|
||||||
|
@@ -491,15 +491,13 @@ bool PPCTTIImpl::mightUseCTR(BasicBlock *BB, TargetLibraryInfo *LibInfo,
|
||||||
|
case Intrinsic::experimental_constrained_sin:
|
||||||
|
case Intrinsic::experimental_constrained_cos:
|
||||||
|
return true;
|
||||||
|
- // There is no corresponding FMA instruction for PPC double double.
|
||||||
|
- // Thus, we need to disable CTR loop generation for this type.
|
||||||
|
- case Intrinsic::fmuladd:
|
||||||
|
case Intrinsic::copysign:
|
||||||
|
if (CI->getArgOperand(0)->getType()->getScalarType()->
|
||||||
|
isPPC_FP128Ty())
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
continue; // ISD::FCOPYSIGN is never a library call.
|
||||||
|
+ case Intrinsic::fmuladd:
|
||||||
|
case Intrinsic::fma: Opcode = ISD::FMA; break;
|
||||||
|
case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
|
||||||
|
case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
|
@ -491,15 +491,13 @@ bool PPCTTIImpl::mightUseCTR(BasicBlock *BB, TargetLibraryInfo *LibInfo,
|
|||||||
case Intrinsic::experimental_constrained_sin:
|
case Intrinsic::experimental_constrained_sin:
|
||||||
case Intrinsic::experimental_constrained_cos:
|
case Intrinsic::experimental_constrained_cos:
|
||||||
return true;
|
return true;
|
||||||
// There is no corresponding FMA instruction for PPC double double.
|
|
||||||
// Thus, we need to disable CTR loop generation for this type.
|
|
||||||
case Intrinsic::fmuladd:
|
|
||||||
case Intrinsic::copysign:
|
case Intrinsic::copysign:
|
||||||
if (CI->getArgOperand(0)->getType()->getScalarType()->
|
if (CI->getArgOperand(0)->getType()->getScalarType()->
|
||||||
isPPC_FP128Ty())
|
isPPC_FP128Ty())
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
continue; // ISD::FCOPYSIGN is never a library call.
|
continue; // ISD::FCOPYSIGN is never a library call.
|
||||||
|
case Intrinsic::fmuladd:
|
||||||
case Intrinsic::fma: Opcode = ISD::FMA; break;
|
case Intrinsic::fma: Opcode = ISD::FMA; break;
|
||||||
case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
|
case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
|
||||||
case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
|
case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
|
||||||
|
Loading…
Reference in New Issue
Block a user