[PATCH] D43974: [AArch64] Adjust the cost of integer vector division
Evandro Menezes via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 1 14:30:07 PST 2018
evandro created this revision.
evandro added reviewers: t.p.northover, mssimpso.
Herald added subscribers: llvm-commits, hiraditya, kristof.beyls, javed.absar, rengolin.
Since there is no legal instruction for integer vector division, factor in the cost of singling out each element to be used with the scalar division instruction.
Repository:
rL LLVM
https://reviews.llvm.org/D43974
Files:
llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
Index: llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
+++ llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
@@ -493,32 +493,49 @@
int ISD = TLI->InstructionOpcodeToISD(Opcode);
- if (ISD == ISD::SDIV &&
- Opd2Info == TargetTransformInfo::OK_UniformConstantValue &&
- Opd2PropInfo == TargetTransformInfo::OP_PowerOf2) {
- // On AArch64, scalar signed division by constants power-of-two are
- // normally expanded to the sequence ADD + CMP + SELECT + SRA.
- // The OperandValue properties many not be same as that of previous
- // operation; conservatively assume OP_None.
- Cost += getArithmeticInstrCost(Instruction::Add, Ty, Opd1Info, Opd2Info,
- TargetTransformInfo::OP_None,
- TargetTransformInfo::OP_None);
- Cost += getArithmeticInstrCost(Instruction::Sub, Ty, Opd1Info, Opd2Info,
- TargetTransformInfo::OP_None,
- TargetTransformInfo::OP_None);
- Cost += getArithmeticInstrCost(Instruction::Select, Ty, Opd1Info, Opd2Info,
- TargetTransformInfo::OP_None,
- TargetTransformInfo::OP_None);
- Cost += getArithmeticInstrCost(Instruction::AShr, Ty, Opd1Info, Opd2Info,
- TargetTransformInfo::OP_None,
- TargetTransformInfo::OP_None);
- return Cost;
- }
-
switch (ISD) {
default:
return Cost + BaseT::getArithmeticInstrCost(Opcode, Ty, Opd1Info, Opd2Info,
Opd1PropInfo, Opd2PropInfo);
+ case ISD::SDIV:
+ if (Opd2Info == TargetTransformInfo::OK_UniformConstantValue &&
+ Opd2PropInfo == TargetTransformInfo::OP_PowerOf2) {
+ // On AArch64, scalar signed division by constants power-of-two are
+ // normally expanded to the sequence ADD + CMP + SELECT + SRA.
+ // The OperandValue properties many not be same as that of previous
+ // operation; conservatively assume OP_None.
+ Cost += getArithmeticInstrCost(Instruction::Add, Ty, Opd1Info, Opd2Info,
+ TargetTransformInfo::OP_None,
+ TargetTransformInfo::OP_None);
+ Cost += getArithmeticInstrCost(Instruction::Sub, Ty, Opd1Info, Opd2Info,
+ TargetTransformInfo::OP_None,
+ TargetTransformInfo::OP_None);
+ Cost += getArithmeticInstrCost(Instruction::Select, Ty, Opd1Info, Opd2Info,
+ TargetTransformInfo::OP_None,
+ TargetTransformInfo::OP_None);
+ Cost += getArithmeticInstrCost(Instruction::AShr, Ty, Opd1Info, Opd2Info,
+ TargetTransformInfo::OP_None,
+ TargetTransformInfo::OP_None);
+ return Cost;
+ }
+ LLVM_FALLTHROUGH;
+ case ISD::UDIV:
+ Cost += BaseT::getArithmeticInstrCost(Opcode, Ty, Opd1Info, Opd2Info,
+ Opd1PropInfo, Opd2PropInfo);
+ if (Ty->isVectorTy()) {
+ // On AArch64, vector divisions are not supported natively and are
+ // expanded into scalar divisions of each pair of elements.
+ // Conservatively assume OP_None.
+ Cost += getArithmeticInstrCost(Instruction::ExtractElement, Ty, Opd1Info,
+ Opd2Info, Opd1PropInfo, Opd2PropInfo);
+ Cost += getArithmeticInstrCost(Instruction::InsertElement, Ty, Opd1Info,
+ Opd2Info, Opd1PropInfo, Opd2PropInfo);
+ // TODO: if one of the arguments is a scalar, then it's not necessary to
+ // double the cost of handling the vector elements.
+ Cost += Cost;
+ }
+ return Cost;
+
case ISD::ADD:
case ISD::MUL:
case ISD::XOR:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43974.136606.patch
Type: text/x-patch
Size: 4079 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180301/3ab89975/attachment.bin>
More information about the llvm-commits
mailing list