mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-18 17:55:18 +00:00
Change SelectionDAG::getConstantPool to always set the alignment of the
ConstantPoolSDNode, using the target's preferred alignment for the constant type. In LegalizeDAG, when performing loads from the constant pool, the ConstantPoolSDNode's alignment is used in the calls to getLoad and getExtLoad. This change prevents SelectionDAG::getLoad/getExtLoad from incorrectly choosing the ABI alignment for constant pool loads when Alignment == 0. The incorrect alignment is only a performance issue when ABI alignment does not equal preferred alignment (i.e., on x86 it was generating MOVUPS instead of MOVAPS for v4f32 constant loads when the default ABI alignment for 128bit vectors is forced to 1 byte.) Patch by Paul Redmond! llvm-svn: 56253
This commit is contained in:
parent
932818c75a
commit
9cbb3f591a
@ -467,12 +467,13 @@ static SDValue ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP,
|
||||
}
|
||||
|
||||
SDValue CPIdx = DAG.getConstantPool(LLVMC, TLI.getPointerTy());
|
||||
unsigned Alignment = 1 << cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
if (Extend)
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, OrigVT, DAG.getEntryNode(),
|
||||
CPIdx, PseudoSourceValue::getConstantPool(),
|
||||
0, VT);
|
||||
0, VT, false, Alignment);
|
||||
return DAG.getLoad(OrigVT, DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
PseudoSourceValue::getConstantPool(), 0, false, Alignment);
|
||||
}
|
||||
|
||||
|
||||
@ -4997,8 +4998,10 @@ SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) {
|
||||
}
|
||||
Constant *CP = ConstantVector::get(CV);
|
||||
SDValue CPIdx = DAG.getConstantPool(CP, TLI.getPointerTy());
|
||||
unsigned Alignment = 1 << cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
return DAG.getLoad(VT, DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
PseudoSourceValue::getConstantPool(), 0,
|
||||
false, Alignment);
|
||||
}
|
||||
|
||||
if (SplatValue.getNode()) { // Splat of one value?
|
||||
@ -5433,17 +5436,19 @@ ExpandIntToFP(bool isSigned, MVT DestTy, SDValue Source) {
|
||||
static Constant *FudgeFactor = ConstantInt::get(Type::Int64Ty, FF);
|
||||
|
||||
SDValue CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy());
|
||||
unsigned Alignment = 1 << cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset);
|
||||
SDValue FudgeInReg;
|
||||
if (DestTy == MVT::f32)
|
||||
FudgeInReg = DAG.getLoad(MVT::f32, DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
PseudoSourceValue::getConstantPool(), 0,
|
||||
false, Alignment);
|
||||
else if (DestTy.bitsGT(MVT::f32))
|
||||
// FIXME: Avoid the extend by construction the right constantpool?
|
||||
FudgeInReg = DAG.getExtLoad(ISD::EXTLOAD, DestTy, DAG.getEntryNode(),
|
||||
CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0,
|
||||
MVT::f32);
|
||||
MVT::f32, false, Alignment);
|
||||
else
|
||||
assert(0 && "Unexpected conversion");
|
||||
|
||||
@ -5582,17 +5587,19 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
static Constant *FudgeFactor = ConstantInt::get(Type::Int64Ty, FF);
|
||||
|
||||
SDValue CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy());
|
||||
unsigned Alignment = 1 << cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset);
|
||||
SDValue FudgeInReg;
|
||||
if (DestVT == MVT::f32)
|
||||
FudgeInReg = DAG.getLoad(MVT::f32, DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
PseudoSourceValue::getConstantPool(), 0,
|
||||
false, Alignment);
|
||||
else {
|
||||
FudgeInReg =
|
||||
LegalizeOp(DAG.getExtLoad(ISD::EXTLOAD, DestVT,
|
||||
DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0,
|
||||
MVT::f32));
|
||||
MVT::f32, false, Alignment));
|
||||
}
|
||||
|
||||
return DAG.getNode(ISD::FADD, DestVT, Tmp1, FudgeInReg);
|
||||
|
@ -1019,6 +1019,9 @@ SDValue SelectionDAG::getJumpTable(int JTI, MVT VT, bool isTarget){
|
||||
SDValue SelectionDAG::getConstantPool(Constant *C, MVT VT,
|
||||
unsigned Alignment, int Offset,
|
||||
bool isTarget) {
|
||||
if (Alignment == 0)
|
||||
Alignment =
|
||||
TLI.getTargetData()->getPreferredTypeAlignmentShift(C->getType());
|
||||
unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
|
||||
@ -1039,6 +1042,9 @@ SDValue SelectionDAG::getConstantPool(Constant *C, MVT VT,
|
||||
SDValue SelectionDAG::getConstantPool(MachineConstantPoolValue *C, MVT VT,
|
||||
unsigned Alignment, int Offset,
|
||||
bool isTarget) {
|
||||
if (Alignment == 0)
|
||||
Alignment =
|
||||
TLI.getTargetData()->getPreferredTypeAlignmentShift(C->getType());
|
||||
unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user