[RISCV][InsertVSETVLI] Avoid vmv.s.x SEW toggle if at start of block
vmv.s.x and friends that only write to the first destination element can use any SEW greater than or equal to its original SEW, provided that it's writing to an implicit_def operand where we can clobber the other lanes. We were already handling this in needVSETVLI, which meant that when scanning the instructions from top to bottom we could detect this and avoid the toggle: ``` vsetivli zero, 4, e64, mf2, ta, ma li a0, 11 vsetivli zero, 1, e8, mf8, ta, ma vmv.s.x v0, a0 -> vsetivli zero, 4, e64, mf2, ta, ma li a0, 11 vmv.s.x v0, a0 ``` The issue that this patch aims to solve is whenever vmv.s.x arises when the first vector instruction in the block and doesn't have any prior predecessor info: ``` entry_bb: li a0, 11 ; No previous state here: forced to set VL/VTYPE vsetivli zero, 1, e8, mf8, ta, ma vmv.s.x v0, a0 vsetivli zero, 4, e16, mf2, ta, ma vmerge.vvm v8, v9, v8, v0 ``` doLocalPostpass can work backwards from bottom to top and work out if an earlier vsetvli can be mutated to avoid a toggle. It uses DemandedFields and getDemanded for this, which previously didn't take into account the possibility of going to a larger SEW. This patch adds a third option for SEW in DemandedFields, that's weaker than demanded but stronger than not demanded, that states that it the new SEW must be greater than or equal to the current SEW. We can then use this option to move that vmv.s.x specific logic from needVSETVLI into getDemanded, making it available for both phase 2 and 3, i.e. we can now mutate the earlier vsetivli going from bottom to top: ``` entry_bb: li a0, 11 ; Previous vsetivli mutated: second one deleted vsetivli zero, 4, e16, mf2, ta, ma vmv.s.x v0, a0 vmerge.vvm v8, v9, v8, v0 ``` Reviewed By: reames Differential Revision: https://reviews.llvm.org/D151561
Loading
Please sign in to comment