forked from OSchip/llvm-project
Implement support for long GEP indices on 32-bit archs and support for
int GEP indices on 64-bit archs. llvm-svn: 19354
This commit is contained in:
parent
4d5ba99283
commit
19a83990e1
|
@ -529,6 +529,7 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
|
|||
break;
|
||||
case ISD::ZERO_EXTEND:
|
||||
case ISD::SIGN_EXTEND:
|
||||
case ISD::TRUNCATE:
|
||||
case ISD::FP_EXTEND:
|
||||
case ISD::FP_ROUND:
|
||||
switch (getTypeAction(Node->getOperand(0).getValueType())) {
|
||||
|
|
|
@ -477,9 +477,20 @@ void SelectionDAGLowering::visitGetElementPtr(User &I) {
|
|||
if (!isa<Constant>(Idx) || !cast<Constant>(Idx)->isNullValue()) {
|
||||
// N = N + Idx * ElementSize;
|
||||
uint64_t ElementSize = TD.getTypeSize(Ty);
|
||||
SDOperand IdxN = getValue(Idx);
|
||||
IdxN = DAG.getNode(ISD::MUL, N.getValueType(), IdxN,
|
||||
getIntPtrConstant(ElementSize));
|
||||
SDOperand IdxN = getValue(Idx), Scale = getIntPtrConstant(ElementSize);
|
||||
|
||||
// If the index is smaller or larger than intptr_t, truncate or extend
|
||||
// it.
|
||||
if (IdxN.getValueType() < Scale.getValueType()) {
|
||||
if (Idx->getType()->isSigned())
|
||||
IdxN = DAG.getNode(ISD::SIGN_EXTEND, Scale.getValueType(), IdxN);
|
||||
else
|
||||
IdxN = DAG.getNode(ISD::ZERO_EXTEND, Scale.getValueType(), IdxN);
|
||||
} else if (IdxN.getValueType() > Scale.getValueType())
|
||||
IdxN = DAG.getNode(ISD::TRUNCATE, Scale.getValueType(), IdxN);
|
||||
|
||||
IdxN = DAG.getNode(ISD::MUL, N.getValueType(), IdxN, Scale);
|
||||
|
||||
N = DAG.getNode(ISD::ADD, N.getValueType(), N, IdxN);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue