#
bd0b1311 |
| 26-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Turn VPReplicateRecipe into a VPValue.
Update VPReplicateRecipe to inherit from VPValue. This still does not update scalarizeInstruction to set the result for the VPValue of VPReplicateRecip
[VPlan] Turn VPReplicateRecipe into a VPValue.
Update VPReplicateRecipe to inherit from VPValue. This still does not update scalarizeInstruction to set the result for the VPValue of VPReplicateRecipe, because this first requires tracking scalar values in VPTransformState.
Reviewed By: reames
Differential Revision: https://reviews.llvm.org/D91500
show more ...
|
#
e0c479cd |
| 25-Nov-2020 |
David Green <david.green@arm.com> |
[VPlan] Switch VPWidenRecipe to be a VPValue
Similar to other patches, this makes VPWidenRecipe a VPValue. Because of the way it interacts with the reduction code it also slightly alters the way tha
[VPlan] Switch VPWidenRecipe to be a VPValue
Similar to other patches, this makes VPWidenRecipe a VPValue. Because of the way it interacts with the reduction code it also slightly alters the way that VPValues are registered, removing the up front NeedDef and using getOrAddVPValue to create them on-demand if needed instead.
Differential Revision: https://reviews.llvm.org/D88447
show more ...
|
#
00a66011 |
| 24-Nov-2020 |
David Green <david.green@arm.com> |
[VPlan] Turn VPReductionRecipe into a VPValue
This converts the VPReductionRecipe into a VPValue, like other VPRecipe's in preparation for traversing def-use chains. It also makes it a VPUser, now s
[VPlan] Turn VPReductionRecipe into a VPValue
This converts the VPReductionRecipe into a VPValue, like other VPRecipe's in preparation for traversing def-use chains. It also makes it a VPUser, now storing the used VPValues as operands.
It doesn't yet change how the VPReductionRecipes are created. It will need to call replaceAllUsesWith from the original recipe they replace, but that is not done yet as VPWidenRecipe need to be created first.
Differential Revision: https://reviews.llvm.org/D88382
show more ...
|
#
52f3714d |
| 17-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Add VPDef class.
This patch introduces a new VPDef class, which can be used to manage VPValues defined by recipes/VPInstructions.
The idea here is to mirror VPUser for values defined by a r
[VPlan] Add VPDef class.
This patch introduces a new VPDef class, which can be used to manage VPValues defined by recipes/VPInstructions.
The idea here is to mirror VPUser for values defined by a recipe. A VPDef can produce either zero (e.g. a store recipe), one (most recipes) or multiple (VPInterleaveRecipe) result VPValues.
To traverse the def-use chain from a VPDef to its users, one has to traverse the users of all values defined by a VPDef.
VPValues now contain a pointer to their corresponding VPDef, if one exists. To traverse the def-use chain upwards from a VPValue, we first need to check if the VPValue is defined by a VPDef. If it does not have a VPDef, this means we have a VPValue that is not directly defined iniside the plan and we are done.
If we have a VPDef, it is defined inside the region by a recipe, which is a VPUser, and the upwards def-use chain traversal continues by traversing all its operands.
Note that we need to add an additional field to to VPVAlue to link them to their defs. The space increase is going to be offset by being able to remove the SubclassID field in future patches.
Reviewed By: Ayal
Differential Revision: https://reviews.llvm.org/D90558
show more ...
|
#
0c119ba8 |
| 15-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Use VPValue def for VPWidenGEPRecipe.
This patch turns VPWidenGEPRecipe into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR reference where possib
[VPlan] Use VPValue def for VPWidenGEPRecipe.
This patch turns VPWidenGEPRecipe into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR reference where possible.
Reviewed By: dmgreen
Differential Revision: https://reviews.llvm.org/D84683
show more ...
|
#
a70b511e |
| 13-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
Recommit "[VPlan] Use VPValue def for VPWidenSelectRecipe."
This reverts the revert commit c8d73d939fa4fda9c87b3979225d02d63062bd68.
It includes a fix for cases where we missed inserting VPValues f
Recommit "[VPlan] Use VPValue def for VPWidenSelectRecipe."
This reverts the revert commit c8d73d939fa4fda9c87b3979225d02d63062bd68.
It includes a fix for cases where we missed inserting VPValues for some selects, which should fix PR48142.
show more ...
|
#
c8d73d93 |
| 10-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
Revert "[VPlan] Use VPValue def for VPWidenSelectRecipe."
This reverts commit a8e50f1c6e7b404aab8fedb972f003a4d6a6434e.
This reportedly breaks building the Linux kernel. https://bugs.llvm.org/sho
Revert "[VPlan] Use VPValue def for VPWidenSelectRecipe."
This reverts commit a8e50f1c6e7b404aab8fedb972f003a4d6a6434e.
This reportedly breaks building the Linux kernel. https://bugs.llvm.org/show_bug.cgi?id=48142
show more ...
|
#
a8e50f1c |
| 10-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Use VPValue def for VPWidenSelectRecipe.
This patch turns VPWidenSelectRecipe into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR reference where
[VPlan] Use VPValue def for VPWidenSelectRecipe.
This patch turns VPWidenSelectRecipe into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR reference where possible.
Reviewed By: dmgreen
Differential Revision: https://reviews.llvm.org/D84682
show more ...
|
#
f0d76275 |
| 09-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Print result value for loads in VPWidenMemoryInst (NFC).
For loads, print the result value.
|
#
fec64de2 |
| 09-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Use VPValue def for VPWidenCall.
This patch turns VPWidenCall into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR reference where possible.
Revie
[VPlan] Use VPValue def for VPWidenCall.
This patch turns VPWidenCall into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR reference where possible.
Reviewed By: dmgreen
Differential Revision: https://reviews.llvm.org/D84681
show more ...
|
#
091c5c9a |
| 09-Nov-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Add printOperands helper to VPUser (NFC).
Factor out the code for printing operands of a VPUser so it can be re-used when printing other recipes.
|
#
aa1a198a |
| 30-Oct-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Use isa<> instead getVPRecipeID in getFirstNonPhi (NFC).
As per the comment in VPRecipeBase, clients should not rely on getVPRecipeID, as it may change in the future. It should only be used
[VPlan] Use isa<> instead getVPRecipeID in getFirstNonPhi (NFC).
As per the comment in VPRecipeBase, clients should not rely on getVPRecipeID, as it may change in the future. It should only be used in classof implementations. Use isa instead in getFirstNonPhi.
show more ...
|
#
93f6c6b7 |
| 13-Oct-2020 |
Florian Hahn <flo@fhahn.com> |
Recommit "[VPlan] Use VPValue def for VPMemoryInstructionRecipe."
This reverts the revert commit 710aceb645e7dba4de7053eef2c616311b9163d4 and includes a fix for a memsan failure.
Original message:
Recommit "[VPlan] Use VPValue def for VPMemoryInstructionRecipe."
This reverts the revert commit 710aceb645e7dba4de7053eef2c616311b9163d4 and includes a fix for a memsan failure.
Original message:
This patch turns VPMemoryInstructionRecipe into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR reference where possible.
show more ...
|
#
710aceb6 |
| 13-Oct-2020 |
Vitaly Buka <vitalybuka@google.com> |
Revert "[VPlan] Use VPValue def for VPMemoryInstructionRecipe."
It introduced a memory leak.
This reverts commit 525b085a65d30a5f2ae2af38c0be252fe8d4781b.
|
#
525b085a |
| 12-Oct-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Use VPValue def for VPMemoryInstructionRecipe.
This patch turns VPMemoryInstructionRecipe into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR refe
[VPlan] Use VPValue def for VPMemoryInstructionRecipe.
This patch turns VPMemoryInstructionRecipe into a VPValue and uses it during VPlan construction and codegeneration instead of the plain IR reference where possible.
Reviewed By: dmgreen
Differential Revision: https://reviews.llvm.org/D84680
show more ...
|
Revision tags: llvmorg-11.0.0, llvmorg-11.0.0-rc6 |
|
#
ea058d28 |
| 02-Oct-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Use operands for printing of VPWidenMemoryInstructionRecipe.
Now that operands of the recipe are managed through VPUser, we can simplify the printing by just using the operands.
|
Revision tags: llvmorg-11.0.0-rc5, llvmorg-11.0.0-rc4 |
|
#
c5ba0d33 |
| 23-Sep-2020 |
David Sherwood <david.sherwood@arm.com> |
[SVE] Make ElementCount and TypeSize use a new PolySize class
I have introduced a new template PolySize class, where the template parameter determines the type of quantity, i.e. for an element count
[SVE] Make ElementCount and TypeSize use a new PolySize class
I have introduced a new template PolySize class, where the template parameter determines the type of quantity, i.e. for an element count this is just an unsigned value. The ElementCount class is now just a simple derivation of PolySize<unsigned>, whereas TypeSize is more complicated because it still needs to contain the uint64_t cast operator, since there are still many places in the code that rely upon this implicit cast. As such the class also still needs some of it's own operators.
I've tried to minimise the amount of code in the base PolySize class, which led to a couple of changes:
1. In some places we were relying on '==' operator comparisons between ElementCounts and the scalar value 1. I didn't put this operator in the new PolySize class, and thought it was actually clearer to use the isScalar() function instead. 2. I removed the isByteSized function and replaced it with calls to isKnownMultipleOf(8).
I've also renamed NextPowerOf2 to be coefficientNextPowerOf2 so that it's more consistent with coefficientDivideBy.
Differential Revision: https://reviews.llvm.org/D88409
show more ...
|
#
be6e8e50 |
| 11-Oct-2020 |
David Green <david.green@arm.com> |
[LV] Tail folded inloop reductions.
This expands upon the inloop reductions added in e9761688e41cb9e976, allowing them to be inserted into tail folded loops. Reductions are generates with the form:
[LV] Tail folded inloop reductions.
This expands upon the inloop reductions added in e9761688e41cb9e976, allowing them to be inserted into tail folded loops. Reductions are generates with the form:
x = select(mask, vecop, zero) v = vecreduce.add(x) c = add chain, v
Where zero here is chosen as the identity value for add reductions. The backend is then expected to fold the select and the vecreduce into a single predicated instruction.
Most of the code is fairly straight forward, except for the creation of blockmasks which need to ensure they are created in dominance order. The order they are added is altered to be after any phis, keeping the requirements for the underlying IR.
Differential Revision: https://reviews.llvm.org/D84451
show more ...
|
#
348d85a6 |
| 03-Oct-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Clean up uses/operands on VPBB deletion.
Update the code responsible for deleting VPBBs and recipes to properly update users and release operands.
This is another preparation for D84680 & f
[VPlan] Clean up uses/operands on VPBB deletion.
Update the code responsible for deleting VPBBs and recipes to properly update users and release operands.
This is another preparation for D84680 & following patches towards enabling modeling def-use chains in VPlan.
show more ...
|
#
357bbaab |
| 02-Oct-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Add VPRecipeBase::toVPUser helper (NFC).
This adds a helper to convert a VPRecipeBase pointer to a VPUser, for recipes that inherit from VPUser. Once VPRecipeBase directly inherits from VPUs
[VPlan] Add VPRecipeBase::toVPUser helper (NFC).
This adds a helper to convert a VPRecipeBase pointer to a VPUser, for recipes that inherit from VPUser. Once VPRecipeBase directly inherits from VPUser this helper can be removed.
show more ...
|
#
f5fe7abe |
| 03-Oct-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Account for removed users in replaceAllUsesWith.
Make sure we do not iterate using an invalid iterator.
Another small fix/step towards traversing the def-use chains in VPlan.
|
Revision tags: llvmorg-11.0.0-rc3 |
|
#
c671e34b |
| 14-Sep-2020 |
Florian Hahn <flo@fhahn.com> |
[VPlan] Add dump() helper to VPValue & VPRecipeBase.
This provides a convenient way to print VPValues and recipes in a debugger. In particular it saves the user from instantiating VPSlotTracker to p
[VPlan] Add dump() helper to VPValue & VPRecipeBase.
This provides a convenient way to print VPValues and recipes in a debugger. In particular it saves the user from instantiating VPSlotTracker to print recipes or values.
show more ...
|
Revision tags: llvmorg-11.0.0-rc2 |
|
#
f4257c58 |
| 14-Aug-2020 |
David Sherwood <david.sherwood@arm.com> |
[SVE] Make ElementCount members private
This patch changes ElementCount so that the Min and Scalable members are now private and can only be accessed via the get functions getKnownMinValue() and isS
[SVE] Make ElementCount members private
This patch changes ElementCount so that the Min and Scalable members are now private and can only be accessed via the get functions getKnownMinValue() and isScalable(). In addition I've added some other member functions for more commonly used operations. Hopefully this makes the class more useful and will reduce the need for calling getKnownMinValue().
Differential Revision: https://reviews.llvm.org/D86065
show more ...
|
#
ae366479 |
| 25-Aug-2020 |
Sjoerd Meijer <sjoerd.meijer@arm.com> |
[LV] get.active.lane.mask consuming tripcount instead of backedge-taken count
This adapts LV to the new semantics of get.active.lane.mask as discussed in D86147, which means that the LV now emits in
[LV] get.active.lane.mask consuming tripcount instead of backedge-taken count
This adapts LV to the new semantics of get.active.lane.mask as discussed in D86147, which means that the LV now emits intrinsic get.active.lane.mask with the loop tripcount instead of the backedge-taken count as its second argument. The motivation for this is described in D86147.
Differential Revision: https://reviews.llvm.org/D86304
show more ...
|
#
5a34b3ab |
| 07-Aug-2020 |
Francesco Petrogalli <francesco.petrogalli@arm.com> |
[llvm][LV] Replace `unsigned VF` with `ElementCount VF` [NFCI]
Changes:
* Change `ToVectorTy` to deal directly with `ElementCount` instances. * `VF == 1` replaced with `VF.isScalar()`. * `VF > 1` a
[llvm][LV] Replace `unsigned VF` with `ElementCount VF` [NFCI]
Changes:
* Change `ToVectorTy` to deal directly with `ElementCount` instances. * `VF == 1` replaced with `VF.isScalar()`. * `VF > 1` and `VF >=2` replaced with `VF.isVector()`. * `VF <=1` is replaced with `VF.isZero() || VF.isScalar()`. * Replaced the uses of `llvm::SmallSet<ElementCount, ...>` with `llvm::SmallSetVector<ElementCount, ...>`. This avoids the need of an ordering function for the `ElementCount` class. * Bits and pieces around printing the `ElementCount` to string streams.
To guarantee that this change is a NFC, `VF.Min` and asserts are used in the following places:
1. When it doesn't make sense to deal with the scalable property, for example: a. When computing unrolling factors. b. When shuffle masks are built for fixed width vector types In this cases, an assert(!VF.Scalable && "<mgs>") has been added to make sure we don't enter coepaths that don't make sense for scalable vectors. 2. When there is a conscious decision to use `FixedVectorType`. These uses of `FixedVectorType` will likely be removed in favour of `VectorType` once the vectorizer is generic enough to deal with both fixed vector types and scalable vector types. 3. When dealing with building constants out of the value of VF, for example when computing the vectorization `step`, or building vectors of indices. These operation _make sense_ for scalable vectors too, but changing the code in these places to be generic and make it work for scalable vectors is to be submitted in a separate patch, as it is a functional change. 4. When building the potential VFs in VPlan. Making the VPlan generic enough to handle scalable vectorization factors is a functional change that needs a separate patch. See for example `void LoopVectorizationPlanner::buildVPlans(unsigned MinVF, unsigned MaxVF)`. 5. The class `IntrinsicCostAttribute`: this class still uses `unsigned VF` as updating the field to use `ElementCount` woudl require changes that could result in changing the behavior of the compiler. Will be done in a separate patch. 7. When dealing with user input for forcing the vectorization factor. In this case, adding support for scalable vectorization is a functional change that migh require changes at command line.
Note that in some places the idiom
``` unsigned VF = ... auto VTy = FixedVectorType::get(ScalarTy, VF) ```
has been replaced with
``` ElementCount VF = ... assert(!VF.Scalable && ...); auto VTy = VectorType::get(ScalarTy, VF) ```
The assertion guarantees that the new code is (at least in debug mode) functionally equivalent to the old version. Notice that this change had been possible because none of the methods that are specific to `FixedVectorType` were used after the instantiation of `VTy`.
Reviewed By: rengolin, ctetreau
Differential Revision: https://reviews.llvm.org/D85794
show more ...
|