mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-03 09:14:30 +00:00
Intrinsics that just load from memory can be treated like loads: they don't
have to serialize against each other. This allows us to schedule lvx's across each other, for example. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27346 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5348e393df
commit
e58a780166
@ -1236,16 +1236,32 @@ static bool IntrinsicCannotAccessMemory(unsigned IntrinsicID) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// IntrinsicOnlyReadsMemory - Return true if the specified intrinsic doesn't
|
||||
// have any side-effects or if it only reads memory.
|
||||
static bool IntrinsicOnlyReadsMemory(unsigned IntrinsicID) {
|
||||
#define GET_SIDE_EFFECT_INFO
|
||||
#include "llvm/Intrinsics.gen"
|
||||
#undef GET_SIDE_EFFECT_INFO
|
||||
return false;
|
||||
}
|
||||
|
||||
/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
|
||||
/// node.
|
||||
void SelectionDAGLowering::visitTargetIntrinsic(CallInst &I,
|
||||
unsigned Intrinsic) {
|
||||
bool HasChain = !IntrinsicCannotAccessMemory(Intrinsic);
|
||||
bool OnlyLoad = HasChain && IntrinsicOnlyReadsMemory(Intrinsic);
|
||||
|
||||
// Build the operand list.
|
||||
std::vector<SDOperand> Ops;
|
||||
if (HasChain) // If this intrinsic has side-effects, chainify it.
|
||||
Ops.push_back(getRoot());
|
||||
if (HasChain) { // If this intrinsic has side-effects, chainify it.
|
||||
if (OnlyLoad) {
|
||||
// We don't need to serialize loads against other loads.
|
||||
Ops.push_back(DAG.getRoot());
|
||||
} else {
|
||||
Ops.push_back(getRoot());
|
||||
}
|
||||
}
|
||||
|
||||
// Add the intrinsic ID as an integer operand.
|
||||
Ops.push_back(DAG.getConstant(Intrinsic, TLI.getPointerTy()));
|
||||
@ -1295,8 +1311,13 @@ void SelectionDAGLowering::visitTargetIntrinsic(CallInst &I,
|
||||
else
|
||||
Result = DAG.getNode(ISD::INTRINSIC_VOID, VTs, Ops);
|
||||
|
||||
if (HasChain)
|
||||
DAG.setRoot(Result.getValue(Result.Val->getNumValues()-1));
|
||||
if (HasChain) {
|
||||
SDOperand Chain = Result.getValue(Result.Val->getNumValues()-1);
|
||||
if (OnlyLoad)
|
||||
PendingLoads.push_back(Chain);
|
||||
else
|
||||
DAG.setRoot(Chain);
|
||||
}
|
||||
if (I.getType() != Type::VoidTy) {
|
||||
if (const PackedType *PTy = dyn_cast<PackedType>(I.getType())) {
|
||||
MVT::ValueType EVT = TLI.getValueType(PTy->getElementType());
|
||||
|
Loading…
x
Reference in New Issue
Block a user