mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[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:
parent
d3333eef26
commit
2d7a8bc6d4
@ -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());
|
||||
|
22
test/CodeGen/AArch64/sve-pseudos-expand-undef.mir
Normal file
22
test/CodeGen/AArch64/sve-pseudos-expand-undef.mir
Normal 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
|
||||
|
||||
...
|
Loading…
x
Reference in New Issue
Block a user