llvm-project
48ce7bb0 - [LV] Fix bug in setVectorizedCallDecision (#175742)

Commit
90 days ago
[LV] Fix bug in setVectorizedCallDecision (#175742) There is a bug in this logic: ``` InstructionCost Cost = ScalarCost; InstWidening Decision = CM_Scalarize; if (VectorCost <= Cost) { Cost = VectorCost; Decision = CM_VectorCall; } if (IntrinsicCost <= Cost) { Cost = IntrinsicCost; Decision = CM_IntrinsicCall; } ``` because it assumes that the comparisons behave sensibly in the face of invalid costs. Unfortunately, PR #174835 exposes an issue when attempting to vectorise the new test uadd_with_overflow_i32 for AArch64 targets. Specifically, there are situations where all costs are invalid (e.g. VF=vscale x 1), but some costs are more invalid than others. For example, when querying the intrinsic cost via the TTI hook we get an invalid cost with a non-zero value, whereas the vector cost is invalid with a zero value. That leads to us erroneously choosing CM_VectorCall as the call widening decision, despite the lack of a vector math variant. Inevitably this causes crashes because we create a VPCallWidenRecipe without a variant function. Fix this by only performing comparisons if the costs are valid. It now leads to us choosing CM_Scalarize more often, but it's a toin coss anyway between CM_Scalarize and CM_IntrinsicCall when both strategies are invalid. Potentially we could also create a new strategy called CM_Invalid, and avoid the creation of VPlans entirely.
Author
Parents
Loading