This patch looks good to me. As discuss, we would better add the similar optimize in GEN selection, because GEP lower is a part of PowerOf 2 multiply. I will add it later.
> -----Original Message----- > From: Beignet [mailto:[email protected]] On Behalf Of > Ruiling Song > Sent: Monday, January 23, 2017 13:32 > To: [email protected] > Cc: Song, Ruiling <[email protected]> > Subject: [Beignet] [PATCH] GBE: use shift for PowerOf2 size when lowering > GEP. > > For 64bit address, the multiply would expand to several instructions. > As for most time, the size is PowerOf 2. So we can use left-shift to do this. > > Signed-off-by: Ruiling Song <[email protected]> > --- > backend/src/llvm/llvm_passes.cpp | 19 +++++++++++++------ > 1 file changed, 13 insertions(+), 6 deletions(-) > > diff --git a/backend/src/llvm/llvm_passes.cpp > b/backend/src/llvm/llvm_passes.cpp > index 367a2c3..c5f3ffe 100644 > --- a/backend/src/llvm/llvm_passes.cpp > +++ b/backend/src/llvm/llvm_passes.cpp > @@ -276,8 +276,6 @@ namespace gbe > uint32_t align = getAlignmentByte(unit, elementType); > size += getPadding(size, align); > > - Constant* newConstSize = > - ConstantInt::get(IntegerType::get(GEPInst->getContext(), ptrSize), > size); > > Value *operand = GEPInst->getOperand(op); > > @@ -308,13 +306,22 @@ namespace gbe > } > } > #endif > - Value* tmpMul = operand; > + Value* tmpOffset = operand; > if (size != 1) { > - tmpMul = BinaryOperator::Create(Instruction::Mul, newConstSize, > operand, > - "", GEPInst); > + if (isPowerOf<2>(size)) { > + Constant* shiftAmnt = > + ConstantInt::get(IntegerType::get(GEPInst->getContext(), > ptrSize), > logi2(size)); > + tmpOffset = BinaryOperator::Create(Instruction::Shl, operand, > shiftAmnt, > + "", GEPInst); > + } else{ > + Constant* sizeConst = > + ConstantInt::get(IntegerType::get(GEPInst->getContext(), > ptrSize), > size); > + tmpOffset = BinaryOperator::Create(Instruction::Mul, sizeConst, > operand, > + "", GEPInst); > + } > } > currentAddrInst = > - BinaryOperator::Create(Instruction::Add, currentAddrInst, tmpMul, > + BinaryOperator::Create(Instruction::Add, currentAddrInst, > + tmpOffset, > "", GEPInst); > } > > -- > 2.4.1 > > _______________________________________________ > Beignet mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
