HomePhabricator

Refactor setAlreadyUnrolled() and setAlreadyVectorized().

Description

Refactor setAlreadyUnrolled() and setAlreadyVectorized().

Loop::setAlreadyUnrolled() and
LoopVectorizeHints::setLoopAlreadyUnrolled() both add loop metadata that
stops the same loop from being transformed multiple times. This patch
merges both implementations.

In doing so we fix 3 potential issues:

  • setLoopAlreadyUnrolled() kept the llvm.loop.vectorize/interleave.* metadata even though it will not be used anymore. This already caused problems such as http://llvm.org/PR40546. Change the behavior to the one of setAlreadyUnrolled which deletes this loop metadata.
  • setAlreadyUnrolled() used to create a new LoopID by calling MDNode::get with nullptr as the first operand, then replacing it by the returned references using replaceOperandWith. It is possible that MDNode::get would instead return an existing node (due to de-duplication) that then gets modified. To avoid, use a fresh TempMDNode that does not get uniqued with anything else before replacing it with replaceOperandWith.
  • LoopVectorizeHints::matchesHintMetadataName() only compares the suffix of the attribute to set the new value for. That is, when called with "enable", would erase attributes such as "llvm.loop.unroll.enable", "llvm.loop.vectorize.enable" and "llvm.loop.distribute.enable" instead of the one to replace. Fortunately, function was only called with "isvectorized".

Differential Revision: https://reviews.llvm.org/D57566

Details

Committed
MeinersburFeb 11 2019, 11:45 AM
Differential Revision
D57566: Refactor setAlreadyUnrolled() and setAlreadyVectorized().
Parents
rL353737: [NFC] Re-enable XFAILed fuzzer test on iOS
Branches
Unknown
Tags
Unknown