forked from OSchip/llvm-project
[NFC] Replace several manual GEP loops with gep_type_iterator.
Reviewers: dblaikie Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D16335 llvm-svn: 258262
This commit is contained in:
parent
7077f0af26
commit
23c4d83aa3
|
@ -56,6 +56,7 @@
|
|||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GetElementPtrTypeIterator.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
|
@ -492,13 +493,11 @@ bool FastISel::selectGetElementPtr(const User *I) {
|
|||
uint64_t TotalOffs = 0;
|
||||
// FIXME: What's a good SWAG number for MaxOffs?
|
||||
uint64_t MaxOffs = 2048;
|
||||
Type *Ty = I->getOperand(0)->getType();
|
||||
MVT VT = TLI.getPointerTy(DL);
|
||||
for (GetElementPtrInst::const_op_iterator OI = I->op_begin() + 1,
|
||||
E = I->op_end();
|
||||
OI != E; ++OI) {
|
||||
const Value *Idx = *OI;
|
||||
if (auto *StTy = dyn_cast<StructType>(Ty)) {
|
||||
for (gep_type_iterator GTI = gep_type_begin(I), E = gep_type_end(I);
|
||||
GTI != E; ++GTI) {
|
||||
const Value *Idx = GTI.getOperand();
|
||||
if (auto *StTy = dyn_cast<StructType>(*GTI)) {
|
||||
uint64_t Field = cast<ConstantInt>(Idx)->getZExtValue();
|
||||
if (Field) {
|
||||
// N = N + Offset
|
||||
|
@ -511,15 +510,8 @@ bool FastISel::selectGetElementPtr(const User *I) {
|
|||
TotalOffs = 0;
|
||||
}
|
||||
}
|
||||
Ty = StTy->getElementType(Field);
|
||||
} else {
|
||||
if (Ty->isPointerTy()) {
|
||||
// The only pointer type is for the very first index,
|
||||
// therefore the next type is the source element type.
|
||||
Ty = cast<GEPOperator>(I)->getSourceElementType();
|
||||
} else {
|
||||
Ty = cast<SequentialType>(Ty)->getElementType();
|
||||
}
|
||||
Type *Ty = GTI.getIndexedType();
|
||||
|
||||
// If this is a constant subscript, handle it quickly.
|
||||
if (const auto *CI = dyn_cast<ConstantInt>(Idx)) {
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "llvm/IR/DebugInfo.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GetElementPtrTypeIterator.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/InlineAsm.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
|
@ -2982,8 +2983,7 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
|
|||
Value *Op0 = I.getOperand(0);
|
||||
// Note that the pointer operand may be a vector of pointers. Take the scalar
|
||||
// element which holds a pointer.
|
||||
Type *Ty = Op0->getType()->getScalarType();
|
||||
unsigned AS = Ty->getPointerAddressSpace();
|
||||
unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
|
||||
SDValue N = getValue(Op0);
|
||||
SDLoc dl = getCurSDLoc();
|
||||
|
||||
|
@ -2997,10 +2997,10 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
|
|||
SmallVector<SDValue, 16> Ops(VectorWidth, N);
|
||||
N = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);
|
||||
}
|
||||
for (GetElementPtrInst::const_op_iterator OI = I.op_begin()+1, E = I.op_end();
|
||||
OI != E; ++OI) {
|
||||
const Value *Idx = *OI;
|
||||
if (StructType *StTy = dyn_cast<StructType>(Ty)) {
|
||||
for (gep_type_iterator GTI = gep_type_begin(&I), E = gep_type_end(&I);
|
||||
GTI != E; ++GTI) {
|
||||
const Value *Idx = GTI.getOperand();
|
||||
if (StructType *StTy = dyn_cast<StructType>(*GTI)) {
|
||||
unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
|
||||
if (Field) {
|
||||
// N = N + Offset
|
||||
|
@ -3015,21 +3015,11 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
|
|||
N = DAG.getNode(ISD::ADD, dl, N.getValueType(), N,
|
||||
DAG.getConstant(Offset, dl, N.getValueType()), &Flags);
|
||||
}
|
||||
|
||||
Ty = StTy->getElementType(Field);
|
||||
} else {
|
||||
if (Ty->isPointerTy()) {
|
||||
// The only pointer type is for the very first index,
|
||||
// therefore the next type is the source element type.
|
||||
Ty = cast<GEPOperator>(&I)->getSourceElementType();
|
||||
} else {
|
||||
Ty = cast<SequentialType>(Ty)->getElementType();
|
||||
}
|
||||
|
||||
MVT PtrTy =
|
||||
DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout(), AS);
|
||||
unsigned PtrSize = PtrTy.getSizeInBits();
|
||||
APInt ElementSize(PtrSize, DL->getTypeAllocSize(Ty));
|
||||
APInt ElementSize(PtrSize, DL->getTypeAllocSize(GTI.getIndexedType()));
|
||||
|
||||
// If this is a scalar constant or a splat vector of constants,
|
||||
// handle it quickly.
|
||||
|
|
|
@ -555,10 +555,9 @@ bool AArch64FastISel::computeAddress(const Value *Obj, Address &Addr, Type *Ty)
|
|||
|
||||
// Iterate through the GEP folding the constants into offsets where
|
||||
// we can.
|
||||
gep_type_iterator GTI = gep_type_begin(U);
|
||||
for (User::const_op_iterator i = U->op_begin() + 1, e = U->op_end(); i != e;
|
||||
++i, ++GTI) {
|
||||
const Value *Op = *i;
|
||||
for (gep_type_iterator GTI = gep_type_begin(U), E = gep_type_end(U);
|
||||
GTI != E; ++GTI) {
|
||||
const Value *Op = GTI.getOperand();
|
||||
if (StructType *STy = dyn_cast<StructType>(*GTI)) {
|
||||
const StructLayout *SL = DL.getStructLayout(STy);
|
||||
unsigned Idx = cast<ConstantInt>(Op)->getZExtValue();
|
||||
|
@ -4814,24 +4813,18 @@ bool AArch64FastISel::selectGetElementPtr(const Instruction *I) {
|
|||
// Keep a running tab of the total offset to coalesce multiple N = N + Offset
|
||||
// into a single N = N + TotalOffset.
|
||||
uint64_t TotalOffs = 0;
|
||||
Type *Ty = I->getOperand(0)->getType();
|
||||
MVT VT = TLI.getPointerTy(DL);
|
||||
for (auto OI = std::next(I->op_begin()), E = I->op_end(); OI != E; ++OI) {
|
||||
const Value *Idx = *OI;
|
||||
if (auto *StTy = dyn_cast<StructType>(Ty)) {
|
||||
for (gep_type_iterator GTI = gep_type_begin(I), E = gep_type_end(I);
|
||||
GTI != E; ++GTI) {
|
||||
const Value *Idx = GTI.getOperand();
|
||||
if (auto *StTy = dyn_cast<StructType>(*GTI)) {
|
||||
unsigned Field = cast<ConstantInt>(Idx)->getZExtValue();
|
||||
// N = N + Offset
|
||||
if (Field)
|
||||
TotalOffs += DL.getStructLayout(StTy)->getElementOffset(Field);
|
||||
Ty = StTy->getElementType(Field);
|
||||
} else {
|
||||
if (Ty->isPointerTy()) {
|
||||
// The only pointer type is for the very first index,
|
||||
// therefore the next type is the source element type.
|
||||
Ty = cast<GEPOperator>(I)->getSourceElementType();
|
||||
} else {
|
||||
Ty = cast<SequentialType>(Ty)->getElementType();
|
||||
}
|
||||
Type *Ty = GTI.getIndexedType();
|
||||
|
||||
// If this is a constant subscript, handle it quickly.
|
||||
if (const auto *CI = dyn_cast<ConstantInt>(Idx)) {
|
||||
if (CI->isZero())
|
||||
|
|
Loading…
Reference in New Issue