[LoopVectorize] Enable strict reductions when allowReordering() returns false
authorKerry McLaughlin <kerry.mclaughlin@arm.com>
Wed, 26 May 2021 10:59:04 +0000 (11:59 +0100)
committerKerry McLaughlin <kerry.mclaughlin@arm.com>
Wed, 26 May 2021 12:59:12 +0000 (13:59 +0100)
commit9f76a8526010015fc3e5046fb2c5925000ac45a4
treeba8be78b0a426b89166a49278c2189927d72d54c
parentbe1a23203b1de655b8c7dac7549818d975a0cbbf
[LoopVectorize] Enable strict reductions when allowReordering() returns false

When loop hints are passed via metadata, the allowReordering function
in LoopVectorizationLegality will allow the order of floating point
operations to be changed:

  bool allowReordering() const {
    // When enabling loop hints are provided we allow the vectorizer to change
    // the order of operations that is given by the scalar loop. This is not
    // enabled by default because can be unsafe or inefficient.

The -enable-strict-reductions flag introduced in D98435 will currently only
vectorize reductions in-loop if hints are used, since canVectorizeFPMath()
will return false if reordering is not allowed.

This patch changes canVectorizeFPMath() to query whether it is safe to
vectorize the loop with ordered reductions if no hints are used. For
testing purposes, an additional flag (-hints-allow-reordering) has been
added to disable the reordering behaviour described above.

Reviewed By: sdesmalen

Differential Revision: https://reviews.llvm.org/D101836
llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h
llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/test/Transforms/LoopVectorize/AArch64/scalable-strict-fadd.ll
llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll