Skip to content

Commit

Permalink
[SVE] Fix invalid assert in expand_DestructiveOp.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
paulwalker-arm committed Jul 4, 2020
1 parent 15a60fe commit 7356b42
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
8 changes: 6 additions & 2 deletions llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -438,8 +438,6 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
DOPRegIsUnique = true;
break;
}

assert (DOPRegIsUnique && "The destructive operand should be unique");
#endif

// Resolve the reverse opcode
Expand Down Expand Up @@ -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");

Expand All @@ -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());
Expand Down
22 changes: 22 additions & 0 deletions llvm/test/CodeGen/AArch64/sve-pseudos-expand-undef.mir
Original file line number Diff line number Diff line change
@@ -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
...

0 comments on commit 7356b42

Please sign in to comment.