[CodeGen][AArch64][SVE] Fold [rdffr, ptest] => rdffrs; bugfix for optimizePTestInstr
authorPeter Waller <peter.waller@arm.com>
Tue, 27 Apr 2021 12:29:42 +0000 (12:29 +0000)
committerPeter Waller <peter.waller@arm.com>
Wed, 12 May 2021 14:06:22 +0000 (15:06 +0100)
commit3fa6510f6ea0101c70592487074957bb1cde576c
treee3c052b4e3bc2d7151e38f1312270fc6e90352ce
parent892c56eabe250acaeb761eaddf783f47d95f7f4d
[CodeGen][AArch64][SVE] Fold [rdffr, ptest] => rdffrs; bugfix for optimizePTestInstr

When a ptest is used to set flags from the output of rdffr, the ptest
can be eliminated, using a flags-setting rdffrs instead.

Additionally, check that nothing consumes flags between rdffr and ptest;
this case appears to have been missed previously.

* There is no unpredicated RDFFRS instruction.
* If substituting RDFFR_PP, require that the mask argument of the
  PTEST matches that of the RDFFR_PP.
* Move some precondition code up inside optimizePTestInstr, so that it
  covers the new code paths for RDFFR which return earlier.
  * Only consider RDFFR, PTEST in same basic block.
  * Check for other flag setting instructions between the two, abort if
    found.
  * Drop an old TODO comment about removing dead PTEST instructions.

RDFFR_P to follow in later patch.

Differential Revision: https://reviews.llvm.org/D101357
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
llvm/test/CodeGen/AArch64/sve-ptest-removal-rdffr.mir [new file with mode: 0644]