[SVE] Fix invalid assert in expand_DestructiveOp.

AArch64ExpandPseudo::expand_DestructiveOp contains an assert to
ensure the destructive operand's register is unique.  However,
this is only required when psuedo expansion emits a movprfx.

A simple example when a movprfx is not required is
  Z0 = FADD_ZPZZ_UNDEF_S P0, Z0, Z0
which expands to an unprefixed FADD_ZPmZ_S instruction.

This patch moves the assert to the places where a movprfx is emitted.

Differential Revision: https://reviews.llvm.org/D83029
This commit is contained in:
Paul Walker 2020-07-04 09:17:53 +00:00
parent 15a60fe09f
commit 7356b4243a
2 changed files with 28 additions and 2 deletions

View File

@ -438,8 +438,6 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
DOPRegIsUnique = true;
break;
}
assert (DOPRegIsUnique && "The destructive operand should be unique");
#endif
// Resolve the reverse opcode
@ -483,6 +481,9 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
//
MachineInstrBuilder PRFX, DOP;
if (FalseZero) {
#ifndef NDEBUG
assert(DOPRegIsUnique && "The destructive operand should be unique");
#endif
assert(ElementSize != AArch64::ElementSizeNone &&
"This instruction is unpredicated");
@ -495,6 +496,9 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
// After the movprfx, the destructive operand is same as Dst
DOPIdx = 0;
} else if (DstReg != MI.getOperand(DOPIdx).getReg()) {
#ifndef NDEBUG
assert(DOPRegIsUnique && "The destructive operand should be unique");
#endif
PRFX = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(MovPrfx))
.addReg(DstReg, RegState::Define)
.addReg(MI.getOperand(DOPIdx).getReg());

View File

@ -0,0 +1,22 @@
# RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -run-pass=aarch64-expand-pseudo -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s
---
name: add_x
alignment: 4
tracksRegLiveness: true
liveins:
- { reg: '$p0' }
- { reg: '$z0' }
frameInfo:
maxCallFrameSize: 0
body: |
bb.0:
liveins: $p0, $z0
; CHECK: add_x
; CHECK-NOT: MOVPRFX
; CHECK: $z0 = FADD_ZPmZ_S renamable $p0, killed $z0, renamable $z0
; CHECK-NEXT: RET
renamable $z0 = FADD_ZPZZ_UNDEF_S renamable $p0, renamable $z0, killed renamable $z0
RET_ReallyLR
...