[Beignet] [PATCH] GBE: use shift for PowerOf2 size when lowering GEP.
Ruiling Song
ruiling.song at intel.com
Mon Jan 23 05:31:54 UTC 2017
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 <ruiling.song at intel.com>
---
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
More information about the Beignet
mailing list