[PATCH] D50791: [SelectionDAG] unroll unsupported vector FP ops earlier to avoid libcalls on undef elements (PR38527)
Eli Friedman via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 15 12:59:31 PDT 2018
efriedma added inline comments.
================
Comment at: lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp:2445
+ EVT VT = N->getValueType(0);
+ EVT WideVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
+ if (TLI.isOperationExpand(N->getOpcode(), WideVecVT) &&
----------------
spatel wrote:
> efriedma wrote:
> > I think you need to call TLI.getRegisterType() rather than getTypeToTransformTo()? Consider what happens to, for example, `<5 x f32>` on AArch64.
> I initially didn't step through that test since it showed no diffs, but here's what I see in the debug output for that case:
> VT = v5f32
> WideVecVT = v8f32 (is it expected that we ask to widen to the next pow-of-2 size?)
>
> ```
> Legalizing node: t12: v5f32 = fsin t11
> Analyzing result type: v5f32
> Widen node result 0: t12: v5f32 = fsin t11
>
> Creating new node: t36: f32 = fsin t2
> Creating new node: t37: f32 = fsin t4
> Creating new node: t38: f32 = fsin t6
> Creating new node: t39: f32 = fsin t8
> Creating new node: t40: f32 = fsin t10
> Creating new node: t41: v8f32 = BUILD_VECTOR t36, t37, t38, t39, t40, undef:f32, undef:f32, undef:f32
>
> ```
>
> I copied the getTypeToTransformTo() call from the implementation of WidenVecRes_Unary(), so that's what we use if we fall-through. Should there be a difference in the call based on what we're using that type for (UnrollVectorOp() vs. GetWidenedVector())?
Thinking about it a bit more, you'd probably get the same result if you just didn't try to compute the vector type at all, and just check `TLI.isOperationExpand(N->getOpcode(), VT.getScalarType()`. (If a vector operation is legal, the equivalent scalar operation is generally also legal.)
https://reviews.llvm.org/D50791
More information about the llvm-commits
mailing list