[PATCH] D63609: [SLP] Support unary FNeg vectorization
Cameron McInally via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 20 09:34:37 PDT 2019
cameron.mcinally created this revision.
cameron.mcinally added reviewers: spatel, arsenm, craig.topper, andrew.w.kaylor, kpn, nadav, RKSimon, ABataev, hans.
Herald added subscribers: llvm-commits, hiraditya, wdng.
Herald added a project: LLVM.
How should we proceed with the cost estimate for a unary FNeg? Is it worth creating a `getUnaryInstrCost(...)` function or similar to model this one operation?
If I'm understanding the code correctly, I've added a small change to treat a unary FNeg as a generic FP operation. That's probably not so accurate though...
Repository:
rL LLVM
https://reviews.llvm.org/D63609
Files:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/X86/phi3.ll
Index: llvm/test/Transforms/SLPVectorizer/X86/phi3.ll
===================================================================
--- llvm/test/Transforms/SLPVectorizer/X86/phi3.ll
+++ llvm/test/Transforms/SLPVectorizer/X86/phi3.ll
@@ -54,13 +54,11 @@
define void @Rf_GReset_unary_fneg() {
; CHECK-LABEL: @Rf_GReset_unary_fneg(
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[SUB:%.*]] = fneg double undef
; CHECK-NEXT: [[TMP0:%.*]] = load double, double* @d, align 8
-; CHECK-NEXT: [[SUB1:%.*]] = fneg double [[TMP0]]
+; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> undef, double [[TMP0]], i32 1
+; CHECK-NEXT: [[TMP2:%.*]] = fneg <2 x double> [[TMP1]]
; CHECK-NEXT: br i1 icmp eq (%struct.GPar.0.16.26* (...)* inttoptr (i64 115 to %struct.GPar.0.16.26* (...)*), %struct.GPar.0.16.26* (...)* @Rf_gpptr), label [[IF_THEN:%.*]], label [[IF_END7:%.*]]
; CHECK: if.then:
-; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> undef, double [[SUB]], i32 0
-; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> [[TMP1]], double [[SUB1]], i32 1
; CHECK-NEXT: [[TMP3:%.*]] = fsub <2 x double> [[TMP2]], undef
; CHECK-NEXT: [[TMP4:%.*]] = fdiv <2 x double> [[TMP3]], undef
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x double> [[TMP4]], i32 0
Index: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -2390,6 +2390,7 @@
return;
}
case Instruction::Select:
+ case Instruction::FNeg:
case Instruction::Add:
case Instruction::FAdd:
case Instruction::Sub:
@@ -2409,7 +2410,7 @@
case Instruction::Or:
case Instruction::Xor: {
auto *TE = newTreeEntry(VL, true, UserTreeIdx, ReuseShuffleIndicies);
- LLVM_DEBUG(dbgs() << "SLP: added a vector of bin op.\n");
+ LLVM_DEBUG(dbgs() << "SLP: added a vector of un/bin op.\n");
// Sort operands of the instructions so that each side is more likely to
// have the same opcode.
@@ -2881,6 +2882,7 @@
int VecCost = TTI->getCmpSelInstrCost(S.getOpcode(), VecTy, MaskTy, VL0);
return ReuseShuffleCost + VecCost - ScalarCost;
}
+ case Instruction::FNeg:
case Instruction::Add:
case Instruction::FAdd:
case Instruction::Sub:
@@ -2918,7 +2920,8 @@
ConstantInt *CInt0 = nullptr;
for (unsigned i = 0, e = VL.size(); i < e; ++i) {
const Instruction *I = cast<Instruction>(VL[i]);
- ConstantInt *CInt = dyn_cast<ConstantInt>(I->getOperand(1));
+ unsigned OpIdx = isa<BinaryOperator>(I) ? 1 : 0;
+ ConstantInt *CInt = dyn_cast<ConstantInt>(I->getOperand(OpIdx));
if (!CInt) {
Op2VK = TargetTransformInfo::OK_AnyValue;
Op2VP = TargetTransformInfo::OP_None;
@@ -3698,6 +3701,31 @@
++NumVectorInstructions;
return V;
}
+ case Instruction::FNeg: {
+ setInsertPointAfterBundle(E->Scalars, S);
+
+ Value *Op = vectorizeTree(E->getOperand(0));
+
+ if (E->VectorizedValue) {
+ LLVM_DEBUG(dbgs() << "SLP: Diamond merged for " << *VL0 << ".\n");
+ return E->VectorizedValue;
+ }
+
+ Value *V = Builder.CreateUnOp(
+ static_cast<Instruction::UnaryOps>(S.getOpcode()), Op);
+ propagateIRFlags(V, E->Scalars, VL0);
+ if (auto *I = dyn_cast<Instruction>(V))
+ V = propagateMetadata(I, E->Scalars);
+
+ if (NeedToShuffleReuses) {
+ V = Builder.CreateShuffleVector(V, UndefValue::get(VecTy),
+ E->ReuseShuffleIndices, "shuffle");
+ }
+ E->VectorizedValue = V;
+ ++NumVectorInstructions;
+
+ return V;
+ }
case Instruction::Add:
case Instruction::FAdd:
case Instruction::Sub:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63609.205827.patch
Type: text/x-patch
Size: 3860 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190620/9a9257fa/attachment.bin>
More information about the llvm-commits
mailing list